首页 > 解决方案 > 有没有办法在移动的 SKSpriteNode 上添加淡入淡出的轨迹或描边?

问题描述

仍然很新,但正在慢慢构建我的第一个应用程序/游戏,并且正在慢慢实现。

我希望能够在我的一个 SKSpriteNodes 移动时添加一个褪色的条纹或轨迹。无论是由于 touchesMoved 而移动还是通过代码发送回其原始位置。我只是想添加一个漂亮的视觉效果。

我唯一能想到的就是计算距离,将其分解为 x 个动作,然后逐渐移动 Sprite 一点,使用一些淡入淡出选项,然后循环重复直到它回到本垒,使用大量嵌套的 SKAction 和序列。

我知道那一定是错的,因为它太丑了。

当我查看 Sprite Kit 的粒子文件时,它的选项很少。而且我不确定那是我应该看的。我还查看了 SKAction 的选项,如果那里有选项,我会错过它。

在 Swift 庞大的动画库中肯定有一些东西吗?

标签: swiftsprite-kit

解决方案


让我们创建一个基本精灵和一个发射器,并让发射器成为精灵的孩子,以便它跟随它:

let sprite = SKSpriteNode(color: .white, size: CGSize(width: 20, height: 10))

let emitter = SKEmitterNode() // better to use the visual designer in Xcode...
emitter.particleLifetime = 1.0
emitter.particleBirthRate = 50.0
emitter.particleSpeed = 100.0
emitter.emissionAngleRange = .pi / 5
emitter.particleTexture = SKTexture(imageNamed: "spark")
emitter.particleScale = 0.1
emitter.particleAlphaSpeed = -1.0
emitter.emissionAngle = -.pi


sprite.addChild(emitter) // attach it to the sprite
emitter.position.x = -15 // but not to the center

scene.addChild(sprite)

sprite.run(SKAction.group([ // let's run some actions to test it:
    SKAction.sequence([
        SKAction.move(to: CGPoint(x: 200, y: 200), duration: 5),
        SKAction.move(to: CGPoint(x: 50, y: 50), duration: 5),
    ]),
    SKAction.rotate(byAngle: .pi * 2.0, duration: 10)
]))

(如果显示不正确,请点击打开 GIF 动画:)

第一次尝试

对不经意的观察者来说,它看起来不错……只是,经过一些审查,你会发现有什么不对劲:发射的粒子生活在父精灵的宇宙中,随着它移动和旋转,甚至在它们发射很久之后!那是不对的!

那是因为targetNode发射器的 是它的父级,它应该是场景!

所以让我们在某处插入这一行:

emitter.targetNode = scene // otherwise the particles would keep moving with the sprite

(如果显示不正确,请点击打开 GIF 动画:)

第二次尝试

好的,这是不行的:粒子现在停留在场景的“宇宙”中,但显然它们的发射角度未能遵循父级的发射角度(这在我看来就像一个错误)。

幸运的是,我们可以将自定义动作附加到发射器,它会保持这个角度与父精灵对齐:

emitter.run(SKAction.repeatForever(
                SKAction.customAction(withDuration: 1) {
                    ($0 as! SKEmitterNode).emissionAngle = sprite.zRotation + .pi
                    _ = $1
                }))

(如果显示不正确,请点击打开 GIF 动画:)

最后的尝试

好的,现在新粒子以正确的方向发射,即使精灵在此期间移动或旋转,也会继续以这种方式移动。这似乎是迄今为止最真实的模拟,尽管可能仍有办法通过动态修改发射器的行为来改进它。

对不起,锯齿状的 GIF,显然我的 Mac 太慢了,无法同时渲染和捕捉。动画本身运行得很好。


推荐阅读