【问题标题】:Correct way to use SKEmitterNode Programmatically以编程方式使用 SKEmitterNode 的正确方法
【发布时间】:2016-03-08 08:19:25
【问题描述】:

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

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

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

// 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

// 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

?

【问题讨论】:

  • 就像 hamobi 所说,这取决于情况。如果您有不同类型的效果,则可以方便地定义不同的发射器来以编程方式配置它们...

标签: sprite-kit particles skemitternode


【解决方案1】:

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

如果您知道您的大部分或全部属性将是相同的,并且您一次只使用一个发射器,那么您只需更改纹理即可。

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

【讨论】:

  • 感谢分享。至于粒子编辑器,我使用我自己的应用程序来做到这一点 - Particle X。:D 我只担心内存方面的问题。我猜想使用 ARC,当发射器完成其工作时,事情就会自动删除。
  • 如果不再需要发射器,只需将其从场景中移除
  • 除非您遇到性能问题,否则我不会担心。
  • @Rocotilos 我会考虑在发射完成后从场景中移除发射器。正如您所说,您可以进行多次爆炸,但是爆炸效果结束后的那些发射器将保留在节点树中并消耗资源(我猜是一小部分,但它们仍然会存在)。您可以通过观察节点计数(或通过枚举添加到节点树的所有节点)来检查这一点。在这里阅读更多关于如何在发射完成后移除发射器(虽然没有默认的完成处理程序)stackoverflow.com/a/31731439/3402095
  • @Rocotilos ARC 不会在发射完成后处理该节点,因为存在对它们的引用(它们被添加到另一个节点的子数组中,可能是场景)。例如,我假设将发射器添加到场景中。当有更多对它们的引用时(如果内存管理正确处理释放场景时),它们将被释放,但为时已晚,它们会在整个游戏过程中消耗资源。
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2011-11-25
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多