Обязательный метод 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
должен реализовать этот инициализатор так, как это требуется.