学校のプロジェクトでは、私は2Dゲームを作ることを任されています。ゲームは問題ありませんが、私はこの作業をするための特定のコードがあるかどうか疑問に思っていました。私はspriteKitを使用しているので、色のスプライトをクリックして前のシーンに戻ろうとしています。素早く色のスプライトをタップした後、前のシーンに戻る方法は?
これはばかげた質問ですが謝りますが、私はSwiftには少し戸惑っています。
種類よろしく、 ジェームズ
学校のプロジェクトでは、私は2Dゲームを作ることを任されています。ゲームは問題ありませんが、私はこの作業をするための特定のコードがあるかどうか疑問に思っていました。私はspriteKitを使用しているので、色のスプライトをクリックして前のシーンに戻ろうとしています。素早く色のスプライトをタップした後、前のシーンに戻る方法は?
これはばかげた質問ですが謝りますが、私はSwiftには少し戸惑っています。
種類よろしく、 ジェームズ
はあまりにも最も簡単な方法は、関連するSKSceneであなたのスプライト(S)上のタッチを検出することであるボタンを追加します。
enum NodeName: String {
case coloredSprite1
case coloredSprite2
}
class GameScene: SKScene {
let coloredSprite = SKSpriteNode(imageNamed: "YourImageName")
/// Scene setup
override func didMove(to view: SKView) {
// set up your colored sprite if necessary
// Give your sprites unique names to identify them
coloredSprite.name = NodeName.coloredSprite1.rawValue // always use enums for things like string identifiers so you avoid typos
}
/// Touches
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
let touchedNode = atPoint(location)
// Way 1 by node (probably less preferable)
switch touchedNode {
case coloredSprite:
// do something (e.g call loadScene method)
// see below
default:
break
}
// Way 2 by node name (probably more preferable)
// name is an optional so we have to unwrap it when using it in the switch statement.
// The easiest way is by providing an alternative string, by using the nil coalescing operator (?? "NoNodeNameFound")
switch touchedNode.name ?? "NoNodeNameFound" {
case NodeName.coloredSprite1.rawValue:
// do something (e.g call loadScene method)
// see below
default:
break
}
}
}
// Also call touchesEnded, touchesMoved and touchesCancelled and do necessary stuff
}
再利用可能なソリューションでは、ボタンサブクラスを作成するのが理想的です。これを行う方法については、Googleにかなりのチュートリアルがあります。
SKScenes間の遷移よりも、各シーンでloadSceneメソッドを作成し、必要に応じてそれらを呼び出すよりも、これはここで
ありがとう、私の問題を解決しました:) – James
あなたは大歓迎です。ハッピーコーディング。 – crashoverride777
私はSpriteKitでのタッチ操作の簡単な例を使って、私の答えにいくつかの詳細を追加しました。 – crashoverride777
を助け
// Start Scene
class StartScene: SKScene {
...
func loadGameScene() {
// If you do everything in code
let gameScene = GameScene(size: self.size)
view?.presentScene(gameScene, transition: ...)
// If you use SpriteKit scene editor
guard let gameScene = SKScene(fileNamed: "GameScene") else { return } // fileNamed is the name you gave the .sks file
view?.presentScene(gameScene, transition: ...)
}
}
// Game scene
class GameScene: SKScene {
....
func loadStartScene() {
// If you do everything in code
let startScene = StartScene(size: self.size)
view?.presentScene(startScene, transition: ...)
// If you use SpriteKit scene editor
guard let startScene = SKScene(fileNamed: "StartScene") else { return } // fileNamed is the name you gave the .sks file
view?.presentScene(startScene, transition: ...)
}
}
希望はあなたが色のスプライトを使用して、ボタンを作成する方法の一例です。タッチイベントを受け取るためのボタンを設定する方法と、それらのタッチイベントを使用してシーン間をナビゲートする方法を示します。
この例では、新しいシーンに移動して前のシーンに戻ることができます。
import SpriteKit
class Button: SKSpriteNode {
var tapped: (() -> Void)?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
tapped?()
}
}
class GameScene: SKScene {
var parentScene: SKScene?
var sceneCount = 1
override func didMove(to view: SKView) {
if parentScene != nil {
let backButton = addButton(color: .red, position: CGPoint(x: -200, y: 0))
backButton.tapped = {
if let previousScene = self.parentScene {
view.presentScene(previousScene)
}
}
}
let nextButton = addButton(color: .blue, position: CGPoint(x: 200, y: 0))
nextButton.tapped = {
if let nextScene = SKScene(fileNamed: "GameScene") as? GameScene {
nextScene.scaleMode = self.scaleMode
nextScene.parentScene = self
nextScene.sceneCount = self.sceneCount + 1
view.presentScene(nextScene)
}
}
let label = SKLabelNode(text: "Scene \(sceneCount)")
addChild(label)
}
func addButton(color: SKColor = .white, position: CGPoint = .zero) -> Button {
let button = Button(color: color, size: CGSize(width: 200, height: 200))
button.position = position
button.isUserInteractionEnabled = true
addChild(button)
return button
}
}
ありがとうございます! – James
ゲームビューコントローラでSKViewオブジェクトを表示する前のシーンはどのように定義されていますか? –
[標準init(size :)初期化子を使用した遷移](http://stackoverflow.com/a/27935104/3402095)[fileNamedを使用した遷移:簡易初期化](http://stackoverflow.com/a/37394430/3402095) )、[どのノードがタップされたかを検出する](http://stackoverflow.com/a/41324936/3402095)、[カスタムボタンと委任パターン](http://stackoverflow.com/a/36524132/3402095)、最後にしかし少なくとも何か:[Stackoverflowについての良い質問をする方法](https://stackoverflow.com/help/how-to-ask)。 – Whirlwind