Créez un jeu de puzzle inspiré Frenzic en Flash

Jetez un coup d'œil à ce didacticiel Premium pour créer un jeu de réflexion amusant inspiré de Frenzic, utilisant Flash et ActionScript 3..

Dans la démo ci-dessus, remplissez les cases extérieures avec des carrés de couleur. Vous obtenez plus de points pour remplir une boîte avec des carrés de la même couleur.


Étape 1: bref aperçu

À l'aide des outils de dessin de Flash, nous allons créer une interface graphique attrayante, optimisée par plusieurs classes ActionScript 3..

Le joueur pourra cliquer sur quatre emplacements différents pour trier les blocs de couleur sur les carrés. Vous obtiendrez plus de points si vous remplissez un carré avec une seule couleur de bloc..


Étape 2: Paramètres du document Flash

Ouvrez Flash et créez un document de 320 pixels de large et 480 pixels de haut. Définir le taux de trame à 24fps.



Étape 3: interface


Une belle interface colorée sera affichée, cela implique plusieurs formes, boutons, sons et plus.

Passez aux étapes suivantes pour apprendre à créer cette interface graphique..


Étape 4: Contexte


Sélectionnez l'outil Rectangle (R) pour créer un rectangle de 320x480px # 0D6191, # 001217 et le centrer dans la scène. Utilisez le même outil pour créer une ligne noire 2x480px avec 20% d'alpha, appuyez sur CMD + D pour la dupliquer à plusieurs reprises et étalez les lignes pour obtenir l'effet dans l'image ci-dessus..


Étape 5: Vue du titre


Sélectionnez l'outil Texte (T), sélectionnez une belle police et écrivez le titre de votre jeu. J'ai utilisé ce format: Orbitron Bold, 60 pt, # A3FF24. Vous pouvez ajouter un simple filtre luminescent pour le rendre meilleur.

Utilisez la même technique pour créer deux boutons, alignez-les au centre et nommez-les. débutB et créditsB. Convertir tout en un Clip du film et mettre son nom à TitleView; marque le Exporter pour ActionScript boîte et supprimer le clip de la scène.


Étape 6: Score et vies


Ce sera le GameView. Ajouter le fond MC à la scène et créer deux Champs de texte dynamiques et placez-les comme indiqué dans l'image. Nommez les champs de texte viesTF et scoreTF.


Étape 7: Conteneurs


Utilisez le Outil Rectangle (R) pour créer un carré de 70x70px et le remplir en utilisant le dégradé d’arrière-plan, le convertir en MC et appuyer sur CMD + D pour le dupliquer afin d’en avoir cinq au total. Utilisez le panneau d'alignement pour les placer comme indiqué dans l'image.

Les noms d'instance doivent correspondre à leurs positions - à savoir: haut bas Gauche Droite et le centre sera titulaire principal.


Étape 8: Blocs


Utilisez la même technique que celle utilisée dans la dernière étape pour créer trois blocs de 30x30px, les convertir en MC et les nommer en fonction de sa couleur: OrangeBlock, PurpleBlock et GreenBlock. N'oubliez pas de marquer le Exporter pour ActionScript boîte.


Étape 9: alerte


Une alerte apparaîtra lorsque vous perdez toutes vos vies et indiquera le score final atteint. Utilisez le Outil primitif rectangle pour le créer et le remplir avec ce dégradé linéaire: # 000000 à # 333333. Définissez son nom d'instance sur AlertView et marquer le Exporter pour ActionScript boîte.


Étape 10: crédits


Cet écran sera facile à faire car nous avons déjà tous les graphiques. Définissez son nom d'instance sur CréditsVoir et marquer le Exporter pour ActionScript boîte.


Étape 11: Tween Nano


Nous utiliserons un moteur d'interpolation différent de celui par défaut inclus dans le flash, ce qui augmentera les performances et facilitera l'utilisation..

Vous pouvez télécharger Tween Nano depuis son site officiel.


Étape 12: Soungle


Nous utiliserons les effets sonores pour améliorer la sensation du jeu. Vous pouvez trouver les sons utilisés dans cet exemple sur Soungle.com en utilisant les mots-clés. cloche et bourdonner. Ajoutez-les à votre bibliothèque, avec les noms de classe de Cloche, Bell4, et Bourdonner, respectivement.


Étape 13: créez une nouvelle classe ActionScript


Créez une nouvelle classe ActionScript 3.0 (Cmd + N) et enregistrez-la sous Main.as dans votre dossier de classe.


Étape 14: Structure de classe

Créez votre structure de classe de base pour commencer à écrire votre code.

 package import flash.display.Sprite; classe publique Main étend Sprite fonction publique Main (): void // code constructeur

Étape 15: Classes requises

Ce sont les classes que nous devons importer pour que notre classe fonctionne, le importation directive met à la disposition de votre code des classes et des packages définis en externe.

 import flash.display.Sprite; import flash.events.MouseEvent; import com.greensock.TweenNano; importer com.greensock.easing.Bounce; import flash.utils.Timer; import flash.events.TimerEvent; import flash.net.navigateToURL; import flash.net.URLRequest;

Étape 16: Variables

Ce sont les variables que nous allons utiliser, lisez les commentaires dans le code pour en savoir plus à leur sujet, certains noms sont explicites, il n'y aura donc pas de commentaire.

 private var titleView: TitleView = new TitleView (); crédits var privés: CreditsView; var privé blockColor: vecteur. = nouveau vecteur.(); // Stocke les couleurs disponibles, utilisées pour créer de nouvelles instances de blocs private var blocks: Vector. = nouveau vecteur.(); // va stocker tous les blocs à l’écran pour y accéder à tout moment, positions privées var: Vector. = nouveau vecteur.(); // Contient les positions possibles des blocs private var currentXPosition: int; private var currentYPosition: int; private var eventTarget: Object; // Utilisé pour accéder à la cible de l'événement de la fonction de lieu private var timer: Timer = new Timer (3000); // vous aurez 3 secondes pour placer le bloc au centre private var lives: int = 5; score var privé: int = 0; Cloche var privée: Bell = new Bell (); var privée 4: Bell4 = nouvelle Bell4 (); Var Buzz privé: Buzz = nouveau Buzz ();

Étape 17: constructeur

Le constructeur est une fonction qui s'exécute lorsqu'un objet est créé à partir d'une classe. Ce code est le premier à s'exécuter lorsque vous créez une instance d'un objet ou (dans la classe de document) le premier à s'exécuter lors du chargement du projet..

Il appelle les fonctions nécessaires pour démarrer le jeu. Vérifiez ces fonctions dans les prochaines étapes.

 fonction finale publique Main (): void // code? 

Étape 18: Ajouter la vue du titre

Nous allons commencer par ajouter le TitleView à la scène; si nous ne le faisons pas, le premier écran sera le GameView.

 addChild (titleView);

Étape 19: Ajouter des valeurs de vecteurs

le couleur de bloc le vecteur est utilisé pour créer une nouvelle instance du bloc sélectionné; les paramètres sont les blocs que nous avons créés aux étapes précédentes.

le positions vecteur stocke le possible X et y les positions qu'un bloc peut avoir; mélanger cela nous donnera la position finale par rapport à la titulaire principal MC.

 blockColor.push ('orange', 'vert', 'violet'); positions.push (5, 35); startButtonListeners ();

Étape 20: auditeurs de bouton

Dans cette fonction, nous ajoutons les écouteurs de la souris aux boutons de la vue des titres. Cela nous mènera à l'écran de jeu ou à l'écran de crédits.

 fonction finale privée startButtonListeners (action = 'add'): void if (action == 'add') titleView.creditsB.addEventListener (MouseEvent.MOUSE_UP, showCredits); titleView.startB.addEventListener (MouseEvent.MOUSE_UP, showGameView);  else titleView.creditsB.removeEventListener (MouseEvent.MOUSE_UP, showCredits); titleView.startB.removeEventListener (MouseEvent.MOUSE_UP, showGameView); 

Étape 21: Afficher les crédits

L'écran de crédits s'affiche lorsque l'utilisateur clique sur le bouton de crédits, un écouteur à la souris est ajouté au MC complet pour le supprimer..

 fonction finale privée showCredits (e: MouseEvent): void crédits = new CreditsView (); addChild (crédits); TweenNano.from (credits, 0.3, x: stage.stageWidth, onComplete: function (): void titleView.visible = false; credits.addEventListener (MouseEvent.MOUSE_UP, hideCredits);); 

Étape 22: masquer les crédits

Lorsque l’écran des crédits est cliqué, il sera tweened de la scène et supprimé.

 fonction finale privée hideCredits (e: MouseEvent): void titleView.visible = true; TweenNano.to (crédits, 0.3, x: stage.stageWidth, onComplete: fonction (): void crédits.removeEventListener (MouseEvent.MOUSE_UP, hideCredits); removeChild (crédits); crédits = null;); 

Étape 23: Affichage du jeu

Quand le Début le bouton est enfoncé, la vue du titre est interpolée et supprimée pour révéler la vue du jeu.

 fonction finale privée showGameView (e: MouseEvent): void TweenNano.to (titleView, 0.3, y: -titleView.height, onComplete: fonction (): void startButtonListeners ('rmv'); removeChild (titleView); titleView = nul;   ); counter.gotoAndStop (1); addListeners (); 

Arrêtons-nous ici pour faire un test rapide et nous assurer que notre écran de commutation le code fonctionne (testez d’abord les crédits pour pouvoir revenir en arrière). Définissez la classe de document de votre fichier FLA sur Principale.

Rappelez-vous que les jalons sont inclus dans les fichiers source, donc si pour une raison quelconque votre fichier ne l'imite pas, jetez un coup d'œil à la source pour voir ce qui peut en résulter.


Étape 24: Auditeurs du jeu

Revenez au code et ajoutez la fonction suivante. Il ajoutera un écouteur de souris aux carrés afin que vous puissiez cliquer dessus pour placer le bloc actuel..

 fonction finale privée addListeners (): void up.addEventListener (MouseEvent.MOUSE_UP, placeBlock); right.addEventListener (MouseEvent.MOUSE_UP, placeBlock); down.addEventListener (MouseEvent.MOUSE_UP, placeBlock); left.addEventListener (MouseEvent.MOUSE_UP, placeBlock);

Étape 25: Tableaux de conteneurs

Ces tableaux sont créés à l'intérieur des MovieClips carrés, ils servent à enregistrer les blocs, les couleurs et les positions à l'intérieur de chaque carré..

Les lettres représentent les positions suivantes:

  • a: en haut à gauche
  • b: en haut à droite
  • c: en bas à gauche
  • d: en bas à droite

Continuer le addListeners () une fonction:

 / * Crée un tableau pour chaque conteneur afin de déterminer quand il est plein et la couleur des blocs * / up.blocks = []; right.blocks = []; down.blocks = []; left.blocks = []; / * Crée un booléen pour chaque conteneur afin d'éviter de placer des blocs dans la même position * / up.a = false; right.a = false; down.a = false; left.a = false; up.b = false; right.b = false; down.b = false; left.b = false; up.c = faux; right.c = false; down.c = false; left.c = false; up.d = false; right.d = false; down.d = false; left.d = false; newBlock (true); 

Étape 26: Générer une couleur de bloc aléatoire

Ce code sélectionne une couleur de bloc aléatoire dans le vecteur, il sera utilisé pour instancier le bloc réel. Un paramètre est utilisé pour déterminer si le minuteur pour commencer à compter sera activé.

 fonction finale privée newBlock (firstTime: Boolean = false): void / * Nouveau bloc * / var randomBlock: int = Math.floor (Math.random () * 3); bloc var: Sprite; commutateur (blockColor [randomBlock]) case 'orange': block = new OrangeBlock (); Pause; case 'green': block = new GreenBlock (); Pause; case 'purple': block = new PurpleBlock (); Pause; défaut: trace ('BlockColor Error'); Pause; 

Étape 27: Ajouter un nouveau bloc

Après avoir sélectionné la couleur du bloc, la position où il sera placé est calculée à l'aide du positions Vecteur puis ajouté au vecteur de blocs et à la scène. Continuer le newBlock () une fonction:

 currentXPosition = positions [Math.floor (Math.random () * 2)]; currentYPosition = positions [Math.floor (Math.random () * 2)]; block.x = mainHolder.x + currentXPosition; block.y = mainHolder.y + currentYPosition; blocks.push (block); addChild (bloc);

Étape 28: Rechercher un espace disponible

Avant de continuer le jeu, nous devons vérifier que le bloc nouvellement créé peut effectivement être placé dans un conteneur carré. Le code suivant vérifie chaque tableau de conteneurs pour s’assurer qu’une position vide est disponible dans l’une des cases où le bloc peut être placé; s'il n'y en a pas, le bloc est détruit et la fonction est appelée à nouveau pour en générer un autre.

 / * Recherche un espace disponible pour déplacer le bloc * / var position: Array = [currentXPosition, currentYPosition]; if (String (position) == '5,5' && up.a && right.a && down.a && left.a) removeChild (block); block = null; newBlock ();  else if (String (position) == '35, 5 '&& up.b && right.b && down.b && left.b) removeChild (block); block = null; newBlock ();  else if (String (position) == '5,35' && up.c && right.c && down.c && left.c) removeChild (block); block = null; newBlock ();  else if (String (position) == '35, 35 '&& up.d && right.d && down.d && left.d) removeChild (block); block = null; newBlock (); 

Si vous avez utilisé une présentation différente pour votre jeu, veillez à modifier la valeur que vous vérifiez (c.-à-d. Non '35, 35 ', car les blocs de votre jeu n'apparaîtront pas nécessairement à ce stade).


Étape 29: Démarrer la minuterie

La minuterie commence à compter lorsque la fonction est appelée pour la première fois..

 if (firstTime) / * Démarrer le minuteur * / timer.addEventListener (TimerEvent.TIMER, timesUp); timer.start (); counter.play ();  // termine la fonction newBlock ()

Étape 30: Des vies

Trois secondes sont données pour placer un bloc dans un conteneur carré. Si ce temps s'écoule et que le bloc est toujours dans le carré central, une vie est supprimée..

 fonction finale privée timesUp (e: TimerEvent): void / * Remove Live * / lives--; livesTF.text = String (vies); buzz.play ();

Étape 31: Blocs inutilisés

Après avoir retiré la vie, le bloc dans la case centrale sera détruit et un nouveau bloc sera généré. Ce code vérifie également si le lecteur est en fin de vie et appelle une fonction que nous écrirons plus tard..

 / * Supprimer le bloc inutilisé * / var i: int = blocks.length - 1; removeChild (blocs [i]); blocs [i] = null; blocks.splice (i, 1); / * Vérifier si hors de la vie * / si (vit < 1)  alert();  else  /* Next Block */ newBlock();  

Prenons une autre pause pour voir comment notre code fonctionne à ce stade:


Étape 32: Place des blocs

Cette fonction est activée lorsque le joueur clique sur l’un des carrés du conteneur. En gros, il vérifie si la bonne position est disponible pour placer le carré et le place si vrai. La fonction dans l'étape suivante est appelée quand le bloc est placé.

 fonction finale privée placeBlock (e: MouseEvent): void var i: int = blocks.length - 1; eventTarget = e.target; / * Vérifie si la position est disponible * / var position: Array = [currentXPosition, currentYPosition]; if (String (position) == '5,5' &&! e.target.a) blocs [i] .x = e.target.x + position [0]; blocs [i] .y = e.target.y + position [1]; e.target.a = true; blockPlaced ();  else if (String (position) == '35, 5 '&&! e.target.b) blocs [i] .x = e.target.x + position [0]; blocs [i] .y = e.target.y + position [1]; e.target.b = true; blockPlaced ();  else if (String (position) == '5,35' &&! e.target.c) blocs [i] .x = e.target.x + position [0]; blocs [i] .y = e.target.y + position [1]; e.target.c = true; blockPlaced ();  else if (String (position) == '35, 35 '&&! e.target.d) blocs [i] .x = e.target.x + position [0]; blocs [i] .y = e.target.y + position [1]; e.target.d = true; blockPlaced (); 

Encore une fois, vous devrez peut-être modifier les valeurs cochées ici pour qu'elles correspondent à la position de vos blocs..


Étape 33: Ajouter un bloc à un tableau

Lorsque le bloc est placé dans le conteneur, nous ajoutons le bloc au tableau qui enregistre les blocs stockés dans ce conteneur. Cela nous aidera à déterminer quand le conteneur est plein.

 fonction finale privée blockPlaced (): void var i: int = blocks.length - 1; / * Envoie un bloc au tableau de blocs du conteneur * / eventTarget.blocks.push (blocks [i]);

Étape 34: Score

Chaque bloc placé augmente le score d'un point. Lorsque la case est pleine, le score augmente de 50. Si la case est complètement remplie d’une seule couleur, le score total augmente de 200..

 score ++;

Étape 35: Son

Un bref son indiquera que le bloc a été placé.

 bell.play ();

Étape 36: Compléter le conteneur monochrome

Le code suivant vérifie si le conteneur a été rempli par un seul bloc de couleur à l'aide du tableau de conteneurs. Il incrémente la partition de 200, joue le son correspondant et fait rebondir le conteneur en tant que signe visuel. Il efface également les variables dans le conteneur.

 / * Si le conteneur est plein et que chaque bloc est de même couleur * / if (eventTarget.blocks.length == 4 && String (eventTarget.blocks [0]) == String (eventTarget.blocks [1]) && String (eventTarget. blocks [1]) == String (eventTarget.blocks [2]) && String (eventTarget.blocks [2]) == String (eventTarget.blocks [3])) score + = 200; bell4.play (); TweenNano.from (eventTarget, 0.4, x: eventTarget.x - 5, facilité: Bounce.easeOut, onComplete: function (): void pour (var j: int = 0; j < 4; j++)  removeChild(eventTarget.blocks[j]);  eventTarget.blocks = [];   ); eventTarget.a = false; eventTarget.b = false; eventTarget.c = false; eventTarget.d = false; 

Étape 37: Terminer le conteneur

Ce code est exécuté lorsque le conteneur est plein mais que les blocs à l'intérieur ne sont pas de la même couleur..

 / * Si le conteneur est plein mais que les blocs ont des couleurs différentes * / else if (eventTarget.blocks.length == 4) bell4.play (500, 2); score + = 50; TweenNano.from (eventTarget, 0.4, x: eventTarget.x - 5, facilité: Bounce.easeOut, onComplete: function (): void pour (var j: int = 0; j < 4; j++) removeChild(eventTarget.blocks[j]);  eventTarget.blocks = [];   ); eventTarget.a = false; eventTarget.b = false; eventTarget.c = false; eventTarget.d = false; 

Étape 38: Redémarrer la minuterie

Après avoir effacé tous les conteneurs, le score est défini sur le champ de texte de la scène, le temporisateur est réinitialisé et un autre bloc est appelé.

 scoreTF.text = Chaîne (score); timer.stop (); timer.start (); counter.gotoAndPlay (1); newBlock (); 

Étape 39: alerte

La fonction d'alerte est activée lorsque le joueur n'a plus de vie. il affiche le score final atteint et ajoute un auditeur pour revenir à l'écran titre.

 fonction finale privée alert (): void timer.stop (); counter.gotoAndStop (1); var alert: AlertView = new AlertView (); alert.messageBox.msgTF.text = 'Score:' + String (score); alert.addEventListener (MouseEvent.MOUSE_UP, redémarrer); addChild (alerte); TweenNano.from (alert.messageBox, 0.7, y: -alert.messageBox.height, facilité: Bounce.easeOut); 

Étape 40: Redémarrer

La fonction suivante rechargera le swf, en redémarrant une variable, une méthode et en retournant à la Écran titre.

 redémarrage de la fonction finale privée (e: MouseEvent): void browseToURL (new URLRequest (stage.loaderInfo.url), '_level0'); 

Conclusion

Vous avez créé un jeu très divertissant, essayez d'ajouter vos propres fonctionnalités et graphiques.

J'espère que vous avez aimé ce tutoriel, merci d'avoir lu!