致命错误:对类使用未实现的初始化'init(size :)'

我正在不同的设备上testing我的应用程序,并意识到精灵的移动是非常不一致的(与其他设备相比,在某些设备上运行的速度要快得多)。 我发现这篇文章,并按照说明,并从我所有的SKScene s中删除大小参数,然后我得到了错误:

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

请参阅下面的PosterScene类和调用它的PosterScene类。

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)! } } 

你让我看看这个问题。

你的游戏在设备之间并不一致,因为在GameViewController中,你设置了场景缩放模式为.resizeFill。 在大多数情况下,默认的.aspectfill设置是最好的select。

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

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

基本上有两个选项的大小

1)将场景大小设置为iPad,这是我亲自做的。 这也是苹果在DemoBots中使用的,以及xCode 7中的默认设置。因此,场景大小为1024×768(横向)或768×1024(纵向)。

我在考虑devise我的游戏区域,并简单地在iPad上展示更多的背景,通常是地面和天空。 这就是我喜欢玩的很多stream行的游戏,如现代战争5,林波,阿尔托斯冒险,青奥运财富,线禅,塔短跑。

2)将场景大小设置为iPhone,在iPhone上显示更多背景,在iPad上显示更less背景,例如Lumino City。 因此,场景大小将是xCode 8使用的1334×750(横向)或750×1334(纵向)。

这样你的游戏应该在所有设备上都保持一致。 你唯一需要做的就是在iPad和iPhone之间调整一些UI,比如button定位。

希望这可以帮助

这是你的代码布局应该看起来的样子。 正如你所看到的,我devise的场景是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") } }