У меня возникла проблема, когда мне нужно сбросить событие game.input.onDown
так же, как Phaser.Key.reset. Кажется, что это можно выполнить с помощью метода Phaser.Pointer.reset. К сожалению, похоже, в классе Phaser.Input имеется множество различных объектов-указателей, и я не уверен, какой из них мне нужно использовать для game.input.onDown
, который says that it gets "dispatched each time a pointer is pressed down". Я просто не уверен, какой указатель мне нужно использовать. Может кто-нибудь пролить некоторый свет на это?Какой объект указателя (т. Е. Курсор) использовать при сбросе game.input.onDown
Я предполагаю, что эффективно нужно сделать что-то вроде этого:
this.game.input.whicheverPointer.reset();
EDIT:
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);
}
Как вам может прочитать в моих комментариях выше, проблема в том, что событие click/touch k eeps получает jumpOrTryAgain
callback, добавленный в себя, поскольку create
получает рекурсивно вызывается при перезагрузке игры. Мне нужен способ сбросить событие click/touch, похожее на spacebar.reset()
, как показано выше.
Единственная проблема с этим является то, что мне нужно, чтобы моя игра быть интерактивными/touchable более одного раза. Я просто нуждаюсь в обратном вызове, а после некоторого момента ничего не очищается. Спасибо, однако, ваш ответ, кажется, на правильном пути для того, что мне нужно. – GDP2
Ах, извините за мое недоразумение. Я думаю, вы можете использовать 'game.input.onDown.removeAll()', а затем, когда вы решите - это приведет к удалению всех слушателей из события onDown. В качестве альтернативы вы можете использовать 'game.input.remove (listener)' где 'listenener' - это имя функции прослушивателя, хотя я подозреваю (естественно), что у этого нет возможности работать с анонимными функциями. –
Ну, опять же, вы дали мне хорошую идею о том, как это исправить. Методы 'remove' и' removeAll' не совсем работали, когда я пытался использовать их в моем проекте, но метод 'game.input.onDown.dispose()' действительно работал, и я смог устранить проблему. Вот мой обновленный исходный код для примера: https://gist.github.com/ylluminarious/0c14293e4b41cf41d4da#file-main-js-L44-L53. – GDP2