如何在Phaser的更新方法中正确设置计数器?

时间:2017-04-29 14:01:46

标签: javascript html5 phaser-framework

我是Phaser的新手。代码片段如下,此处的collisionCnt全局初始化为0:

  update: function() {

      this.collisionChecker = this.physics.arcade.collide(this.ground, this.rainGroup, this.over, this.overCheck, this);     //checks for collision between rain drops and ground
      this.physics.arcade.collide(this.rainGroup, this.rainGroup);      //checks for collision between rain drops


  },

  overCheck: function() {
      collisionCnt++;
      if(collisionCnt == 4) {
        console.log(collisionCnt);
        return true;
      }
      else {
        console.log(collisionCnt);
        return false;
      }
  },

  over: function() {
    this.state.start('gameOver');
  }

问题是更新方法持续监视碰撞实例并连续返回true,导致单个碰撞事件的collisionCnt变为等于4。我需要至少4个rainGroup组对象才能在游戏结束前触地。欢迎所有帮助,并提前感谢:)

1 个答案:

答案 0 :(得分:1)

解决这个问题的一种方法是给你的雨滴提供一个属性,表示它们是否碰撞或碰到地面。然后在检查中查看该属性是否已设置,以及是否未增加计数器并设置属性。

created a full JSFiddle as a working example但您的代码中的相关代码更改可能是这样的:

this.collisionChecker = this.physics.arcade.collide(this.ground, this.rainGroup, this.over);     //checks for collision between rain drops and ground

over: function(ground, rainDrop) {
    if (!rainDrop.hasTouchedGround) {
        collisionCnt++;
        rainDrop.hasTouchedGround = true;
        if (collisionCnt >= 4) {
            this.state.start('gameOver');
        }
    }
}

第二种选择是在接触地面时杀死雨滴。这使事情变得更容易,但会从显示中删除精灵。

over: function(ground, rainDrop) {
    collisionCnt++;
    rainDrop.kill();
    if (collisionCnt >= 4) {
        this.state.start('gameOver');
    }
}

JSFiddle example showing this option