dscrown
dscrown

Reputation: 578

How do I make a trail behind my character in SpriteKit?

I'm using SpriteKit (with Xcode 6 and Swift) and I have a character on the screen that I move around with on screen joysticks, and I want a little trail to follow behind him. How do I do that?

enter image description here

How big would my image need to be, and what would it need to look like? Also what would I use in my code?

Upvotes: 6

Views: 4187

Answers (2)

Booniefc
Booniefc

Reputation: 9

Although SKEmitterNode is a fine option. I would suggest you use a SKSpriteNode instead. The Emitters in Xcode cause a lot of lag when used frequent and in sequence.

The best way to create a trail in my opinion is by preloading a SKTexture when loading up the application. For this I would suggest creating a class like this.

class AssetsManager {      
    private init() {};
    static let shared = AssetsManager();
    
    func preloadAssets(with texture: SKTexture) {
    texture.preload {
        print("Sprites preloaded") 
    }
}

And than calling it as so in either your AppDelegate or MenuScene:

AssetsManager.shared.preloadAssets(with: SKTexture(imageNamed: "yourImage"))

Than for the "Creating a trail part":

  1. Create a timer

var timer: Timer!

  1. Start your timer

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

  1. Create the ballTrail function

      @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()
          }
      }
    

You can fiddle around with the actions and timings you would like to use. Hopefully this will help someone!

Upvotes: 1

Mike S
Mike S

Reputation: 42325

You should take a look at SKEmitterNode; it will "emit" particles that you can use as your trail. You can design the look and feel of your particles right in Xcode by adding a "SpriteKit Particle File" to your project:

new particle file

You'd then load the particle file in to a new SKEmitterNode like so:

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

Then you'll need to set the SKEmitterNode's targetNode property to your SKScene so that the particles it emits don't move with your character (i.e. they leave a trail):

emitter.targetNode = scene

Then add your emitter to your character's SKNode. Lets assume you have an SKNode for your character called character, in that case the code would simply be:

character.addChild(emitter)

Typically this sort of thing would be done in your scene's setup method (in Apple's SpriteKit template, it's usually in didMoveToView). It could also be done in your character's custom SKNode or SKSpriteNode class, if you have one. If you put it in didMoveToView, it would look something like:

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 ...
}

Upvotes: 14

Related Questions