2014-06-20 9 views
12

Così, ho iniziato a lavorare su un progetto in SpriteKit, e spero di essere in grado di implementare una scena del "menu principale" con alcuni pulsanti. Uno andrebbe ad uno schermo di selezione del livello, uno sarebbe opzioni, ecc. Poi dalla schermata di selezione del livello, ci sarebbero molti altri pulsanti che, se selezionati, avvieranno il gioco e caricheranno il livello selezionato.iOS 7 SpriteKit - Creazione di menu/pulsanti di gioco (Scene vs più controller di visualizzazione)

La mia domanda è questa: come deve essere impostato il progetto? Ogni schermo (selezione del livello, menu principale, opzioni) dovrebbe essere la propria scena e avere un controller di visualizzazione principale? O dovrei avere più controller di visualizzazione per tutto? O forse un controller di visualizzazione per ogni livello (anche se questo non ha molto senso) che è governato da un NavigationController nello storyboard?

Dopo aver giocato un po 'e aver letto online, ho notato che posso usare il controller di visualizzazione per avere UIButtons per il mio menu principale. Tuttavia, persistono attraverso le modifiche alla scena dello sprite kit, che non è qualcosa che vorrei. Ciò significherebbe che dovrei impostare i pulsanti per essere nascosti su ogni nuova scena visualizzata, il che mi preoccupa perché non sono sicuro di cosa succede esattamente ai pulsanti. So che è possibile creare pulsanti da SKSpriteNodes (simile alla classe che Graf ha pubblicato e molte persone hanno utilizzato). È l'opzione migliore? Invece di usare UIButtons sul VC, sarei verificare se un tocco è stato fatto per quel nodo pulsante nel metodo e il metodo touchedBegan touchesEnded, qualcosa di simile:

UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInNode:self]; 
SKNode *node = [self nodeAtPoint:location]; 

if ([node.name isEqualToString:@"scene button"]) 
{ 
    LevelScene *scene = [LevelScene sceneWithSize:self.view.bounds.size]; 
    scene.scaleMode = SKSceneScaleModeAspectFill; 
    [self.view presentScene:scene]; 
} 

E 'questo il modo corretto di gestire la cosa?

Eventualmente, voglio essere in grado di aggiungere schermate di pausa, schermate di gioco, ecc., E non sono sicuro se sarà sufficiente scambiare le scene. Inoltre, invece di avere un'implementazione separata per ogni livello, potrei caricarli da un file .plist

Sto anche considerando il fatto se sarò in grado di animare i pulsanti. Suppongo che vorrei che fluttuassero o diventassero più grandi quando selezionati (quando l'utente lo ha toccato ma non lo lasciano andare), e credo che un UIButton non lo permetterebbe poiché non è un SKSpriteNode.

Ci scusiamo per un post così lungo, ma spero che fornisca informazioni sufficienti per aiutarmi e portarmi sulla strada giusta! Grazie!

risposta

0

Ho riscontrato questo problema alcuni mesi fa quando ho iniziato a sviluppare il mio gioco con spriteKit.

E la mia risposta non è molto precisa, ma ecco il mio consiglio: per il gioco avrei impostato l'interfaccia utente a livello di programmazione - sembra un sacco di lavoro ma per un videogioco non è poi così male. Ma alcuni menu potrebbero essere in un setup di storyboard o file xib - come il menu principale, e il diverso sottomenu al di fuori del gioco.

Per il tocco aggiungere che la funzione al vostro scene.m

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    CGPoint location = [[touches anyObject] locationInNode:self]; 
} 

E quindi è possibile utilizzare CGRectContainsPoint();

Oppure è possibile aggiungere un UITapGestureRecognizer per visualizzare il controller.

UITapGestureRecognizer * recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 

recognizer.delegate = self; 

[view addGestureRecognizer:recognizer]; 

Setting up buttons in SKScene

2

Sebbene @ risposta di Albert è una buona, ho sempre e solo usato SKLabelNode. È una classe che è già all'interno del framework SpriteKit e non richiede l'uso di gesti.

Questo ti fa chiedere, come reagisce alle azioni? Bene, questo è in realtà abbastanza semplice.

Io uso solo il metodo touchesBegan:withEvent: e controllo se il nodo dell'etichetta viene premuto. Ecco un esempio.

// in .m file 
@interface ClassName() { 
    SKLabelNode *menuItem1; 
    SKLabelNode *menuItem2; 
} 

@implementation 

- (id) initWithSize:(CGSize)size // can't fully remember this one... 
{ 
    if(self = [super initWithSize:size]) { 
     // here you create your labels 
     menuItem1 = [SKLabelNode labelNodeWithFontNamed:@"Your font."]; 

     // this will position this at the center, top 1/3 of the screen 
     menuItem1.position = CGPointMake(self.frame.size.width/2, self.frame.size.height * .3); 
     menuItem1.text = @"Menu 1"; 
     [self addChild:menuItem1]; // takes care of the first 

     menuItem2 = [SKLabelNode labelNodeWithFontNamed:@"Your font."]; 

     // place at center, lower 1/3 of screen 
     menuItem2.position = CGPointMake(self.frame.size.width/2, self.frame.size.height * .6); 
     menuItem2.text = @"Menu 2"; 
     [self addChild:menuItem2]; 
    } 
    return self; 
} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *t = [touches anyObject]; 
    CGPoint touchLocation = [t locationInNode:self.scene]; 

     if(CGRectContainsPoint(menuItem1.frame, touchLocation)) { 
      // do whatever for first menu 
     } 

     if(CGRectContainsPoint(menuItem2.frame, touchLocation)) { 
      // do whatever for second menu 
     } 
} 

spero che questo aiuti!

7

se si desidera un semplice menu è possibile creare con SpriteKit ma se si vuole un menu complesso si dovrebbe usare UIKit.

Diciamo che si desidera creare un menu di selezione livello con effetto CoverFlow, che sarà difficile da implementare da zero SpriteKit ma per UIKit si possono trovare librerie come iCarousel che implementa sbalorditivo CoverFlow e scorrere gli effetti con facilità.

SKLabelNode dal momento supporta solo una linea di testo in modo, se si desidera aggiungere un messaggio molto lungo nel vostro gioco che sarà difficile, ma se si utilizza UIKit invece è possibile utilizzare un UITextView per visualizzare il messaggio lungo.

un dettagliato menu acquisti In App sarà più facile da creare con UIKit.

UIKit ti eviterà un sacco di mal di testa, ti incoraggio davvero a usarlo.

come deve essere impostato il progetto?

Hai solo bisogno di 1 Scene

MenuviewController -> (Push Segue) -> LevelSelectionController -> (Push Segue) -> GameScene

suppongo che avrei voluto loro di galleggiare in giro o diventa più grande quando viene selezionato (quando l'utente lo ha toccato ma non lo lascia andare), e credo che un UIButton non lo consentirebbe poiché non è un SKSpriteNode.

è possibile aggiungere animazioni ad un UIButton con UIView animateWithDuration o CABasicAnimation

Ciò significherebbe che avrei dovuto impostare pulsanti per essere nascosti in ogni nuova scena visualizzata

Risolvilo con una funzione

- (void)setHidden:(BOOL)hide { 
    UIButton *tmpButton = (UIButton *)[self.view viewWithTag:100]; 
    tmpButton.hidden = hide ? YES : NO; 
} 

nasconderlo come questo

[self setHidden:YES]; 

Speranza che aiuta

Good Luck!

Problemi correlati