Phaser 3: Добавить аргументы в функции обратного вызова (событие времени, событие клавиатуры) - PullRequest
0 голосов
/ 16 апреля 2020

Я занимаюсь разработкой игры для Phaser 3 и в настоящее время борюсь за использование функции обратного вызова. Я создал два класса, один с именем "Entitee", а другой с именем "objet"

class Entitee extends Phaser.Physics.Arcade.Sprite{
    constructor(scene, x, y, pv, mana, speed, poise, asset){
    //Private
        var _pv = pv;
        var _pvMax = pv;
        var _mana = mana;
        var _manaMax = mana;
        var _speed = speed;
        var _poise = poise;
        var _asset = asset;

        super(scene, x, y, _asset);

        scene.add.existing(this);
        scene.physics.world.enableBody(this);
    //Public

        this.hurt = function(objet){
              console.log(_pv);
              console.log(objet);
              _pv += objet.getPvMod();
              console.log(_pv);
        }
    }//END CONSTRUCTOR
}

class Objet {
    constructor(name, price, range, cd, ammo, lag, pvMod, manaMod, poiseMod, speedMod, animAtt, animZone){
        var _name = name;
          var _price = price;
          var _range = range;
          var _cooldown = cd;
          var _ammo = ammo;
          var _direction;
          var _lag = lag;
          var _pvMod = pvMod;
          var _manaMod = manaMod;
          var _poiseMod = poiseMod;
          var _speedMod = speedMod;
          var _animAtt = animAtt;
          var _animZone = animZone;

        this.getName= function(){ return _name};
        this.getPrice= function(){ return _price};
        this.getRange= function(){ return _range};
        this.getCooldown= function(){ return _cooldown};
        this.getAmmo= function(){return _ammo};
        this.getDirection = function(){return _direction};
        this.getPvMod = function(){return _pvMod};
        this.getManaMod = function(){return _manaMod};
        this.getPoiseMod = function(){return _poiseMod};
        this.getSpeedMod = function(){return _speedMod};
        this.getAnimAtt = function(){return _animAtt};
        this.getAnimZone = function(){return _animZone};
    }

}

Теперь я пытаюсь нанести вред моему entitee (объекту в Engli sh) объектом i создан, называется "молоток". Но я хотел бы быть в состоянии получить боль от многих других объектов. Я пытаюсь причинить боль, когда нажимаю «P» и / или каждые 1 сек c. Но я не могу найти, как дать функции обратного вызова объект, с которым я хочу, чтобы сущность пострадала.

class Scene1 extends Phaser.Scene{
    constructor() {
        super("Scene1")
      }
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> INIT
init(){
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PRELOAD
preload(){
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CREATE
create(){


  this.joueur = new Entitee(this, 100, 100, 100, 10, 200, 42, "square");
  this.hammer = new Objet("Hammer", 12, 12, 12, 12, 0, -10, 0, 10, "empty", "empty");

  this.timer_test = this.time.addEvent({ delay: 1000, callback: this.joueur.hurt, args: [this.joueur, this.hammer], loop: true });


  this.input.keyboard.on('keydown-P', this.joueur.hurt, this.joueur, this.hammer);
  this.joueur.hurt(this.hammer);


}//END CREATE

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UPDATE
update(){
}//END UPDATE

}//END SCENE

у меня работает this.joueur.hurt(this.hammer);.

this.timer_test = this.time.addEvent({ delay: 1000, callback: this.joueur.hurt, args: [this.joueur, this.hammer], loop: true }); вышлите мне следующую ошибку:

Entitee.js:60 Uncaught TypeError: objet.getPvMod is not a function
    at Function.Entitee.hurt (Entitee.js:60)
    at Clock.update (phaser.js:183771)
    at EventEmitter.emit (phaser.js:1774)
    at Systems.step (phaser.js:35504)
    at SceneManager.update (phaser.js:77851)
    at Game.step (phaser.js:139643)
    at TimeStep.step (phaser.js:67227)
    at step (phaser.js:67474)

И когда я нажимаю "p", я получаю

Entitee.js:60 Uncaught TypeError: objet.getPvMod is not a function
    at Entitee.hurt (Entitee.js:60)
    at KeyboardPlugin.emit (phaser.js:1752)
    at KeyboardPlugin.update (phaser.js:166926)
    at EventEmitter.emit (phaser.js:1751)
    at onKeyDown (phaser.js:71462)

Я понимаю, как избежать функций обратного вызова, но было бы так просто, если бы я мог дать этим обратным вызовам аргументы, которые я хочу. Я искал целых 1024 * решений, но ни один из них не был полезен. Некоторые люди, похоже, используют console.log (), но я не могу понять, почему и как.

Спасибо за рассмотрение моей проблемы!

Шеолис

1 Ответ

0 голосов
/ 18 апреля 2020

Я полагаю, что аргументы должны быть просто [this.hammer], поскольку нам не нужно joueur в качестве входных данных для функции hurt

      this.timer_test = this.time.addEvent({ 
                                   delay: 1000, 
                                   callback: this.joueur.hurt, 
                                   args: [this.hammer], 
                                   loop: true });

Вы также можете посмотреть на callbackScope на * документы 1009 *.

...