Phaser 3:向回调函数添加参数(时间事件,键盘事件)

问题描述 投票:0回答:1

我正在使用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};
    }

}

现在,我正试图通过创建的一个叫做“锤子”的物体来伤害我的整个(英语实体)。但是我希望能够受到许多不同对象的伤害。当我按“ P”和/或每1秒时,我会尝试使其受伤。但是我找不到如何让回调函数让我希望实体受到伤害的对象。

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)

我知道如何避免回调函数,但是如果我可以给那些回调函数提供所需的参数,那将是最简单的。我一直在互联网上潜伏寻找解决方案,但都没有用。有人似乎在使用console.log(),但我不明白为什么和如何使用。

感谢您考虑我的问题!

Sheolis

javascript callback keyboard arguments phaser
1个回答
0
投票

我想args应该只是[this.hammer],因为我们不需要joueur作为hurt函数的输入

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

您也可以在callbackScope上查看docs

© www.soinside.com 2019 - 2024. All rights reserved.