【问题标题】:How do I make a trail behind my character in SpriteKit?如何在 SpriteKit 中跟踪我的角色?
【发布时间】:2014-08-18 17:27:54
【问题描述】:

我正在使用 SpriteKit(使用 Xcode 6 和 Swift),并且我在屏幕上有一个角色,我可以用它在屏幕上的操纵杆四处移动,我想在他身后留下一条小路。我该怎么做?

我的图片需要多大,它需要是什么样子? 还有我会在我的代码中使用什么?

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    你应该看看SKEmitterNode;它会“发射”你可以用作轨迹的粒子。您可以直接在 Xcode 中通过将“SpriteKit 粒子文件”添加到您的项目来设计粒子的外观:

    然后您将粒子文件加载到新的SKEmitterNode 中,如下所示:

    let emitter = SKEmitterNode(fileNamed: "CharacterParticle.sks")
    

    然后你需要将SKEmitterNodetargetNode 属性设置为SKScene,这样它发出的粒子就不会随着你的角色移动(即它们留下痕迹):

    emitter.targetNode = scene
    

    然后将您的emitter 添加到您角色的SKNode。假设你有一个名为character 的角色的SKNode,在这种情况下,代码就是:

    character.addChild(emitter)
    

    通常这类事情会在场景的设置方法中完成(在 Apple 的 SpriteKit 模板中,它通常位于 didMoveToView 中)。它也可以在你角色的自定义SKNodeSKSpriteNode 类中完成,如果你有的话。如果你把它放在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 成为你角色的 SKNode 的子节点,以便它跟随它,并将 SKEmitterNode 的 targetNode 属性设置为你的 SKScene,这样它发出的粒子就不会随着你的角色移动(即它们留下痕迹)。 "不过,我不知道该怎么做。顺便说一句,我正在使用 swift。
    • 每当我创建一个新的 SpriteKit 粒子文件时,Xcode 都会崩溃。
    • @glassp 我编辑了我的答案,试图阐明如何添加发射器。你有哪个 Xcode6 测试版?在 Beta5 中添加粒子文件对我来说效果很好,而 Beta6 大约一个小时前才发布(不过我还没有尝试使用它添加粒子文件)。
    • 我正在使用 Xcode beta 6,我爸爸也是。我也在他的 Mac Mini 上试过。
    • @glassp 哇,是的,我刚刚在 Beta6 中尝试过,它也崩溃了;我什至无法打开项目中已经存在的粒子文件。这很令人沮丧。如果您有 Xcode6-Beta5 的副本,请尝试使用它。
    【解决方案2】:

    虽然 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"))
    

    比“创建线索部分”:

    1. 创建计时器

    var timer: Timer!

    1. 开始你的计时器

    timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(ballTrail), userInfo: nil, repeats: true)

    1. 创建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()
            }
        }
      

    您可以随意摆弄您想要使用的操作和时间安排。希望这会对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多