2015-06-09 2 views
1

У меня возникла проблема, когда мне нужно сбросить событие 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(), как показано выше.

ответ

0

Все, что я должен был сделать реализовать простой счетчик, сохраняя пробел и указатель от получения переназначены, например, так:

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

game.input.onDown активируется с помощью мыши и сенсорного ввода. Если вам нужно сбросить свой обратный вызов после каждого вызова, вы можете просто использовать game.input.onDown.addOnce() (вместо game.input.onDown.add()), чтобы обратный вызов удалялся автоматически после первого запуска.

+0

Единственная проблема с этим является то, что мне нужно, чтобы моя игра быть интерактивными/touchable более одного раза. Я просто нуждаюсь в обратном вызове, а после некоторого момента ничего не очищается. Спасибо, однако, ваш ответ, кажется, на правильном пути для того, что мне нужно. – GDP2

+1

Ах, извините за мое недоразумение. Я думаю, вы можете использовать 'game.input.onDown.removeAll()', а затем, когда вы решите - это приведет к удалению всех слушателей из события onDown. В качестве альтернативы вы можете использовать 'game.input.remove (listener)' где 'listenener' - это имя функции прослушивателя, хотя я подозреваю (естественно), что у этого нет возможности работать с анонимными функциями. –

+0

Ну, опять же, вы дали мне хорошую идею о том, как это исправить. Методы 'remove' и' removeAll' не совсем работали, когда я пытался использовать их в моем проекте, но метод 'game.input.onDown.dispose()' действительно работал, и я смог устранить проблему. Вот мой обновленный исходный код для примера: https://gist.github.com/ylluminarious/0c14293e4b41cf41d4da#file-main-js-L44-L53. – GDP2

Смежные вопросы