Обнаружение дрожания фазера

Я играл с Phaserjs и Cordova и застрял в чем-то, вероятно, тривиальном. Это более общий вопрос javascript, чем фазер, но я не нашел ответа.

Я использую Cordova-plugin-shake для обнаружения дрожания, и он отлично работает. Что я хотел бы сделать, так это изменить некоторые спрайты onShake ().

Test.Game.prototype = {
	create: function() {
        this.hand = this.game.add.sprite(this.game.world.centerX-36, 27, 'hand');
        this.hand.animations.add('squeeze',[0,1,2,3,4,5,6,5,4,3,2,1,0]);
        this.hand.animations.add('shake',[8,9,10,11,12,13,14,15,16,17,17,8,9,8]);
        this.healthBar = this.game.add.sprite(260, 18, 'utils');
        this.setCapacity(4);
        shake.startWatch(this.onShake, 40);
      },
     onShake: function(){
        console.log("shaked");
        this.hand.animations.play('shake', 60, false);
        this.setCapacity(Math.floor(Math.random() * (MAX_CAPACITY - MIN_CAPACITY + 1)) +  MIN_CAPACITY);
      },
     setCapacity: function(capacity){
        this.healthBar.prevCap = capacity;
        this.healthBar.inCapacity = capacity;
        this.healthBar.capacity = capacity;
        var cropRect = new Phaser.Rectangle(0, 0, healthBarWidth, this.healthBar.height);
        this.healthBar.crop(cropRect);
        this.healthBar.prevWidth = healthBarWidth;
    },
[...]
  
};

Проблема в том, что onShake передается по значению, верно? Так что у меня нет доступа ни к setCapacity (), ни к hand. Как мне этого избежать? Есть ли какие-нибудь уроки / примеры, где я могу прочитать?

Спасибо за ваше время и извините за такой тривиальный вопрос, но я все еще новичок в js.


person Papadopoulos George    schedule 23.10.2015    source источник
comment
Описание тега «Phaser» говорит мне, что это инструмент в Java 7. Как этот тег соотносится с вопросом JavaScript?   -  person feeela    schedule 23.10.2015
comment
нет, это phaser.js, игровой фреймворк на JavaScript.   -  person Papadopoulos George    schedule 23.10.2015
comment
Тогда это был неправильный тег - я заменил его на тег JS frameworks.   -  person feeela    schedule 23.10.2015
comment
извините, не заметил, что у него другой тег   -  person Papadopoulos George    schedule 23.10.2015


Ответы (1)


Вы должны уметь это делать

shake.startWatch(this.onShake.bind(this), 40);

Метод bind используется для присоединения контекста к новой функции

Или, если вы не можете использовать привязку, вы можете закрыть

 shake.startWatch((function(game){
     return function(){
         game.onShake();
     };
 })(this), 40);
person Hacketo    schedule 23.10.2015
comment
привязка работала нормально! Спасибо, что сообщили мне о закрытии! - person Papadopoulos George; 23.10.2015