Phaser.Signal: слушатель является обязательным параметром add () и должен быть функцией - PullRequest
0 голосов
/ 11 октября 2019

В настоящее время я использую Phaser 2.x. Проблема в методе create. Я передаю функцию в качестве аргумента методу this.claimButton.events.onInputDown.add(). Но он не может сослаться на функцию, на которую я сейчас ссылаюсь. Что я могу сделать для этого.

Я пробовал с this.game.claimTicket() и this.game.claimTicket, а также пробовал this.claimTicket в this.claimButton.events.onInputDown.add() в качестве параметра. Но я все еще получаю сообщение об ошибке: Uncaught Error: Phaser.Signal: слушатель является обязательным параметром add () и должен быть функцией. Но когда я пытался this.claimButton.events.onInputDown.add(function () { console.log('hello') }) Это работало просто отлично.

var GameState = {
    //initiate game settings
    init: () => {
        //adapt to screen size, fit all the game
        this.game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
        this.game.scale.pageAlignHorizontally = true;
        this.game.scale.pageAlignVertically = true;
    },
    preload: () => {
        this.game.load.image('background', 'assets/images/background.jpg')
        this.game.load.image('ticket', 'assets/images/ticket2.jpg')
        this.game.load.image('claimButton', 'assets/images/claimButton.png')
    },
    create: () => {
        this.background = this.game.add.sprite(0, 0, 'background')
        this.ticket = this.game.add.sprite(this.game.world.centerX, 130, 'ticket')
        this.ticket.anchor.setTo(0.5)
        this.claimButton = this.game.add.sprite(this.game.world.centerX + 180, 125, 'claimButton')
        this.claimButton.anchor.setTo(0.5);

        this.claimButton.inputEnabled = true;
        this.claimButton.input.pixelPerfectClick = true;
        //this.claimButton.events.onInputDown.add(function () { console.log('It worked as I expected') })
        this.claimButton.events.onInputDown.add(this.game.claimTicket,this)
    },
    claimTicket: (sprite) => {
        console.log('claimed')
    }

};

//initiate the Phaser framework
var game = new Phaser.Game(640, 360, Phaser.AUTO);

game.state.add('GameState', GameState);
game.state.start('GameState');

Я ожидал, что функция claimTicket будет вызываться изнутри this.claimButton.events.onInputDown.add(), но она показывает ошибку

1 Ответ

1 голос
/ 11 октября 2019

это потому, что this привязка функции стрелки.

this внутри GameState.create - это внешняя область (вероятно, глобальная)


Просто не используйтефункция стрелки здесь.

let GameState = {
    ...
    create(){
        ...
    },
    ...
}

или

let GameState = {
    ...
    create:function(){
        ...
    },
    ...
}
...