在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中肯定没有必要)

链接地址: http://www.djcxy.com/p/27177.html

上一篇: Destroying sprites in Phaser

下一篇: How to empty an javascript array?