在 Phaser 中销毁精灵

Posted

技术标签:

【中文标题】在 Phaser 中销毁精灵【英文标题】:Destroying sprites in Phaser 【发布时间】:2014-08-26 17:48:20 【问题描述】:

我无法在 Phaser 中销毁 Sprite。

我有一个 javascript 对象,我们称之为 Block。 Block 有一个 sprite 属性,设置如下:

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,那个 sprite 对象会发生什么?

它会漂浮还是会自动清理? 我应该先以某种方式破坏 Block 对象吗? 另外,如果destroy() 没有清空引用,它与kill() 有什么不同?

对此事的任何想法将不胜感激。

【问题讨论】:

如果没有引用,垃圾收集器会清理它。 如果你找到了你要找的东西,请接受答案。 【参考方案1】:

杀戮与毁灭的区别

Kill 应该停止渲染,但对象仍然存在。如果您想制作可重用的对象,那就太好了。 您可以再次创建对象,而无需再次实际创建对象。

Destroy 应该删除对象以及与之相关的所有内容。当您想将对象发送到垃圾收集器时,您可以使用它。

请注意,对于文本等某些对象,不能使用kill,只能使用destroy

参考: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

【讨论】:

【参考方案2】:

@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 is in charge of generic object Garbage Collection。该对象正在转义,因为您在范围内仍然有有效的引用。

通过从范围destroy[0].sprite = null 中删除引用或等待下一个状态更改范围来解决此问题(假设destroy 不是静态变量)。您不必自己管理内存资源,JS != C。只要确保您不要 leak 跨不同范围的变量即可。

What is JavaScript garbage collection?(虽然我认为delete命令不再推荐用于GC,但在Phaser中肯定没有必要)

【讨论】:

以上是关于在 Phaser 中销毁精灵的主要内容,如果未能解决你的问题,请参考以下文章

Phaser Framework - 检查精灵总旋转

Phaser - 如何更改组的精灵图像?

Phaser 2 - 如何检测我何时拖动另一个精灵?

html 在http://burnmind.com/tutorials/dr上发布的“如何将精灵的拖动运动限制在Phaser的X和Y轴上”教程的代码

更改 Phaser.Sprite 某些颜色的不透明度

Phaser set group sprites的锚点属性