致命错误:使用未实现的初始化程序" init(size :)'上课

时间:2016-11-08 19:24:25

标签: ios swift sprite-kit swift3

我正在不同的设备上测试我的应用程序,并意识到精灵运动非常不一致(在某些设备上运行速度比其他设备快得多)。我找到this post并按照说明从我所有的SKScene中删除了尺寸参数然后我收到了错误:

fatal error: use of unimplemented initializer 'init(size:)' for class 'SuperGame.PosterScene'

请参阅下面的PosterScene课程以及调用该课程的GameViewController课程。

PosterScene

class PosterScene: SKScene {

 override init(){
    super.init()

    let posterImage = SKSpriteNode(imageNamed: "poster")
    posterImage.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
    self.addChild(posterImage)

    let sequence = SKAction.sequence([  SKAction.wait(forDuration: 3.0), SKAction.run({ self.changeToMainMenuScene() }) ])

    self.run(sequence)

}

func changeToMainMenuScene  ()  {

    let mainMenuScene = MainMenuScene()
    self.view!.presentScene(mainMenuScene)

}

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

GameViewController:

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    let skView = self.view as? SKView

    if skView?.scene == nil  {
        skView?.showsFPS = true
        skView?.showsNodeCount = true
        skView?.showsPhysics = true
        skView?.ignoresSiblingOrder = false

        //starting the game with the Poster Scene
        let posterScene = PosterScene()
        posterScene.scaleMode = .resizeFill
        skView?.presentScene(posterScene)
    }

}

override var shouldAutorotate : Bool {
    return true
}

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    if UIDevice.current.userInterfaceIdiom == .phone {
        return UIInterfaceOrientationMask.allButUpsideDown
    } else {
        return UIInterfaceOrientationMask.all
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

override var prefersStatusBarHidden : Bool {
    return true
}

required init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)!
}
}

2 个答案:

答案 0 :(得分:2)

你让我看看这个问题。

您的游戏在各种设备上都不一致,因为在您的GameViewController中,您将场景比例模式设置为.resizeFill。 在大多数情况下,默认的.aspectFill设置是最佳选择。

关于错误消息,当您不使用xCode级别编辑器时,需要在init方法中为场景指定大小,例如

let scene = GameScene(size: CGSize(width: ..., height: ...))

基本上有两种尺寸选项

1)将场景大小设置为iPad,这是我个人所做的。这也是Apple在DemoBots中使用的内容以及xCode 7中的默认设置。因此场景大小为1024x768(横向)或768x1024(纵向)。

我在设计我的游戏区域时考虑到iPhone,并在iPad上显示更多背景,通常是地面和天空。这就是我喜欢玩的很多流行游戏,例如现代战斗5,凌波,Altos冒险,青少狮财富,禅宗线,塔式冲刺。

2)将场景大小设置为iPhone并在iPhone上显示更多背景,在iPad上显示更少背景,例如卢米诺市。 因此场景大小将是xCode 8使用的,1334x750(横向)或750x1334(纵向)。

通过这种方式,您的游戏应该在所有设备上保持一致。你可能要做的唯一事情就是在iPad和iPhone之间调整一些UI,比如按钮定位。

希望这有帮助

答案 1 :(得分:0)

以下是代码布局的外观。正如你所看到的,我将场景设计为iPhone 6的大小。这意味着在所有其他手机上,图像会缩放(但你仍然可以看到所有内容),但在6上看起来会很完美。在iPad上,由于iPad是3:4而不是9:16

,因此图像将在顶部和底部被切掉12.5%。
class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    let skView = self.view as? SKView

    if skView?.scene == nil  {
        skView?.showsFPS = true
        skView?.showsNodeCount = true
        skView?.showsPhysics = true
        skView?.ignoresSiblingOrder = false

        //starting the game with the Poster Scene
        let posterScene = PosterScene(size:CGSize(width:375,height:667))
        posterScene.scaleMode = .aspectFill
        skView?.presentScene(posterScene)
    }

}

override var shouldAutorotate : Bool {
    return true
}

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    if UIDevice.current.userInterfaceIdiom == .phone {
        return UIInterfaceOrientationMask.allButUpsideDown
    } else {
        return UIInterfaceOrientationMask.all
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

override var prefersStatusBarHidden : Bool {
    return true
}

required init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)!
}
}

class PosterScene: SKScene {

 override init(size:CGSize){
    super.init(size:size)
    self.anchorPoint = CGPoint(x:0.5,y:0.5) //let's put 0,0 at the center of the screen
    let posterImage = SKSpriteNode(imageNamed: "poster")
    posterImage.position = CGPoint.zero
    self.addChild(posterImage)

    let sequence = SKAction.sequence([  SKAction.wait(forDuration: 3.0), SKAction.run({ self.changeToMainMenuScene() }) ])

    self.run(sequence)

}

func changeToMainMenuScene  ()  {

    let mainMenuScene = MainMenuScene()
    self.view!.presentScene(mainMenuScene)

}

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