【问题标题】:Is there a way to add a fading trail or stroke to a moving SKSpriteNode?有没有办法在移动的 SKSpriteNode 上添加淡入淡出的轨迹或描边?
【发布时间】:2020-08-30 21:55:56
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 通过 SKEmitterNode (developer.apple.com/documentation/spritekit/skemitternode) 查看粒子效果。我认为粒子可以使用与要添加轨迹的精灵相同的纹理。
  • 这就是我正在查看的内容,但其中是否有某种方法显示“关注此 SKSpriteNode?”
  • 有。让我试着找到它。

标签: swift sprite-kit


【解决方案1】:

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

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 太慢了,无法同时渲染和捕捉。动画本身运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多