Search code examples
swiftxcodesprite-kitsknode

How to add a sprite from another class on the gameScene


can anyone explain how to add a node to the gameScene please.

I subclassed my Boss class but i dont know how i can display my Boss1 on the GameScene

class Boss: GameScene {
    var gameScene : GameScene!
    var Boss1 = SKSpriteNode(imageNamed: "boss1")

    override func didMove(to view: SKView) {

        Boss1.position = CGPoint(x: size.width * 0.1, y: size.height * 0.5)
        Boss1.zPosition = 2

        self.gameScene.addChild(Boss1)  
    }   
}

im using swift 4 and xcode 9


Solution

  • You don't generally subclass the scene for instances such as this. More likely you are meaning to make boss a subclass of SKSpriteNode and adding it to your scene. While there is probably dozens of ways that you could subclass this, this is just 1 way.

    Also worth noting that it is not generally acceptable practice to make your variable names capitalized, classes yes, variables no.

    class Boss: SKSpriteNode {
    
        init() {
    
            let texture = SKTetxure(imageNamed: "boss1")
            super.init(texture: texture , color: .clear, size: texture.size())
    
            zPosition = 2
            //any other setup such as zRotation coloring, additional layers, health etc.
        }   
    }
    

    ...meanwhile back in GameScene

    class GameScene: SKScene {
    
        let boss1: Boss!
    
        override func didMove(to view: SKView) {
    
            boss1 = Boss()
            boss1.position = CGPoint(x: size.width * 0.1, y: size.height * 0.5)
            self.gameScene.addChild(boss1)  
        }   
    }
    

    in GameScene you create an instance of the new class and position it and add it in the GameScene.

    edit

    the init function has a short cut in swift.

    Boss()
    

    is the same as

    Boss.init()
    

    you can also add custom parameters to your init in order to further clarify or add more features to your class. for example...

    class Boss: SKSpriteNode {
    
        private var health: Int = 0
    
        init(type: Int, health: Int, scale: CGFloat) {
    
            let texture: SKTetxure!
    
            if type == 1 {
                texture = SKTetxure(imageNamed: "boss1")
            }
            else {
                texture = SKTetxure(imageNamed: "boss2")
            }
            super.init(texture: texture , color: .clear, size: texture.size())
    
            self.health = health
            self.setScale(scale)
            zPosition = 2
            //any other setup such as zRotation coloring, additional layers, health etc.
        }   
    }