问题描述
我已经用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