在Phaser中摧毁精灵
我无法在Phaser中销毁Sprites。
我有一个JavaScript对象,我们称它为Block。 Block有一个精灵属性,可以这样设置:
this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color);
在我的代码中的某个点,Block被两个不同的数组引用:
square[0] = Block;
destroy[0] = Block;
在某个Update()周期中,我需要销毁精灵,所以我使用下面的代码:
square[0].sprite.destroy(true); //Destroy the sprite.
square[0] = null; //Remove the reference.
在下一个Update()循环中,当我看着destroy [0]时,我期望看到:
destroy[0].sprite: null
然而我所看到的是:
destroy[0].sprite: b.Sprite
属性只是默认设置为false。 我担心的是,如果现在将destroy [0]设置为null,那么这个精灵对象会发生什么?
它会漂浮在周围还是会自动清理? 我应该以某种方式首先销毁Block对象吗? 另外,如果destroy()不是null的引用,它与kill()有什么不同?
任何关于此事的想法将不胜感激。
杀死与毁灭的区别
Kill
应该停止渲染,但该对象仍然存在。 如果你想制作一个可重用的对象,这很好。 您可以再次创建对象,而无需再次实际创建对象。
Destroy
应该删除对象和与之相关的所有内容。 当你想把对象发送到垃圾回收器时,你可以使用它。
请注意,对于文字等一些物体,您不能使用kill
,只能使用destroy
参考:http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347
@ibnu是正确的。 Destroy
核武器对象,同时kill
暂停渲染。 但是,您的问题涉及内存泄漏和GC。 我不是GC专业人员,但这是我认为正在发生的事情。
//create an object
this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color);
//create additional references to the object
square[0] = Block;
destroy[0] = Block;
//destroy the object via Phaser's call. Remove 1/2 reference
square[0].sprite.destroy(true); //Destroy the sprite.
square[0] = null; //Remove the reference.
但是destroy[0].sprite
仍然持有对你的“毁灭”精灵的引用。 this.sprite
可能也是。 这是因为Phaser销毁方法仅从对象中删除Phaser特定属性。 JS负责通用对象垃圾收集。 该对象正在逃避,因为您在范围内仍然有有效的引用。
通过从范围destroy[0].sprite = null
或通过等待下一个状态来更改范围(假设destroy不是静态var)来解决此问题。 你不必管理自己的内存资源,JS!= C。只要确保你不在不同的范围内泄漏变量。
什么是JavaScript垃圾收集? (尽管我不认为delete
命令是GC推荐的,但在Phaser中肯定没有必要)