【问题标题】:How to use a SKEmitterNode in sprite kit to achieve a "fog of war" effect?如何在 sprite kit 中使用 SKEmitterNode 实现“战争迷雾”效果?
【发布时间】:2014-06-21 12:42:33
【问题描述】:

我正在尝试使用 SKEmitterNode 创建着色器,有点像在洞穴中的口袋妖怪中: http://www.serebii.net/pokearth/maps/johto-hgss/38-route31.png

这是我到目前为止的代码:

NSString *burstPath =
  [[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"];

  SKNode *area = [[SKNode alloc] init];

  SKSpriteNode *background = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(self.frame.size.width, self.frame.size.width)];
  background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

  SKEmitterNode *burstNode =
  [NSKeyedUnarchiver unarchiveObjectWithFile:burstPath];
  burstNode.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));

  burstNode.particleBlendMode = SKBlendModeSubtract;
  [area addChild:background];
  [area addChild:burstNode];
  [self addChild:area];

这里是 SKEmitterNode:http://postimg.org/image/60zflqjzt/

我有两个想法。 第一个是创建一个矩形 SKSpriteNode 并从矩形 SKSpriteNode 中删除 SKEmitterNode。这样,我们就有了一个黑色的矩形,中间有一个“洞”,我们可以看穿。

第二个是将矩形SKSpriteNode和SKEmitter节点添加到另一个SKNode(区域),然后设置SKEmitterNode的particleBlendMode,最后根据颜色设置SKNode(区域)的alpha。例如,如果一个像素的颜色为黑色,则该像素的 alpha 值为 1.0,而另一个像素为白色,则其他像素的 alpha 值为 0.0。

这个问题在某些方面可能与How to create an alpha mask in iOS using sprite kit 重复,但由于没有给出好的答案,我认为这不是问题。

非常感谢。

【问题讨论】:

    标签: ios objective-c sprite-kit sknode skemitternode


    【解决方案1】:

    这些不是您要查找的节点! ;)

    粒子不能用于制造战争迷雾,即使你可以让它们表现出产生战争迷雾的行为,它也会非常缓慢。

    根据链接的屏幕截图,您实际上只需要一个带有“洞”的图像,一个透明区域。图像应该是屏幕大小的,并且只需将边框覆盖到您需要的程度。这将是一种不暴露的战争迷雾,或者更确切地说,只是玩家周围的黑暗效果。

    真正的战争迷雾实现,你发现世界区域通常使用一种模式,最简单的形式就是移除(淡出)矩形黑色精灵。

    【讨论】:

    • 您知道如何在图像中添加火焰闪烁效果吗?你的答案的缺点是,每次我想要不同的半径时,我都必须创建一个额外的图像:/否则,这是个好主意:)
    • 通过缩放战争迷雾精灵可以获得不同的半径。
    • 对火炬/火焰闪烁有任何想法吗?
    • 不是真的,可能是另一个透明度不断变化的透明图像
    【解决方案2】:

    现在,借助这个时代的强大设备(iPhone 12),可以使用“SKEmitterNode”而不会每秒丢失太多帧。 您必须使用此图像构建 SKS(SpriteKit 粒子文件):

    然后,像这张图片一样设置你的变量:

    因此,转到您的代码并使用以下示例添加您的粒子:

    let fog = SKEmitterNode(fileNamed: "fog")
    fog.zPosition = 6
    self.addChild(fog)
    fog.position.y = self.frame.midY
    fog.particlePositionRange.dx = self.size.width * 2.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多