SDK iOS Création d'un jeu de faits - Configuration du projet

Ce tutoriel va vous apprendre à utiliser le framework Sprite Kit pour créer un jeu de faits basé sur des questions. Il est conçu pour les utilisateurs novices et avancés. En cours de route, vous appliquerez le noyau du kit Sprite. La série The Facts Game est divisée en trois tutoriels afin de couvrir complètement chaque sujet.


introduction

Cette série est divisée en trois tutoriels: Configuration du projet, Création d'interface et Logique de jeu. Chaque partie produira un résultat pratique et la somme de toutes les parties produira le jeu final. Après la série en trois parties, les lecteurs seront en mesure de créer un simple jeu de questions / réponses comportant des sons, des animations, des menus, des règles, des minuteries et une interaction UIKit. Bien que chaque partie puisse être lue indépendamment, pour une meilleure compréhension, nous vous suggérons de suivre les tutoriels dans l’ordre. Nous avons également inclus le code source de chaque partie séparément, ce qui permet de lancer le didacticiel dans n’importe quelle section..

A la fin de ce tutoriel, le résultat ressemblera à ceci:


Le jeu des faits finis

1. Configuration initiale

Recommencer du début SpriteKit Projet Xcode et nommez-le Faits. Les informations de déploiement utilisées dans les trois parties sont les suivantes:

  • Cible de déploiement: 7
  • Appareils: iPad
  • Orientation de l'appareil: Portrait
  • Masquer le style de la barre d'état

Notez que les quatre cadres suivants sont automatiquement inclus dans le projet: CoreGraphics, UIKit, SpriteKit, et Fondation. Vous verrez trois classes, une image (Spaceship.png) et un Tableau principal fichier. Vous pouvez supprimer l'image car vous ne l'utiliserez pas.

Maintenant ouvrez le Myscene.m et commenter l'ensemble -(void) toucheBegan: (NSSet *) touche avecEvent: (UIEvent *) événement méthode. Vous n’avez pas besoin de créer un geste de tapotement dans cette scène car vous utiliserez plusieurs UIKit UIButtons pour l'interaction de l'utilisateur.


2. Arrière-plans, étiquettes et boutons

Commencez par changer la couleur de fond du SKScene en changeant le self.backgroundColor Propriétés. Notez qu'il utilise un SKColor objet avec trois propriétés pour les composants rouge, bleu et vert. Maintenant changer le myLabel texte à "faits !!" ou à tout autre titre de votre intérêt.

La prochaine étape consiste à ajouter les ressources nécessaires à votre projet. trouvez-les dans le dossier Ressources. Bien que vous n'utilisiez pas toutes les ressources maintenant, vous devriez toutes les ajouter. Puisque vous utiliserez le framework UIKit, ajoutez une méthode spécifique -(void) didMoveToView: (SKView *) voir qui détecte si la transition de scène s’est produite sans problème. Si aucun problème ne se produit, l'application charge les ressources sur l'écran. Ajoutez cette méthode à votre code. À l'intérieur, vous déclarerez trois boutons: un pour démarrer le jeu, un pour les options et le dernier pour quitter l'application..

Ajouter trois UIButtons à ton MyScene.m. Il ressemblera à ceci:

 @implementation MyScene UIButton * startButton; UIButton * optionsButton; UIButton * exitButton; 

Chaque bouton a des configurations spécifiques concernant l'emplacement et la taille du cadre, la couleur d'arrière-plan et l'image d'arrière-plan. Vous devriez essayer de créer un UIButton et l'ajouter à la vue de la scène. Les boutons doivent ressembler à l'extrait suivant:

 -(void) didMoveToView: (SKView *) view startButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; startButton.frame = CGRectMake (CGRectGetMidX (self.frame) -100, CGRectGetMidY (self.frame), 200, 70.0); startButton.backgroundColor = [UIColor clearColor]; [startButton setTitleColor: [UIColor whiteColor] pourState: UIControlStateNormal]; UIImage * buttonImageNormal = [UIImage imageNamed: @ "StartBtn.png"]; UIImage * strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth: 12 topCapHeight: 0]; [startButton setBackgroundImage: strechableButtonImageNormal forState: UIControlStateNormal]; [self.view addSubview: startButton]; optionsButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; optionsButton.frame = CGRectMake (CGRectGetMidX (self.frame) -100, CGRectGetMidY (self.frame) +90, 200, 70.0); optionsButton.backgroundColor = [UIColor clearColor]; [optionsButton setTitleColor: [UIColor whiteColor] pourState: UIControlStateNormal]; UIImage * buttonOptionsImageNormal = [UIImage imageNamed: @ "OptionsBtn.png"]; UIImage * strechableButtonOptionsImageNormal = [buttonOptionsImageNormal stretchableImageWithLeftCapWidth: 12 topCapHeight: 0]; [optionsButton setBackgroundImage: strechableButtonOptionsImageNormal forState: UIControlStateNormal]; [self.view addSubview: optionsButton]; exitButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; exitButton.frame = CGRectMake (CGRectGetMidX (self.frame) -100, CGRectGetMidY (self.frame) +180, 200, 70.0); exitButton.backgroundColor = [UIColor clearColor]; [exitButton setTitleColor: [UIColor whiteColor] pourState: UIControlStateNormal]; UIImage * buttonExitImageNormal = [UIImage imageNamed: @ "ExitBtn.png"]; UIImage * strechableButtonExitImageNormal = [buttonExitImageNormal stretchableImageWithLeftCapWidth: 12 topCapHeight: 0]; [exitButton setBackgroundImage: strechableButtonExitImageNormal forState: UIControlStateNormal]; [self.view addSubview: exitButton]; 

Courir le projet et voir la nouvelle interface racine. Si vous le souhaitez, vous pouvez ajuster l'emplacement, la taille et la position des objets d'interface. Si vous voulez en savoir plus sur le SKLabelNode ou UIButton, Je vous conseille de jouer un peu plus avec ces cours. L'interface doit ressembler à l'image suivante:


Interface racine

Il est maintenant temps d'ajouter plus de classes à votre projet.


3. Nouveau jeu et options SKScenes

Étape 1

Puisque vous avez ajouté plusieurs boutons, il est maintenant temps de les utiliser pour rediriger l'utilisateur vers une autre interface. Ajoutez deux nouvelles classes. Choisir Fichier> Nouveau> Fichier et Objectif c classe. Nommez les classes FactsScene et OptionsScene. Notez que les deux seront une super-classe de SKScene.

Quatre nouveaux fichiers sont disponibles dans votre projet: FactsScene.h, FactsScene.m, OptionsScene.h, et OptionsScene.m. Notez que les fichiers d'implémentation des deux classes sont presque vides. Par conséquent, vous devez ajouter les initialiseurs de classe. Pour les deux classes, utilisez le -initWithSize: méthode. Essayez de l'ajouter vous-même. Si vous rencontrez des problèmes, l'extrait suivant vous aidera:

 -(id) initWithSize: (CGSize) taille if (self = [super initWithSize: size]) NSLog (@ "Opstions Scene");  retourner soi-même; 

Encore une fois, vous devriez l'appliquer pour les deux classes. Maintenant que vous avez les initialiseurs de classe, il est maintenant temps de modifier le UIButton code de la dernière étape pour changer de classe. Revenir à MyScene.m et importez les deux classes dans la section import:

 #import "OptionsScene.h" #import "FactsScene.h"

Maintenant dans le Bouton Start, optionsBouton, et sortieButton, vous devez ajouter une action personnalisée. A chaque bouton, ajoutez la ligne de code correspondante.

 [startButton addTarget: action propre: @selector (moveToGame) forControlEvents: UIControlEventTouchUpInside]; [optionsButton addTarget: action propre: @selector (moveToOptions) forControlEvents: UIControlEventTouchUpInside]; [exitButton addTarget: action propre: @selector (endApplication) pourControlEvents: UIControlEventTouchUpInside];

Vous devriez voir trois avertissements ("sélecteur non déclaré"). Ne t'inquiète pas! Il est maintenant temps d'ajouter ces méthodes à votre classe.

 -(void) moveToGame  - (void) moveToOptions  - (void) endApplication 

Chacun est responsable d'une action spécifique et le nom de chaque méthode est explicite. le -(void) moveToGame et -(void) moveToOptions les méthodes sont similaires, car les deux sont utilisées pour créer une transition de cette SKScene à un autre. À chaque méthode, vous devez créer un SKScene objet de destination et objet de transition, et présente la nouvelle scène. Notez que puisque vous utilisez des objets UIKit, vous devez également les supprimer de la scène à la fin. SKScene les transitions. Si vous rencontrez des problèmes avec ces étapes, les extraits suivants vous guideront:

 -(void) moveToGame NSLog (@ "moveToGame"); FactsScene * factsScene = [[FactsScene alloc] initWithSize: CGSizeMake (CGRectGetMaxX (self.frame), CGRectGetMaxY (self.frame))]]; SKTransition * transition = [SKTransitionvelWithDirection: Durée de SKTransitionDirectionUp: 1]; [startButton removeFromSuperview]; [optionsBoutton removeFromSuperview]; [exitButton removeFromSuperview]; [self.scene.view presentScene: réalitésScene transition: transition];  - (void) moveToOptions NSLog (@ "moveToOptions"); OptionsScene * optionsScene = [[OptionsScene alloc] initWithSize: CGSizeMake (CGRectGetMaxX (self.frame), CGRectGetMaxY (self.frame))]; SKTransition * transition = [SKTransitionveheWithDirection: SKTransitionDirectionLeft durée: 1]; [startButton removeFromSuperview]; [optionsBoutton removeFromSuperview]; [exitButton removeFromSuperview]; [self.scene.view presentScene: optionsScene transition: transition]; 

La dernière méthode -(void) endApplication est plus simple puisqu'il n'est utilisé que pour terminer l'application.

 -(void) endApplication [startButton removeFromSuperview]; [optionsBoutton removeFromSuperview]; [exitButton removeFromSuperview]; sortie (0); 

Étape 2

Il est maintenant temps de Courir le code et tester les nouvelles fonctionnalités. Si tout va bien, vous devriez pouvoir changer la vue par défaut en Nouveau jeu voir et Les options vue. Cependant, vous ne pouvez pas revenir au menu principal. Changeons ça maintenant.

Vos prochaines étapes consistent à ajouter un UIButton au Les options scène, programmez-la pour effectuer une transition dans le menu principal et choisissez de créer (ou non) un effet de transition. Pour ce faire, plusieurs étapes sont nécessaires:

  • Ajouter le -(void) didMoveToView: (SKView *) voir méthode
  • Ajouter un objet UIButton
  • Configurez le UIButton
  • Ajouter le @sélecteur méthode
  • Importer le MyScene.h

D'abord, allez au OptionsScene.h et ajouter:

 @property (nonatomic, keep) UIButton * backButton;

Maintenant, changez votre attention sur OptionsScene.m. Les extraits pour le pseudo-code sont à ajouter à la didMoveToView méthode, le bouton UIB et la configuration des boutons.

 -(void) didMoveToView: (SKView *) view _backButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; _backButton.frame = CGRectMake (CGRectGetMidX (self.frame) -100, CGRectGetMidY (self.frame) +180, 200, 70.0); _backButton.backgroundColor = [UIColor clearColor]; [_backButton setTitleColor: [WhiteColor UIColor] pourState: UIControlStateNormal]; UIImage * buttonExitImageNormal = [UIImage imageNamed: @ "ExitBtn.png"]; UIImage * strechableButtonExitImageNormal = [buttonExitImageNormal stretchableImageWithLeftCapWidth: 12 topCapHeight: 0]; [_backButton setBackgroundImage: strechableButtonExitImageNormal forState: UIControlStateNormal]; [_backButton addTarget: action propre: @selector (moveToHome) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: _backButton]; 

Ensuite, ajoutez le @sélecteur méthode.

 -(void) moveToHome MyScene * myScene = [[MyScene alloc] initWithSize: CGSizeMake (CGRectGetMaxX (self.frame), CGRectGetMaxY (self.frame))]; [_backButton removeFromSuperview]; [self.scene.view presentScene: myScene]; 

Courir votre code pour vérifier si tout est opérationnel. Vous pouvez maintenant passer de l'interface racine à la OptionsScene et retour Maintenant, nous pouvons peupler la scène Options.


4. Options SKScene

Étape 1

Les options de jeu permettent à l’utilisateur de modifier les configurations du jeu. Pour l'instant, vous ne vous focaliserez que sur deux options: la musique et le son. Vous devez ajouter un SKLabelNode, une UISwitch, Et un AVAudioPlayer objecter à OptionsScene.h:

 @property (nonatomic, keep) IBOutlet UISwitch * musicSwitch; @property (nonatomic, keep) IBOutlet UISwitch * soundSwitch; @property (nonatomic, keep) SKLabelNode * soundTitle; @property (nonatomic, keep) SKLabelNode * musicTitle;

Puis sur le OptionsScene.m à l'intérieur de didMoveToView méthode, allouer les objets comme:

 _soundSwitch = [[UISwitch alloc] initWithFrame: CGRectMake (CGRectGetMidX (self.frame) +50, CGRectGetMidY (auto.frame) -26, 100, 100)]; [_ soundSwitch addTarget: action indépendante: @selector (flipMusicAndSound :) pour UIControlEventValueChanged]; [self.view addSubview: _soundSwitch]; _musicSwitch = [[UISwitch alloc] initWithFrame: CGRectMake (CGRectGetMidX (self.frame) +50, CGRectGetMidY (self.frame) +50, 100, 100)]; [_musicSwitch addTarget: action propre: @selector (flipMusicAndSound :) pourControlEvents: UIControlEventValueChanged]; [auto.view addSubview: _musicSwitch]; _soundTitle = [SKLabelNode labelNodeWithFontNamed: @ "Chalkduster"]; [_soundTitle setText: @ "Sound"]; [_soundTitle setFontSize: 40]; [_soundTitle setPosition: CGPointMake (CGRectGetMidX (self.frame) -80, CGRectGetMidY (self.frame))]]; [auto addChild: _soundTitle]; _musicTitle = [SKLabelNode labelNodeWithFontNamed: @ "Chalkduster"]; [_musicTitle setText: @ "Music"]; [_musicTitle setFontSize: 40]; [_musicTitle setPosition: CGPointMake (CGRectGetMidX (self.frame) -80, CGRectGetMidY (self.frame) -80)]; [auto addChild: _musicTitle];

Vous recevrez un avertissement. Pour le corriger, ajoutez le flipMusicAndSound méthode. Cette méthode vérifie l'état de _soundSwitch et _musicSwitch UISwitches et définit une clé par défaut pour chaque propriété à l'aide de NSUserDefaults. Avant de terminer la méthode, vous devez ajouter le NSUserDefaults objet à la classe.

 @implementation OptionsScene NSUserDefaults * defaults; 

Ensuite, vous devriez le répartir dans le initWithSize méthode comme:

 defaults = [NSUserDefaults standardUserDefaults];

Étape 2

Vous êtes maintenant prêt à utiliser les avantages de NSUserDefaults. Vous l'utiliserez pour stocker l'état des propriétés du son et de la musique dans l'ensemble de l'application. Vous pouvez écrire et compléter le flipMusicAndSound méthode. Vous utiliserez le entier valeur 1 pour activer le son et la musique, et 0 sinon. le flipMusicAndSound est inférieure à.

 - (IBAction) flipMusicAndSound: (id) expéditeur if (_musicSwitch.on) [defaults setInteger: 1 forKey: @ "music"];  else [[defaults setInteger: 0 forKey: @ "music"];  if (_soundSwitch.on) [par défaut setInteger: 1 pourKey: @ "sound"];  else [defaults setInteger: 0 forKey: @ "sound"]; 

Si vous Courir le projet et jouer avec les deux commutateurs, vous verrez que chaque fois que vous allez à la OptionsScene les deux commutateurs ont un état par défaut, plutôt que le dernier état défini. Pour changer cela, nous devons lire le NSUserDefaults objet au didMoveToView méthode.

Vous allez définir deux variables pour le son et la musique et vérifier chaque clé de propriété inhérente. C'est un test de décision très simple et logique. Si vous ne savez pas comment faire cela, l'extrait suivant vous aidera:

 long soundDefaults = [valeur par défaut integerForKey: @ "sound"]; long musicDefaults = [valeurs par défaut integerForKey: @ "music"]; if (soundDefaults == 1) [_soundSwitch setOn: YES animé: YES];  else [_soundSwitch setOn: FALSE animated: YES];  if (musicDefaults == 1) [_musicSwitch setOn: OUI animé: OUI];  else [_musicSwitch setOn: FALSE animated: YES]; 

La dernière étape de la OptionsScene.m fichier consiste à supprimer les éléments UISwitch de la vue d'ensemble chaque fois que l'utilisateur appuie sur le bouton Précédent:

 [_soundSwitch removeFromSuperview]; [_musicSwitch removeFromSuperview];

Voici une illustration de l'interface Options:


Interface d'options

Étape 3

Déplacer vers le FactsScene.m. Nous pouvons maintenant ajouter les éléments sonores et musicaux. Comme avec le OptionsScene, nous devons utiliser NSUserDefaults pour obtenir la valeur pour la musique et le son. Nous aurons également besoin d'un objet pour stocker le chemin de musique et d'un autre pour le lecteur de musique iOS. Nous allons donc les déclarer comme:

 @implementation FactsScene NSUserDefaults * defaults; NSString * musicPath; 

Aussi dans le FactsScene.h:

 @property (nonatomic, strong) AVAudioPlayer * musicPlayer;

Vous devez déclarer (comme vous l'avez fait avec la dernière classe) la méthode -(void) didMoveToView: (SKView *) voir. À l'intérieur, vous devez vérifier si les préférences de musique et de son sont activées et attribuer les préférences de musique. Les deux peuvent être atteints par:

 musicPath = [[NSBundle mainBundle] pathForResource: @ "music" ofType: @ "mp3"]; _musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [fileURLWithPath NSURL: musicPath] error: NULL]; _musicPlayer.numberOfLoops = -1; // boucle pour toujours _musicPlayer.volume = 0.7; long musicFlag = [defaults integerForKey: @ "music"]; if (musicFlag == 1) [_musicPlayer play];  else [_musicPlayer stop]; 

Le code mentionné ci-dessus ne démarre ou n'arrête la musique que si sa propriété est activée. Nous voulons également créer des sons lorsqu'un tapotement se produit. Nous devons donc saisir les interactions tactiles et réagir en conséquence.

Vous souvenez-vous du -(void) toucheBegan: (NSSet *) touche avecEvent: (UIEvent *) événement méthode de la MyScene.m fichier d'implémentation? Vous allez le définir et l'utiliser ici.

 -(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event pour (UITouch * touches tactiles) [self touchWillProduceASound: @ "False"]; 

Notez que le -(void) touchWillProduceASound: (NSString *) answer n'est pas encore déclaré. Le déclarer. Il est utilisé pour tester si une touche donnée est "correcte" ou "incorrecte" (il y en aura plus dans le prochain tutoriel). Il analyse le (NSString *) répondre et produit un son en fonction du contenu de cette NSString.

Le son est créé avec le SKAction objet. Il crée un objet sonore et joue un son spécifique. Encore une fois, cela ne se produit que si la propriété son (donnée par le NSUserDefaults) est sur.

 -(void) touchWillProduceASound: (NSString *) answer long soundFlag = [defaults integerForKey: @ "sound"]; if (soundFlag == 1) SKAction * sound; if ([answer isEqualToString: @ "False"]) sound = [SKAction playSoundFileNamed: @ "beep.mp3" waitForCompletion: YES]; NSLog (@ "inside");  [self runAction: sound]; 

Exécutez le projet et testez la nouvelle musique et les interactions sonores. Activer et désactiver les commutateurs UIS de son et de musique et passer à la scène du nouveau jeu pour les tester correctement.


Conclusion

C'est la fin du premier tutoriel! À ce stade, vous pouvez lancer et configurer un projet SpriteKit, ajouter et initialiser SKScene objets, naviguer entre SKScene objets, interagissez entre les frameworks SpriteKit et UIKit et ajoutez et supprimez des sons et de la musique. Dans les tutoriels suivants, vous aborderez la création d’interface et la logique de jeu..