Обязательный метод init в классе GameScene

Я учусь быстро и играю с фреймворком для спрайтов. Эти проблемы, это так странно для меня. Код компилируется, и я решил все ошибки, но код компилируется только тогда, когда я принимаю решение Xcode для метода init.

Код предложил:

required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

При запуске приложения интерпретатор отладки отмечает строку фатальной ошибки. Я не знаю, как решить эту ошибку. Я видел другие примеры наборов спрайтов для iOS, и никому не нужен метод init в классе gameScene, и по умолчанию в этом классе нет метода init. Я тоже не изменял класс appDelegate, и свойства GameScene были инициализированы. Также все свойства класса принимают значения в методе didMovetoView.

Здесь руководитель класса:

class GameScene: SKScene, SKPhysicsContactDelegate
{

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var world : SKNode
    var hud : SKNode
    var cursor : UInt32 = 0
    var Joystick : joystick
    var map : Map
    var exit : SKSpriteNode
    var spriteAtlas : SKTextureAtlas
    var player : SKSpriteNode
    var playerShadow : SKSpriteNode
    var isExitingLevel : Bool
    var playerIdleAnimationFrames : [SKTexture] = []
    var playerWalkAnimationFrames : [SKTexture] = []
    var playerAnimationID : Int = 0; // 0 = idle; 1 = walk
    var lastUpdateTimeInterval : NSTimeInterval = 0.0

    override func didMoveToView(view: SKView)
    {
        // Setup your scene here
        let myLabel = SKLabelNode(fontNamed:"Chalkduster")
        myLabel.text = "Hello, World!";
        myLabel.fontSize = 65;
        myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

        self.addChild(myLabel)


        // Inicio todas las variables de mi juego (nada de método init ni hostias)
        backgroundColor = NSColor(red:175.0/255.0, green:143.0/255.0, blue:106.0/255.0, alpha:1.0);
        isExitingLevel = false;

        // Add a node for the world - this is where sprites and tiles are added
        world = SKNode()

        // Load the atlas that contains the sprites
        spriteAtlas = SKTextureAtlas(named:"sprites")

        Joystick.velocity = CGPoint(x: 0, y: 0)

        // Create a new map
        map = Map()

        // Create the exit
        exit = SKSpriteNode(imageNamed: "exit")
        exit.position = self.map.exitPoint
        exit.physicsBody = SKPhysicsBody(rectangleOfSize: exit.size )
        exit.physicsBody?.categoryBitMask = CollisionType.Exit;
        exit.physicsBody?.collisionBitMask = 0;

        // Create a player node
        player = SKSpriteNode(imageNamed: "idle_0")
        player.position = self.map.spawnPoint;
        player.physicsBody?.allowsRotation = false;
        player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size )
        player.physicsBody?.categoryBitMask = CollisionType.Player;
        player.physicsBody?.contactTestBitMask = CollisionType.Exit;
        player.physicsBody?.collisionBitMask = CollisionType.Wall;

        // Load sprites for player into arrays for the animations
        playerIdleAnimationFrames.append(self.spriteAtlas.textureNamed("idle_0"))

        playerWalkAnimationFrames.extend([self.spriteAtlas.textureNamed("walk_0"), self.spriteAtlas.textureNamed("walk_1"), self.spriteAtlas.textureNamed("walk_2")])

        playerShadow = SKSpriteNode(imageNamed: "shadow")
        playerShadow.xScale = 0.6
        playerShadow.yScale = 0.5
        playerShadow.alpha = 0.4

        playerAnimationID = 0;

        world.addChild(self.map)
        world.addChild(self.exit)
        world.addChild(self.playerShadow)
        world.addChild(self.player)

        // Create a node for the HUD - this is where the DPad to control the player sprite will be added
        self.hud = SKNode()

        // Add the world and hud nodes to the scene
        self.addChild(self.world)
        self.addChild(self.hud)

        // Initialize physics
        self.physicsWorld.gravity = CGVectorMake(0, 0);
    }

Заранее спасибо.

1 ответ

Решение

Я думаю, что проблема в том, что единственный инициализатор, который у вас есть, это обязательный метод init, поэтому он вызывается каждый раз при создании элемента класса. Так что фатальная ошибка выдается каждый раз. Вы должны объявить init() метод, в котором вы устанавливаете все свои свойства (интересно, почему этот код даже компилируется). В этом методе init вы также должны инициировать свои суперклассы super.init(), Тогда другая функция инициализации не будет вызвана. Но на самом деле вы не можете удалить эту функцию.

Требуемый init должен быть реализован, потому что суперкласс UIView имеет этот обязательный инициализатор. Каждый подкласс UIView должен реализовать этот инициализатор так, как это требуется.

Другие вопросы по тегам