我正在开发一款HTML5游戏,在高级模式下使用Phaser和Google Closure Compiler来打包游戏。
我遇到了一个似乎无法摧毁精灵的问题。在检查编译器的输出后,我注意到它一直在删除我的destroy函数调用。
我的代码非常简单,我已经测试了以下内容:
sprite.destroy();
和Phaser.Component.Destroy.prototype.destroy.call(sprite);
这两行都只是从我的代码库中删除。这不是因为它是无法访问的代码,如果我将console.log
语句放在他们所在的同一范围内。
所以原始代码是这样的:
if (typeof this.sprite != 'undefined'){
console.log('destroy sprite');
this.sprite.destroy();
Phaser.Component.Destroy.prototype.destroy.call(this.sprite);
console.log('sprite destroyed');
}
它被编译为:
"undefined"!=typeof this.sprite&&(console.log("destroy sprite"),console.log("sprite destroyed"))
我无法弄清楚代码被移除的原因,Phaser被设置为外部,我没有遇到任何其他方法或移相器类的问题。
简单地呼叫eval('this.sprite.destroy();');
顺便说一下。这证明该功能确实存在。然而,这是一个非常糟糕的解决方案,只有在这种情况下编译器不能替换sprite
时才有效。
更新
我能用很少的代码可靠地重现问题,请参阅下面的答案。但我不知道为什么会发生这种情况。
更新2
感谢Hacketo,我们发现出现此问题是因为缺少正确的Phaser extern文件。专门针对此问题创建一个修复它,但是如果没有完整文件,则总会有更多问题发生。
对于此特定问题,将以下文件添加为extern修复它:http://pastebin.com/nXA0fiZr
答案 0 :(得分:2)
我已经弄明白是什么造成了这种情况,但是为什么它会导致它我不知道如果有人有线索我非常感兴趣。
以下示例允许您重现我的问题:
打字稿:http://pastebin.com/YaCfH2mz
Javascript:http://pastebin.com/A4w2YG9N
因此出于某种原因,出于某种原因在随机类中定义一个名为destroy
的方法会破坏所有内容。即使没有使用该类,该方法也是空的。
<强>更新强>
感谢Hacketo,我们发现出现此问题是因为缺少正确的Phaser extern文件。专门针对此问题创建一个修复它,但是如果没有完整文件,则总会有更多问题发生。
对于此特定问题,将以下文件添加为extern修复它:http://pastebin.com/nXA0fiZr
答案 1 :(得分:0)
编译器认为this.sprite.destroy()
没有副作用。这就是问题所在。如果你可以发布destroy函数的源代码,我会更新这个答案。