我刚刚开始使用phaser JS进行游戏开发,但遇到了一个奇怪的问题,我需要一些帮助。
让我展示我的代码并解释出现问题的地方:
class SimpleGame {
game: Phaser.Game;
csvTM: string;
constructor (csvTM: string) {
this.csvTM = csvTM;
this.game = new Phaser.Game(800, 600, Phaser.AUTO, 'content', { preload: this.preload, create: this.create });
}
test() {
console.log("map test: " + this.csvTM);
}
preload() {
console.log("map preload: " + this.csvTM);
this.game.load.image('logo', 'empty_room.png');
this.game.load.tilemap("ItsTheMap", this.csvTM, null, Phaser.Tilemap.CSV);
this.game.load.image("Tiles", "concrete.png");
}
create() {
console.log("map create: " + this.csvTM);
var map = this.game.add.tilemap('ItsTheMap', 32, 32);
map.addTilesetImage("Tiles");
var layer = map.createLayer(0);
layer.resizeWorld();
}
}
现在我要做的就是将csv文件路径传递给SimpleGame对象的构造函数。当只使用绝对路径时,一切正常,我能够看到网格等。当我尝试使用变量时,问题出现了。注意我有三个日志语句都显示csvTM变量的内容。现在我首先要做的是:
var game = new SimpleGame(msg["Commands"][0][1]);
game.test();
加载新的phaser对象并将文件路径传递给构造函数。现在我100%确定本地变量csvTM设置是因为当我做game.test()时我看到了文件路径。但是在preload和create中,csvTM始终是未定义的。因此破坏了我的代码。我注意到,在构造函数中创建的游戏对象似乎也可以工作,并且始终是定义的。
有人知道为什么我的局部变量字符串在preload中是未定义的并且在游戏局部变量似乎被定义的时候创建了吗?
感谢您的帮助!
答案 0 :(得分:2)
我很难确定这一点,因为我无法访问您的所有代码。但我认为这可能是经典的javascript"这个"问题
尝试将方法定义为:
preload = () => { ... }
create = () => { ... }
这将确保"这个"函数内部实际上是正确的"版本" "这"。
关于"这个"有很多问题(和答案)。在stackoverflow上使用typescript / javascript,但我对之前类似问题的回答可能解释了为什么会出现这种行为:Visual Studio shows wrong value for `this` in TypeScript
编辑:
作为Marwane K.A.在他对我的回答的评论中指出,问题可以通过替换
来解决{ preload: this.preload, create: this.create }
在"这"
的启动中