Необъяснимая 'неопределенная' переменная таймера, вызывающая TypeError - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь запустить циклический таймер в Phaser следующим образом в функции create() моего состояния Game.js:

    var jackpotTimer = new Phaser.Timer(this.game);
    jackpotTimer.loop(500, function () {
        this.jackpotSignal.dispatch(this.game.rnd,integerInRange(1000, 3000), this.game.rnd.integerInRange(10000, 20000));
    }, this);
    jackpotTimer.start();

Во время выполнения я получаю следующую ошибку:

phaser-split.js:56360 TypeError: Cannot read property 'time' of undefined
at 429.Phaser.Timer.start (phaser-split.js:48661)
at __webpack_exports__.a.initJackpotSocket (RGSCommunicator.js:31)
at __webpack_exports__.b.create (Game.js:117)
at 429.Phaser.StateManager.loadComplete (phaser-split.js:8143)
at 429.Phaser.Loader.finishedLoading (phaser-split.js:55895)
at 429.Phaser.Loader.processLoadQueue (phaser-split.js:55847)
at 429.Phaser.Loader.asyncComplete (phaser-split.js:55923)
at 429.Phaser.Loader.jsonLoadComplete (phaser-split.js:56840)
at XMLHttpRequest.xhr.onload (phaser-split.js:56345)

Разрывающаяся строка в Phaser.Timer.start выглядит следующим образом:

this._started = this.game.time.time + (delay || 0);

Используя отладчик chrome, я безоговорочно подтвердил, что на момент ошибки:

  1. this.game правильно определен и может быть исследован в окне «области действия»
  2. this.game имеет определенное свойство time.time, которое можно найти, исследуя this.game в области действияwindow
  3. при наведении мыши на time in this.game.time в окне исходного кода выдает «undefined».
  4. Ошибка вызвана приведенным выше экземпляром таймера.

Я в курсе, что может быть причиной этого.Кто-нибудь видел это раньше?

Я использую стек Phaser-ES6-Webpack с Phaser CE 2.9.4

1 Ответ

0 голосов
/ 21 декабря 2018

Я нашел синтаксис, который не нарушается и выполняется правильно:

var self = this;        
game.time.events.loop(500, function () {
        self.jackpotSignal.dispatch(game.rnd.integerInRange(1000, 3000), 
game.rnd.integerInRange(10000, 20000));
        console.log("looped");
}, this);

Кажется, что здесь ключ ссылается на game вместо this.game, так как эта переменная, кажется, занимает особое место в phaserэто довольно необычно в javascript, поскольку обычно требует явных ссылок.Все еще задаюсь вопросом о необычном поведении, наблюдаемом в отладчике ...

...