重置时使用哪个指针对象(即光标)game.input.onDown

Which pointer object (i.e., cursor) to use when resetting game.input.onDown

我遇到了一个问题,我需要以与 Phaser.Key.reset. It seems like this is doable with the Phaser.Pointer.reset method. Unfortunately, there seems to be a bunch of different potential pointer objects in the Phaser.Input class, and I'm not sure which one I need to use for game.input.onDown, which says that it gets "dispatched each time a pointer is pressed down" 相同的方式重置 game.input.onDown 事件。我只是不确定我需要使用哪个指针。任何人都可以阐明这一点吗?

我想我实际上需要做这样的事情:

this.game.input.whicheverPointer.reset();

编辑:

Here is an example that mimics the the problem I'm having.

这是它的源代码:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, "game", {preload: preload, create: create, update: update});

var dude;
var block;
var spacebar;
var gameOverText;

var gameOverCounter = 0;
var gameOverBool    = false;

function preload () {
  game.load.image("block", "assets/block.png");
  game.load.image("dude", "assets/phaser-dude.png");
}

function create () {
  dude  = game.add.sprite(373, 760, "dude");
  block = game.add.sprite(0, 505, "block");

  game.physics.arcade.enable(dude);
  game.physics.arcade.enable(block);

  dude.body.collideWorldBounds  = true;
  dude.body.gravity.y           = 200;

  block.body.collideWorldBounds = true;
  block.body.immovable          = true;

  block.body.velocity.x         = 100;
  block.body.bounce.x           = 1;

  spacebar = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);

  var jumpOrTryAgain = function () {
    if (gameOverBool === false) {
      dude.body.velocity.y = -250;
      // If you open up your JS / error console, you'll see that
      // this message gets printed an extra time each reset,
      // when you click. The spacebar doesn't have this problem
      // because of the `spacebar.reset()` call below.
      console.log("down");
    } else {
      dude.destroy();
      block.destroy();
      gameOverText.destroy();
      // Here, I can reset the spacebar, but I'm not sure what to do
      // for the click / touch event, which keeps getting the jumpOrTryAgain
      // callback added onto it.
      spacebar.reset();

      gameOverBool    = false;
      gameOverCounter = 0;

      create();
    }
  };

  game.input.onDown.add(jumpOrTryAgain);
  spacebar.onDown.add(jumpOrTryAgain);
}

function update () {

  function gameOver () {
    if (gameOverCounter === 0) {
      gameOverBool = true;
      dude.body.velocity.y  = 0;
      dude.body.velocity.x  = 0;
      block.body.velocity.x = 0;
      gameOverText = game.add.text(300, 200, "Game Over!", {fontSize: "16px", fill: "white"});
      gameOverCounter += 1;
    }
  }

  game.physics.arcade.collide(dude, block, gameOver);
}

正如您在我上面的评论中看到的那样,问题是点击/触摸事件不断将 jumpOrTryAgain 回调添加到自身,因为 create 在您重置游戏时被递归调用。我需要一种重置点击/触摸事件的方法,类似于上面看到的spacebar.reset()

game.input.onDown 由鼠标和触摸输入触发。如果您需要在每次调用后重置其回调,您可以只使用 game.input.onDown.addOnce()(而不是 game.input.onDown.add()),以便在第一个 运行.

后自动删除回调

我所要做的就是实现一个简单的计数器来防止空格键和指针被重新分配,就像这样:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, "game", {preload: preload, create: create, update: update});

var dude;
var block;
var spacebar;
var gameOverText;

var gameOverCounter = 0;
var gameOverBool    = false;

var downCounter = 0;

function preload () {
  game.load.image("block", "assets/block.png");
  game.load.image("dude", "assets/phaser-dude.png");
}

function create () {
  dude  = game.add.sprite(373, 760, "dude");
  block = game.add.sprite(0, 505, "block");

  game.physics.arcade.enable(dude);
  game.physics.arcade.enable(block);

  dude.body.collideWorldBounds  = true;
  dude.body.gravity.y           = 200;

  block.body.collideWorldBounds = true;
  block.body.immovable          = true;

  block.body.velocity.x         = 100;
  block.body.bounce.x           = 1;

  var jumpOrTryAgain = function () {
    if (gameOverBool === false) {
      dude.body.velocity.y = -250;

      console.log("down");
    } else {
      dude.destroy();
      block.destroy();
      gameOverText.destroy();

      gameOverBool    = false;
      gameOverCounter = 0;

      create();
    }
  };

  if (downCounter === 0) {
    spacebar = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);
    game.input.onDown.add(jumpOrTryAgain);
    spacebar.onDown.add(jumpOrTryAgain);
    downCounter += 1;
  }
}

function update () {

  function gameOver () {
    if (gameOverCounter === 0) {
      gameOverBool = true;
      dude.body.velocity.y  = 0;
      dude.body.velocity.x  = 0;
      block.body.velocity.x = 0;
      gameOverText = game.add.text(300, 200, "Game Over!", {fontSize: "16px", fill: "white"});
      gameOverCounter += 1;
    }
  }

  game.physics.arcade.collide(dude, block, gameOver);
}