2015-08-14 3 views
5

Quindi mi chiedevo, con la configurazione di Xcode "gioco" predefinita. Come faresti un altro SKScene? Come diciamo volevo avere un menu o qualcosa del genere?Come creare un altro schermo sulla mia app

In pratica, come dovrei creare un altro documento denominato "title.swift" e quindi essere programmaticamente in grado di passare avanti e indietro attraverso di essi? In questo modo potrei passare da un menu alla scena di gioco senza intaccare il mio codice?

Non riesco a trovare dove nel codice di codice riportato in realtà viene visualizzato rapidamente per visualizzare la scena del gioco che è stata premessa con la configurazione "gioco".

Immagino di aver creato una nuova classe e di aver ereditato SKScene.

risposta

2

È possibile creare nuove scene sottoclassando SKScene o una qualsiasi delle sottoclassi create. È possibile passare da una scena all'altra chiamando il metodo SKView presetScene (scena: SKScene). Ecco come ho implementato nel mio ultimo gioco:

//handles all scene transitions 
protocol SceneTransitionDelegate { 
    //this passes the scene as a class (not object) 
    func transitionToScene(sceneClass:Scene.Type) 
} 

//make sure all you scenes are a subclass of this (so they inherit sceneDelegate): 
class Scene: SKScene { //Scene inherits from SKScene 
    var sceneDelegate:SceneTransitionDelegate! 
    required override init(size: CGSize) { 
     super.init(size: size) 
    } 
    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

class GameScene:Scene { 
    //call this method within the scene to return to the main menu 
    func gameOver() { 
     sceneDelegate.transitionToScene(MainMenuScene.self) 
    } 
} 

class MainMenuScene: Scene { 
    //call this method to transition to a game scene 
    func newGame() { 
     sceneDelegate.transitionToScene(GameScene.self) 
    } 
} 

//the VC that presents your scenes 
class GameViewController: UIViewController, SceneTransitionDelegate { 

    var skView:SKView { return view as! SKView } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //load first scene (e.g. MainMenu) 
     transitionToScene(MainMenuScene.self) 
    } 

    //SceneTransitionDelegate method 
    func transitionToScene(sceneClass:Scene.Type) { 
     let scene = sceneClass(size: skView.bounds.size) 
     scene.scaleMode = .AspectFill 
     scene.sceneDelegate = self 
     skView.presentScene(scene) 
    } 
} 

È possibile migliorare questo con l'aggiunta di un metodo per le transizioni personalizzate al SceneTransitionDelegate.

protocol SceneTransitionDelegate { 
    func transitionToScene(sceneClass:Scene.Type) 
    func transitionToScene(sceneClass:Scene.Type, transitionAnimation:SKTransition) 
} 

e aggiungere il nuovo metodo per il controller della vista in questo modo:

func transitionToScene(sceneClass: Scene.Type, transitionAnimation: SKTransition) { 
    let scene = sceneClass(size: skView.bounds.size) 
    scene.scaleMode = .AspectFill 
    scene.sceneDelegate = self 
    skView.presentScene(scene, transition: transitionAnimation) 
} 

e chiamare dall'interno di scene come questa:

func gameOverAnimated() { 
    let transition = SKTransition.crossFadeWithDuration(0.5) 
    sceneDelegate.transitionToScene(MainMenuScene.self, transitionAnimation: transition) 
} 

ho fatto un progetto Xcode demo rapido here .

+0

Grazie ragazzi per essere stati così gentili e comprensivi qui! Questa è stata una domanda molto semplice, di solito se provi qualcosa del genere nei forum C++ tieni giù votato almeno 15 volte :(. Ma sei così carino! –

2

Per creare una nuova scena è sufficiente creare un nuovo file per una classe di scene (guarda in iOS, quindi risorse, vedrai un modello di scena di kit di sprite). Ora, per passare tra le scene tornare nel codice e quando si desidera passare tra di loro si sarebbe scrivere questo:

In Swift:

let scene = GameScene(size: CGSizeMake(1024,768)) 
scene.scaleMode = SKSceneScaleMode.AspectFill 
let skView = self.view as SKView 
let transition = SKTransition.flipVerticalWithDuration(0.5) 
skView.presentScene(scene, transition: transition) 

O in Objective-C:

MenuScene *nextScene = [[GameScene alloc] initWithSize:CGSizeMake(1024, 768)]; 
nextScene.scaleMode = SKSceneScaleModeAspectFill; 
SKTransition *transition = [SKTransition flipVerticalWithDuration:0.5]; 
[self.view presentScene:nextScene transition:transition]; 

Ecco una breve spiegazione di ogni riga.
In primo luogo, si sta inizializzando una scena e specificandone le dimensioni.

let scene = GameScene(size: CGSizeMake(1024,768)) 

Questa è la dimensione della scena di default, nel caso in cui ti stavi chiedendo dei numeri.

allora avete bisogno di specificare il suo scaleMode, che di default è un aspetto di riempimento (questo è anche quello che uso)

scene.scaleMode = SKSceneScaleMode.AspectFill 

Successivamente, è possibile avere una transizione che è fondamentalmente un modo elegante di animare da un scena all'altra

let transition = SKTransition.flipVerticalWithDuration(0.5) 

Infine, è utilizzare il SKView (self.view) per presentare la nuova scena.

skView.presentScene(scene, transition: transition)