【发布时间】:2014-08-18 17:27:54
【问题描述】:
我正在使用 SpriteKit(使用 Xcode 6 和 Swift),并且我在屏幕上有一个角色,我可以用它在屏幕上的操纵杆四处移动,我想在他身后留下一条小路。我该怎么做?
我的图片需要多大,它需要是什么样子? 还有我会在我的代码中使用什么?
【问题讨论】:
标签: swift sprite-kit
我正在使用 SpriteKit(使用 Xcode 6 和 Swift),并且我在屏幕上有一个角色,我可以用它在屏幕上的操纵杆四处移动,我想在他身后留下一条小路。我该怎么做?
我的图片需要多大,它需要是什么样子? 还有我会在我的代码中使用什么?
【问题讨论】:
标签: swift sprite-kit
你应该看看SKEmitterNode;它会“发射”你可以用作轨迹的粒子。您可以直接在 Xcode 中通过将“SpriteKit 粒子文件”添加到您的项目来设计粒子的外观:
然后您将粒子文件加载到新的SKEmitterNode 中,如下所示:
let emitter = SKEmitterNode(fileNamed: "CharacterParticle.sks")
然后你需要将SKEmitterNode 的targetNode 属性设置为SKScene,这样它发出的粒子就不会随着你的角色移动(即它们留下痕迹):
emitter.targetNode = scene
然后将您的emitter 添加到您角色的SKNode。假设你有一个名为character 的角色的SKNode,在这种情况下,代码就是:
character.addChild(emitter)
通常这类事情会在场景的设置方法中完成(在 Apple 的 SpriteKit 模板中,它通常位于 didMoveToView 中)。它也可以在你角色的自定义SKNode 或SKSpriteNode 类中完成,如果你有的话。如果你把它放在didMoveToView,它看起来像:
override func didMoveToView(view: SKView) {
// ... any character or other node setup ...
let emitter = SKEmitterNode(fileNamed: "CharacterParticle.sks")
emitter.targetNode = self
character.addChild(emitter)
// ... any other setup ...
}
【讨论】:
虽然 SKEmitterNode 是一个不错的选择。我建议您改用 SKSpriteNode。 Xcode 中的 Emitter 在频繁且按顺序使用时会导致很多延迟。
在我看来,创建跟踪的最佳方法是在加载应用程序时预加载 SKTexture。为此,我建议创建一个这样的类。
class AssetsManager {
private init() {};
static let shared = AssetsManager();
func preloadAssets(with texture: SKTexture) {
texture.preload {
print("Sprites preloaded")
}
}
而不是在 AppDelegate 或 MenuScene 中这样调用它:
AssetsManager.shared.preloadAssets(with: SKTexture(imageNamed: "yourImage"))
比“创建线索部分”:
var timer: Timer!
timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(ballTrail), userInfo: nil, repeats: true)
创建ballTrail函数
@objc func ballTrail() {
let trail = SKSpriteNode(texture: SKTexture(imageNamed: "your Image"))
trail.size = size
trail.position = player.position
trail.zPosition = player.positon - 0.1
addChild(trail)
trail.run(SKAction.scale(to: .zero, duration: seconds))
trail.run(SKAction.fadeOut(withDuration: seconds)
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
trail.removeFromParent()
}
}
您可以随意摆弄您想要使用的操作和时间安排。希望这会对某人有所帮助!
【讨论】: