swift - 有没有办法在移动的 SKSpriteNode 上添加淡入淡出的轨迹或描边?
问题描述
仍然很新,但正在慢慢构建我的第一个应用程序/游戏,并且正在慢慢实现。
我希望能够在我的一个 SKSpriteNodes 移动时添加一个褪色的条纹或轨迹。无论是由于 touchesMoved 而移动还是通过代码发送回其原始位置。我只是想添加一个漂亮的视觉效果。
我唯一能想到的就是计算距离,将其分解为 x 个动作,然后逐渐移动 Sprite 一点,使用一些淡入淡出选项,然后循环重复直到它回到本垒,使用大量嵌套的 SKAction 和序列。
我知道那一定是错的,因为它太丑了。
当我查看 Sprite Kit 的粒子文件时,它的选项很少。而且我不确定那是我应该看的。我还查看了 SKAction 的选项,如果那里有选项,我会错过它。
在 Swift 庞大的动画库中肯定有一些东西吗?
解决方案
让我们创建一个基本精灵和一个发射器,并让发射器成为精灵的孩子,以便它跟随它:
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 太慢了,无法同时渲染和捕捉。动画本身运行得很好。
推荐阅读
- batch-file - 文件名/路径中的批处理通配符不起作用
- c# - 将业务逻辑从 StoredProcedures 转移到 REST API 应用程序 - 好处?
- gmail - ViewAction 微数据未在 GMail 中显示 CTA 按钮
- c - Pset4(更舒适)- 模糊问题
- visual-c++ - 代码适用于其他 ide,但不适用于 Visual Studio 2019
- c# - 在单击事件功能上更改按钮内容不起作用c#
- flutter - 错误:“AppStateNotifier”类型的值不能分配给“Widget”类型的变量
- installation - 无法在 ubuntu 18.04 上启动 Julia v1.5.0,但 v1.0.4
- javascript - 显示 HTML 元素计数
- python - 怎么用try,除了写文件