最初のシーンとして2つのボタンを含むメニューを提示しようとしています。play
、credits
。 play
をクリックすると、tutorial
、easy
、hard
、back
という別のメニューシーンを表示したいと考えています。
単にSKSpriteNode
オブジェクトとしてボタンを作成し、touchesBegan
のクリックを処理することです。
私のmenuScene.sks
ファイルでは、私は適切にノードを配置して名前を付けました。SpriteKit:アンラッピング中に予期せぬ結果が発生し、複数のメニューシーンを実装できない
import SpriteKit
class menuScene: SKScene {
var playButton:SKSpriteNode!
var creditsButton:SKSpriteNode!
override func didMove(to view: SKView) {
playButton = self.childNode(withName: "playButton") as! SKSpriteNode
creditsButton = self.childNode(withName: "creditsButton") as! SKSpriteNode
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// transition is defined in Helper.swift
let touch = touches.first
if let location = touch?.location(in: self){
let nodesArray = self.nodes(at: location)
if nodesArray.first?.name == "playButton" {
let nextScene = difScene(size: self.size)
self.view?.presentScene(nextScene, transition: transition)
} else if nodesArray.first?.name == "creditsButton" {
let nextScene = creditsScene(size: self.size)
self.view?.presentScene(nextScene, transition: transition)
}
}
}
}
私は実行し、menuSceneは問題なく表示される:ここで、あなたはこのシーンにリンクされているmenuScene.swift
ファイルを確認することができます。しかし、私がplay
ボタンをタッチするとエラーが発生し、次のシーンからです:difScene
。 は、ここでは、difScene.swift
を見つけることができます:
import SpriteKit
class difScene: SKScene {
var tutButton:SKSpriteNode!
var easyButton:SKSpriteNode!
var hardButton:SKSpriteNode!
var backButton:SKSpriteNode!
override func didMove(to view: SKView) {
tutButton = self.childNode(withName: "tutButton") as! SKSpriteNode // error
easyButton = self.childNode(withName: "easyButton") as! SKSpriteNode
hardButton = self.childNode(withName: "hardButton") as! SKSpriteNode
backButton = self.childNode(withName: "backButton") as! SKSpriteNode
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let transition = SKTransition.push(with: .down, duration: 0.2)
let touch = touches.first
if let location = touch?.location(in: self){
let nodesArray = self.nodes(at: location)
if nodesArray.first?.name == "tutButton" {
let nextScene = GameScene(size: self.size)
self.view?.presentScene(nextScene, transition: transition)
}
if nodesArray.first?.name == "easyButton" {
let nextScene = difScene(size: self.size)
self.view?.presentScene(nextScene, transition: transition)
}
if nodesArray.first?.name == "hardButton" {
let nextScene = difScene(size: self.size)
self.view?.presentScene(nextScene, transition: transition)
}
if nodesArray.first?.name == "backButton" {
let nextScene = menuScene(size: self.size)
self.view?.presentScene(nextScene, transition: transition)
}
}
}
}
それが有用である可能性がある場合には、ここに私のGameViewController.swift
です:
import UIKit
import SpriteKit
import GameplayKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GKScene(fileNamed: "menuScene") {
// Get the SKScene from the loaded GKScene
if let sceneNode = scene.rootNode as! menuScene? {
// Set the scale mode to scale to fit the window
sceneNode.scaleMode = .aspectFill
// Present the scene
if let view = self.view as! SKView? {
view.presentScene(sceneNode)
view.ignoresSiblingOrder = true
view.showsFPS = false
view.showsNodeCount = false
}
}
}
}
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if UIDevice.current.userInterfaceIdiom == .phone {
return .allButUpsideDown
} else {
return .all
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
override var prefersStatusBarHidden: Bool {
return true
}
}
私が手にエラーがある:私はこれがある
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
知っています一意のエラーではありません。私はGoogleでチュートリアルを見て、他のStackOverflowスレッドから解決策を導き出そうとしましたが、これを克服できませんでした。名前「tutButton」とは、子ノードがそうエラーが発生SKSpriteNode
にキャスト強制、存在しないため
申し訳ありませんが、私のJava日から習慣です...対応するdifScene.sksファイルがあり、すべてのボタンが配置されています。 GameViewControllerでdifSceneをどこで初期化すればよいですか? –
@CevatMertDökümcü現在の場所( 'let nextScene = difScene(size:self.size)')と同じ場所で初期化することができますが、 'size'ではなく' fileNamed'を使ってイニシャライザを呼び出す必要があります。 – nathan
ああ、初期化後にサイズを変更するにはどうすればよいですか?私は "nextScene?.size = self.size"を使用しようとしましたが、動作しませんでした。私は現在、difSceneに成功していますが、意図したよりも大きいです。 –