为什么我的碰撞检测不能在Phaser中工作?

时间:2016-03-29 14:04:27

标签: javascript phaser-framework

为了简单起见,我有一个游戏,我正试图让我的车撞墙。我已经尝试过搜索了,我已经尝试了几种,你会在下面看到,我不知道为什么我不能让它工作。

以下是我create函数中的代码:

    create: function () {
        game.physics.startSystem(Phaser.Physics.ARCADE);

        this.carSprite = game.add.sprite(game.world.centerX, game.world.centerY, 'car');
        game.physics.arcade.enable(this.carSprite);
    this.timer = game.time.events.loop(300,
        this.addRoad, this);
    }

然后在我的update函数中:

    update: function () {
        game.physics.arcade.overlap(this.carSprite, this.wallSprite, this.scoring, null, this);
}

我正在创建这样的wallSprite

 addOneRoadSection: function (x, y) {
this.scoreCalculator += 1;
        if (this.scoreCalculator == 10) {
            this.scoreCalculator = 0;

            this.wallSprite = game.add.sprite(x + 100, y, 'wall');
            game.physics.arcade.enable(this.wallSprite);
            this.wallAnimation = this.wallSprite .animations.add('wallAnimation');
            this.wallSprite.animations.play('wallAnimation', 30, true);
            this.wallSprite.body.velocity.y = 100;
            this.wallSprite.checkWorldBounds = true;
            this.wallSprite.outOfBoundsKill = true;
        }
}

我这样叫addOneRoadSection

    addRoad: function () {
        this.addOneRoadSection(this.xValue, 0);
}
使用addRoadcreate中调用

this.timer

总而言之,这是在scoreCalculator为10时,它增加了一面墙。这样工作正常,墙壁动画很好,但碰撞检测根本不起作用。

我尝试将if语句中的代码移动到我的create函数中,并且它可以在碰撞检测中正常工作(但是其他事情会破坏,所以我无法将其保留在那里)。我究竟做错了什么?我有一种怀疑,因为我平均每秒呼叫this.wallSprite一次,它被新的精灵过度写入,被添加为this.wallSprite但我不完全确定我是怎么回事应该这样做吗?

1 个答案:

答案 0 :(得分:0)

所以我想出来了。发生了什么事情,我最初倾向于我创建一个新的精灵,而不是写另一个精灵是正确的。

以下是我解决问题的方法:

create中的

create: function(){ 
 //Create a wallSprite array
 var wallSprite = [];
}

现在,当我在wallSprite中添加新的addOneRoadSection时,我有一个数组,我可以将物理添加到每个精灵中,如下所示:

   addOneRoadSection: function (x, y) {

            this.wallSprite.push(game.add.sprite(x + 100, y, 'wall'));
            game.physics.arcade.enable(this.wallSprite[this.wallSprite.length -1]);
            this.wallAnimation = this.wallSprite[this.wallSprite.length - 1].animations.add('wallAnimation');
            this.wallSprite[this.wallSprite.length - 1].animations.play('wallAnimation', 30, true);
            this.wallSprite[this.wallSprite.length -1].body.velocity.y = 100;
            this.wallSprite[this.wallSprite.length - 1].checkWorldBounds = true;
            this.wallSprite[this.wallSprite.length -1].outOfBoundsKill = true;
}

最后在update我只需要这样做:

    for (var i = 0; i < this.wallSprite.length; i++) {
        game.physics.arcade.overlap(this.car, this.wallSprite, this.scoring, null, this);
    }

Voila - 碰撞检测适用于每个精灵。