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

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

本文关键字:对象 指针 光标 input game onDown 重置      更新时间:2023-09-26

我遇到了一个问题,我需要以与Phaser.Key.reset相同的方式重置game.input.onDown事件。似乎这是可行的Phaser.Pointer.reset方法。不幸的是,似乎有一堆不同的潜在指针对象在相位器。输入类,我不确定我需要为game.input.onDown使用哪一个,它说它"每次按下指针时都被调度"。我只是不确定该用哪个指针。有人能解释一下吗?

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

this.game.input.whicheverPointer.reset();
编辑:

这是一个模拟我遇到的问题的例子。

下面是它的源代码:

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);
}