在不施加力的情况下,使用p2旋转约束连接2个相位器精灵

Connect 2 phaser sprites using p2 revolute constraints without apply force

本文关键字:2个 连接 约束 精灵 旋转 p2 施加力 情况下 使用      更新时间:2023-09-26

所以我有一些精灵,我想使用p2.js的revolute约束来连接它们。我当前的实现在创建约束后立即对精灵应用力
如何避免这种行为

如果无法避免,是否有其他方法将两个精灵水平连接

编辑:

var Game = {
preload: function() {
    game.load.image('tree00', './imgs/tree/tree-00.png');
    game.load.image('tree01', './imgs/tree/tree-01.png');
    game.load.image('tree02', './imgs/tree/tree-02.png');
    game.load.image('tree03', './imgs/tree/tree-03.png');
    game.load.image('tree04', './imgs/tree/tree-04.png');
    game.load.image('tree05', './imgs/tree/tree-05.png');
    game.load.spritesheet('present', './imgs/dude.png', 32, 48);
},
create: function() {
    game.physics.startSystem(Phaser.Physics.P2JS);
    game.physics.p2.gravity.y = 300;
    game.physics.startSystem(Phaser.Physics.ARCADE);
    game.stage.backgroundColor = '#aaffee';
    treeCollsionGroup = game.physics.p2.createCollisionGroup();
    presentCollisionGroup = game.physics.p2.createCollisionGroup();
    this.createPresent(game.world.width * 0.21, game.world.height * 0.6);
    this.createTree(6, game.world.width * 0.2, game.world.height * 0.8);
    //presentCollisionGroup.collides(treeCollsionGroup);
    connection[0] = game.physics.p2.createRevoluteConstraint(treeParts[treeParts.length - 1], [(treeParts[treeParts.length - 1].width)/2, treeParts[treeParts.length - 1].height], present, [-present.width/2, treeParts[treeParts.length - 1].height], maxForce);
    connection[1] = game.physics.p2.createRevoluteConstraint(treeParts[treeParts.length - 1], [(treeParts[treeParts.length - 1].width)/2, 0], present, [-present.width/2, 0], maxForce);
}, 
createTree: function(length, xAnchor, yAnchor) {
    var lastSprite;
    for (var i = 0; i < length; i++) {          
        newSprite = game.add.sprite(xAnchor, yAnchor - i*100, 'tree0' + i);
        newSprite.scale.x = game.world.width/1920;
        newSprite.scale.y = game.world.width/1920;
        game.physics.p2.enable(newSprite, true);
        if (i != length-1) {
            newSprite.body.setRectangle(game.world.width * 0.10, newSprite.height * 0.15);
        } else {
            newSprite.body.setRectangle(newSprite.width * 0.8, newSprite.height * 0.8);
        }
        newSprite.body.setCollisionGroup(treeCollsionGroup);
        if(i === 0) {
            newSprite.body.static = true;
        }
        if (lastSprite) {
            switch(i) {
                case 1: constraint = game.physics.p2.createRevoluteConstraint(newSprite, [0, 0], lastSprite, [0, -lastSprite.height * 0.62], maxForce);
                        treeConstraints.push(constraint);
                        break;
                case 2: constraint = game.physics.p2.createRevoluteConstraint(newSprite, [0, 0], lastSprite, [0, -lastSprite.height * 0.285], maxForce);
                        treeConstraints.push(constraint);
                        break;
                case 3: constraint = game.physics.p2.createRevoluteConstraint(newSprite, [0, 0], lastSprite, [0, -lastSprite.height * 0.425], maxForce);
                        treeConstraints.push(constraint);
                        break;
                case 4: constraint = game.physics.p2.createRevoluteConstraint(newSprite, [0, 0], lastSprite, [0, -lastSprite.height * 0.4], maxForce);
                        treeConstraints.push(constraint);
                        break;
                case 5: constraint = game.physics.p2.createRevoluteConstraint(newSprite, [0, 0], lastSprite, [0, -lastSprite.height * 0.55], maxForce);
                        treeConstraints.push(constraint);
                        break;
            }
        }
        lastSprite = newSprite;
        treeParts.push(newSprite);
        newSprite.body.collides(treeCollsionGroup);
    }
},
createPresent: function(xAnchor, yAnchor) {
    present = game.add.sprite(game.world.width * 0.21, game.world.height * 0.6, 'present');
    game.physics.p2.enable(present, true);
    present.scale.x = game.world.width/1920;
    present.scale.y = game.world.width/1920;
    present.body.setRectangle(present.width, present.height);
    present.body.data.gravityScale = 0;
    present.body.setCollisionGroup(presentCollisionGroup);
}
}



我删掉了不太重要的代码,这样就不会太多了(已经是了)
基本上我所做的是:我创建一棵树,并使用旋转约束连接零件,使它们在现实世界中表现得像一棵树(例如在风中)
然后我创建了一个礼物,它基本上是一个精灵,应该水平连接到树的顶部。因此,我使用2个旋转约束,一个用于精灵之间的最顶部点,另一个用于最底部点。(我知道这是一种肮脏的代码)

在我创建了这些约束并且当前连接到树的顶部之后,树开始摇晃和折叠(就像它应该的那样)。但我不希望这种行为
也许锁定约束是我想要的,我必须对此进行研究

编辑2:
在查看了锁定约束之后,我意识到这就是我想要的。但即使是锁定约束也会使树崩溃。

我真的不能理解你的问题,但你尝试过Prismatic甚至Lock Constraint吗?可以给我们一些代码,甚至代码笔的例子,这样我们可以更好地帮助你吗?