Sprite kit 以编程方式使用SKEmitterNode的正确方法

Sprite kit 以编程方式使用SKEmitterNode的正确方法,sprite-kit,particles,skemitternode,Sprite Kit,Particles,Skemitternode,我对Spritekit是新手。刚刚开始我的第3-4场比赛。所以我想知道以编程方式使用SKEmitterNode的正确方法是什么 特别是,如果我想在我的游戏中有多个粒子——喷气发动机开火,以及子弹击中敌舰时的多次爆炸,那么正确的做法是什么 我是继续创建新的SKEmitterNode并将其添加到场景中,还是添加单个全局EmitterNode并在update函数中更改其属性 // FIRE ENGINE SKEmitterNode *_myEmitter = [[SKEmitterNode allo

我对Spritekit是新手。刚刚开始我的第3-4场比赛。所以我想知道以编程方式使用SKEmitterNode的正确方法是什么

特别是,如果我想在我的游戏中有多个粒子——喷气发动机开火,以及子弹击中敌舰时的多次爆炸,那么正确的做法是什么

我是继续创建新的SKEmitterNode并将其添加到场景中,还是添加单个全局EmitterNode并在update函数中更改其属性

// FIRE ENGINE

SKEmitterNode *_myEmitter = [[SKEmitterNode alloc] init];
// codes..
[self addChild:_myEmitter]; // add to scene

// EXPLOSION 

SKEmitterNode *_myEmitter = [[SKEmitterNode alloc] init];
// codes..
[self addChild:_myEmitter]; // add to scene


任何一种方法都可以。在我的游戏中,我有不同类型的发射器来产生不同的效果。这样做的原因是因为我的每个发射器的属性都是如此的不同,以至于概括起来是没有意义的。另一个原因是,我可能需要同时在屏幕上显示多个发射器

如果您知道大多数或所有属性都是相同的,并且一次只使用一个发射器,那么您可以更改纹理


基本上这取决于你想做什么。没有一个最佳实践。不过我还是建议使用粒子编辑器。只是必须更快地进行视觉上的调整,而且您可以随时以编程方式在以后更改属性

正如哈莫比所说,这取决于形势。如果您有不同类型的效果,可以方便地定义不同的发射器,以编程方式对其进行配置…感谢分享。至于粒子编辑器,我用我自己的应用程序来做——粒子X:D,我只担心内存方面的问题。我想用ARC,当发射器完成它的任务时,事情就自动被移除了。只要你不再需要ITI,就把发射器从场景中移开,除非你面临性能问题,否则无论是哪种方式都不会担心。正如您所说的,您可以有许多爆炸,但爆炸效果结束后,这些发射器将保留在节点树中,并消耗资源(我猜是少量的,但它们仍然存在)。您可以通过观察节点数(或枚举添加到节点树的所有节点)来检查这一点。在此处阅读有关如何在发射完成时删除发射器的详细信息(但没有默认的完成处理程序)@Rocotilos ARC在发射完成时不会处理这些节点,因为存在对它们的引用(它们被添加到另一个节点的子数组中,可能是场景)。例如,我将假设发射器已添加到场景中。当有更多的引用它们时(如果内存管理得到正确处理,当场景被释放时),它们将被丢弃,但那太晚了,它们将在整个游戏过程中耗尽资源。
// IN INIT METHOD

_myEmitter = [[SKEmitterNode alloc] init]; // global variable
// codes..
[self addChild:_myEmitter]; // add once


// IN UPDATE

//when explode
_myEmitter.particleTexture = [SKTexture textureWithImageNamed:@"explode.png"];
... modify code


//when engine fire
_myEmitter.particleTexture = [SKTexture textureWithImageNamed:@"fire.png"];
... modify code