为什么打字稿在移相器中找不到那些方法?

问题描述

我已经用Phaser和打字稿开始了一个小游戏。

我有一个对绑定有反应的对象:

export default class Park extends Phaser.Physics.Arcade.Sprite {
  poweredUp = true
  constructor(scene: Phaser.Scene,parkName: string,toggleKey: string) {
    super(scene,scene.cameras.main.width / 2,scene.cameras.main.height / 2,parkName)
    scene.add.existing(this)
    scene.physics.add.existing(this)
    scene.input.keyboard.on('keyup-' + toggleKey,this.togglePower)
  }

  togglePower() {
    console.log('toggle')
    if (this.poweredUp) {
      this.powerOff()
    } else {
      this.powerOn()
    }
    this.poweredUp = !this.poweredUp
  }

  powerOff() {
    this.tint = 0xf54242
  }

  powerOn() {
    this.clearTint()
  }
}

当我按下键时,我得到一个错误

Uncaught TypeError: this.powerOn is not a function
    at Keyboardplugin../src/scripts/objects/park.ts.Park.togglePower 

但是我不明白,在我看来,该函数定义良好。因为相位器我缺少什么吗?

编辑,如果我在togglePower中打印this,则看来我得到了Keyboardplugin。我应该怎么做才能访问我的对象?

解决方法

好吧。我了解,与移相器无关:

您必须按照以下说明绑定事件: TypeScript - How to access the class instance from event handler method

因此,就我而言,我需要具备以下条件:

scene.input.keyboard.on('keyup-' + toggleKey,this.togglePower)

转换成这样:

scene.input.keyboard.on('keyup-' + toggleKey,()=>this.togglePower())
,

如果您不发送上下文作为参数,则togglePower()方法内的所有KeyboardPlugin关键字都将引用this对象(或任何其他内置脚本),

因此您需要将对象作为上下文参数(第三个参数)发送,而您只需要为第三个参数键入this,因为构造函数中的scene.input.keyboard.on('keyup-' + toggleKey,this.togglePower,this); 关键字仍在引用到你自己的对象。

var yourObject = this;
scene.input.keyboard.on('keyup-' + toggleKey,yourObject);

或者为了使您更容易理解,可以先将对象保存为变量,然后再将其作为参数发送。

top_n_feed