Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to duplicate a sprite in sprite kit and have them behave differently

I've been working on a IOS mobile game and I wanted to take an object,duplicate it, and have the copies move all over the screen. I've looked through Google to find things relevant to this but they were all in Objective C or just didn't have what I was looking for. I want to know how to do this in Swift and SpriteKit.

like image 531
kaptain ken Avatar asked Dec 07 '22 23:12

kaptain ken


2 Answers

You can define a function to create and return a sprite :

func createSprite()->SKSpriteNode{
    let sprite = SKSpriteNode(...)//Use the init function in the SKSpriteNode class
    //Add some code to define the sprite's property
    return sprite
}

And call this function to get some sprites that have the same property:

let spriteOne = createSprite() 
let spriteTwo = createSprite()

Then you can add different SKActions to each of them so that they can behave differently.

like image 23
LinShiwei Avatar answered Dec 27 '22 11:12

LinShiwei


If you are working with SKSpriteNode you can copy it and all it's current properties with:

let copiedNode = nodeToCopy.copy() as! SKSpriteNode

You will still need need to add copiedNode to your scene. copiedNode will also continue to run any actions that nodeToCopy was running. You can cancel them with copiedNode.removeAllActions().


Note that the documentation for the protocol NSCopying reads exactly:

Protocol

NSCopying

A protocol that objects adopt to provide functional copies of themselves.

The exact meaning of “copy” can vary from class to class, but a copy must be a functionally independent object with values identical to the original at the time the copy was made...

Indeed, in the case of SKSpriteNode, Apple have interpreted that idea so that the copy() function "spawns" another instance of the item, exactly as in any game engine.

(So, for SKSpriteNode copy() works identically to the sense of Instantiate in Unity, say.)

As mogelbuster points out below, there is nowhere in the Apple documentation that they state "The spawn command in Apple is copy()" but in fact they have interpreted this "The exact meaning of “copy” can vary from class to class" in exactly that way for SKNode, since indeed it's a game engine and it's the only meaningful sense of copy there.


It's worth noting that the most completely typical way to work in games is: for your say rocketShips, you would have one "model" of your rocketShip, say modelRocketShip. The model simply sits offscreen, or is perhaps marked as invisible or inactive. You never use the model in the game, it just sits there. When you spawn rocketShips, you just dupe the model. (So in Apple that's modelRocketShip.copy() and then set the position etc.)

like image 72
Dion Larson Avatar answered Dec 27 '22 11:12

Dion Larson