Créer un jeu de ballon ballon en Flash

L'un des jeux Flash les plus populaires à ce jour est Bloons, dans lequel vous incarnez un singe à lancer des fléchettes à des ballons éclatants. Il a engendré de nombreuses suites, allant même jusqu'à d'autres genres comme la tour de défense. Ce didacticiel vous montrera comment créer votre propre jeu de bulles à l'aide du moteur QuickBox2D..


Aperçu du résultat final

Jetons un coup d'œil au résultat final sur lequel nous allons travailler:

Cliquez et maintenez enfoncé pour déterminer l'angle du tir. Essayez de faire éclater tous les ballons!


Étape 1: bref aperçu

Dans ce didacticiel, nous allons utiliser une série de classes ActionScript pour créer un jeu Bloons Inspired. L’objectif du jeu est de tirer sur les ballons pour les faire éclater tous.


Étape 2: Paramètres du document Flash

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


Étape 3: interface

Une interface colorée et simple sera utilisée, comportant plusieurs formes, boutons et MovieClips. Au cours des prochaines étapes, nous allons construire cette interface graphique. Les graphiques de l'écureuil et du gland proviennent de openclipart.org.


Étape 4: Contexte

Cet arrière-plan a été créé en Flash à l'aide de simples formes rectangulaires et ovales. La barre brune en bas servira de barre d’information.


Étape 5: Titre et ballons

Pour créer le titre, sélectionnez l'outil Texte (T) et changez la couleur en #EEEEEE; écrivez votre texte de titre (j'ai utilisé la police GoodDog) et ajoutez une simple ombre portée. Pour la bulle, sélectionnez l'outil Ovale (O) et créez un ovale 20x30 px # FFCE47. Utilisez l'outil Poly Star pour le petit triangle situé en dessous..


Étape 6: boutons

Utilisez à nouveau le Outil texte pour créer deux boutons comme indiqué dans l'image ci-dessus. Convertissez-les en boutons et donnez-leur des noms d'instances descriptifs afin que nous puissions facilement les utiliser plus tard dans le code. Convertir les graphiques sur la scène en un seul MovieClip et nommez-le TitleView - n'oubliez pas de vérifier la Exporter pour la boîte ActionScript.


Étape 7: Écran de jeu

Ceci est l'écran de jeu, qui contient tous les éléments dynamiques et interactifs du jeu. D'autres seront générés au moment de l'exécution à l'aide d'ActionScript. Vous pouvez lire les noms d'occurrence dans l'image ci-dessus.


Étape 8: écran des crédits

le Crédits l'écran apparaîtra devant le Titre écran; utilisez les graphiques et les polices d’avant pour le créer. Nomme le CréditsVoir et n'oubliez pas de vérifier la Exporter pour ActionScript boîte.


Étape 9: alerte

Une alerte sera affichée lorsque tous les ballons auront été sautés. il affichera un message de jeu et le score. Utilisez le Outil Rectangle pour le créer et définir son nom d'instance sur AlertView. Encore une fois, marquez le Exporter pour ActionScript boîte.


Étape 10: sons

Nous utiliserons des effets sonores pour améliorer le ressenti du jeu. vous pouvez trouver le son utilisé dans cet exemple sur Soungle.com en utilisant le mot-clé pop.


Étape 11: TweenNano

Nous utiliserons un moteur d'interpolation différent de celui par défaut inclus dans Flash, ce qui augmentera les performances et sera plus facile à utiliser..

Vous pouvez télécharger TweenNano depuis son site officiel.


Étape 12: QuickBox 2D

Nous allons utiliser la bibliothèque de physique utile QuickBox2D pour créer ce jeu. Si vous ne le connaissez pas, vous pouvez suivre la série Introduction de Activetuts.+.

Vous pouvez télécharger QuickBox2D depuis son site officiel.


Étape 13: Définir la classe de document


Nous allons rendre notre application interactive en utilisant une classe externe. Ajouter son nom à la Classe champ dans le Publier section de la Propriétés panneau pour associer la FLA à la classe de document Main.


Étape 14: Créer 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 15: 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 16: Classes requises

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

 import flash.display.MovieClip; importer com.actionsnippet.qbox. *; import com.greensock.TweenNano; importer com.greensock.easing.Expo; import flash.events.MouseEvent; importer Box2D.Common.Math. *; import flash.events.Event; import flash.net.navigateToURL; import flash.net.URLRequest;

Étape 17: Variables

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

 private var titleView: TitleView = new TitleView (); crédits var privés: CreditsView; monde var privé: QuickBox2D; private var acorn: QuickObject; private var acorns: Array = []; // stocke les glands jetés. Contacts var privés: QuickContacts; // utilisé pour gérer les collisions dans quickbox2d private var balloons: Array = []; // stocke les ballons au stade private var yImpulse: Number = 0; // force verticale pour tirer le gland privé var xImpulse: int = 3; // force horizontale par défaut du gland levé private var pop: Pop = new Pop (); // le son dans la bibliothèque

Étape 18: 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. Le constructeur de la classe de document est un cas particulier: il s'exécute au début du jeu..

Nous l'utilisons pour appeler les fonctions nécessaires au démarrage du jeu. Vérifiez ces fonctions dans les prochaines étapes.

 fonction finale publique Main (): void // Code

Étape 19: Ajouter la vue du titre

Nous commençons par ajouter TitleView de la bibliothèque à la scène.

 addChild (titleView); startButtonListeners ();

Étape 20: Boutons Démarrer les auditeurs

Cela ajoutera les écouteurs de la souris aux boutons de la vue du titre, ce qui nous mènera à l'écran de jeu ou de crédits..

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

Étape 21: Afficher les crédits

le Crédits L’écran s’affiche lorsque l’utilisateur clique sur le bouton Crédits. Un écouteur de souris est ajouté au complet MovieClip l'enlever.

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

Étape 22: masquer les crédits

Quand le Crédits l'écran est cliqué, il sera interpolé et retiré de la scène.

 fonction finale privée hideCredits (e: MouseEvent): void TweenNano.to (crédits, 0.3, x: -credits.width, onComplete: function (): void titleView.creditsBtn.visible = true; titleView.playBtn.visible = true; credits.removeEventListener (MouseEvent.MOUSE_UP, hideCredits); removeChild (crédits); credits = null;); 

Étape 23: Afficher la vue de jeu

Les lignes suivantes suppriment le Titre écran et quitter le Jeu Écran visible. Ici, nous appelons également les fonctions nécessaires pour démarrer le jeu; ces fonctions sont expliquées dans les prochaines étapes.

 fonction finale privée showGameView (e: MouseEvent): void TweenNano.to (titleView, 0.3, y: -titleView.height, onComplete: fonction (): void startButtonListeners ('rmv'); removeChild (titleView); titleView = null; startGame ();); 

Arrêtons-nous ici pour faire un test rapide et pour nous assurer que notre code de jeu fonctionne:

Gardez à l'esprit que certaines lignes ont été commentées, car certaines fonctions n'ont pas encore été créées..

Rappelez-vous que les jalons sont inclus dans les fichiers sources. Si, pour une raison quelconque, votre fichier ne l'imite pas, jetez un coup d'œil à la source pour voir ce qui le cause..


Étape 24: Auditeurs du jeu

Cette fonction ajoute les écouteurs de souris nécessaires pour effectuer la prise de vue en gland..

 fonction finale privée gameListeners (action: String = 'add'): void if (action == 'add') bg.addEventListener (MouseEvent.MOUSE_DOWN, startCharge); bg.addEventListener (MouseEvent.MOUSE_UP, shot); restartBtn.addEventListener (MouseEvent.MOUSE_UP, restartLvl); stage.addEventListener (Event.ENTER_FRAME, mise à jour);  else bg.removeEventListener (MouseEvent.MOUSE_DOWN, startCharge); bg.removeEventListener (MouseEvent.MOUSE_UP, shot); restartBtn.removeEventListener (MouseEvent.MOUSE_UP, restartLvl); stage.removeEventListener (Event.ENTER_FRAME, mise à jour); 

Étape 25: Démarrer le jeu

Ici, nous commençons le jeu en créant le monde Box2D et en appelant les fonctions qui créeront les bulles et géreront les événements de souris..

 fonction finale privée startGame (): void / * Hide gCircle * / gCircle.visible = false; / * Nouveau monde B2D * / world = new QuickBox2D (this, debug: 0); contacts = world.addContactListener (); contacts.addEventListener (QuickContacts.ADD, onAdd); / * Créer une fonction ballon * / gameListeners (); createBalloons (); 

Étape 26: Créer des ballons

Imbriqué pour Des boucles sont utilisées pour placer les ballons sur la scène. Cette fonction utilisera le QuickBox2D addBox méthode pour créer un nouvel objet Box2D qui sera défini comme Capteur - cela signifie qu'il n'y aura pas de réaction physique à la collision (le gland ne rebondira pas), mais une collision sera toujours détectée. En utilisant cette méthode, nous pouvons détruire le ballon mais laisser le gland continuer son chemin comme si de rien n'était..

Le ballon est ensuite ajouté à un tableau; cela nous donnera accès à tous les ballons en dehors de cette fonction.

 fonction finale privée createBalloons (h: int = 5, v: int = 3): void pour (var i: int = 0; i < h; i++)  for(var j:int = 0; j < v; j++)  var balloon:QuickObject = world.addBox(x:10 + (i * 0.66), y:4 + (j * 1), width: 0.66, height: 1, skin:Balloon, fixedRotation:true, draggable:false, density:0); balloon.shape.m_isSensor = true; balloons.push(balloon);   /* Set balloon counter */ targetTF.text = String(balloons.length); /* Start Physics */ world.start(); 

Bien sûr, vous n'avez pas besoin d'utiliser imbriqué pour boucles pour positionner les ballons; C’est le moyen le plus simple de les positionner dans une grille, mais vous pouvez les positionner manuellement si vous préférez..


Étape 27: Détection de collision

Cette fonction gère la collision mentionnée à l'étape 26. La première chose à faire est de parcourir le tableau de ballons, en vérifiant chacun d'eux pour voir s'il entre en collision avec le gland..

 fonction finale privée onAdd (e: Event): void pour (var i: int = 0; i < balloons.length; i++)  if(contacts.isCurrentContact(balloons[i], acorn)) 

Étape 28: Détruire le ballon

Si la collision est vraie, nous appelons le détruire() méthode de la bulle QuickObject et supprimer l'élément du tableau.

 ballons [i] .destroy (); balloons.splice (i, 1);

Étape 29: Jouer le son

Ensuite, nous émettons un son indiquant le coup, améliorant le sentiment de jeu..

 pop.play ();

Étape 30: Mettre à jour les compteurs de score et de cible

Les marqueurs de score et de cible sont mis à jour en fonction des ballons sautés et des ballons laissés..

 scoreTF.text = Chaîne (int (scoreTF.text) + 50); targetTF.text = String (balloons.length);

Étape 31: Vérification du niveau terminé

Une alerte est appelée lorsque tous les ballons sont éclatés; nous verrons cette fonction plus tard dans le tutoriel.

 if (targetTF.text == '0') alert (); 

Étape 32: charge de départ

Ce code révélera l'indicateur de direction du gland, réinitialisera la variable y d'impulsion du gland et ajoutera un écouteur enterframe qui gérera l'objectif..

 fonction finale privée startCharge (e: MouseEvent): void yImpulse = 0; gCircle.visible = true; gCircle.addEventListener (Event.ENTER_FRAME, charge); 

Étape 33: charger

L’indicateur de visée pivote pour indiquer la direction dans laquelle le gland sera tiré et ajuste la variable d’impulsion y en conséquence. La direction du tir est affectée par deux variables, xImpulse et y Impulse, qui sont combinés pour former un impulsion vecteur plus tard. xImpulse reste constant, et y Impulse est modifié lorsque l'utilisateur enfonce le bouton de la souris.

 taxe sur la fonction finale privée (e: événement): void gCircle.rotation - = 3; y Impulse - = 0,2; / * Empêche la rotation excessive * / if (gCircle.rotation < -80)  yImpulse = -5.4; gCircle.rotation = -80;  

Étape 34: Tir

Les actions suivantes se produisent lorsque le bouton de la souris est levé.

 prise de fonction finale privée (e: MouseEvent): void / * masquer gCircle * / gCircle.removeEventListener (Event.ENTER_FRAME, charge); gCircle.visible = false; gCircle.rotation = 0; / * Créer un nouveau gland * / acorn = world.addBox (x: 2.76, y: 7.33, width: 0.66, height: 0.53, skin: Acorn, fixedRotation: true, draggable: false, densité: 1); glands.push (gland); / * Shoot acorn * / var impulse: b2Vec2 = nouveau b2Vec2 (xImpulse, yImpulse); acorn.body.ApplyImpulse (impulse, acorn.body.GetWorldCenter ()); / * Mise à jour du compteur de glands * / acornsTF.text = String (int (acornsTF.text) -1); 

Arrêtons-nous ici pour faire un test rapide et pour nous assurer que notre code de jeu fonctionne:

Gardez à l'esprit que certaines lignes ont été commentées car ces fonctions n'ont pas encore été créées..


Étape 35: Fonction de mise à jour

La fonction de mise à jour effectuera une série d'opérations EnterFrame. Voyons ces actions dans les étapes suivantes.

 mise à jour de fonction finale privée (e: Event): void 

Étape 36: Supprimer les glands hors scène

Les lignes suivantes vont supprimer chaque gland qui sort de la scène.

 / * Enlevez les glands hors scène * / pour (var i: int = 0; i < acorns.length; i++)  if(acorns[i].y > 10.66) glands [i] .destroy (); glands.splice (i, 1);

Étape 37: Vérifier le niveau a échoué

La partie est terminée lorsque le joueur manque de glands (ou détruit tous les ballons mentionnés précédemment).

 / * Vérification du niveau échoué * / if (int (acornsTF.text) <= 0)  alert('lose');    

Étape 38: Niveau de redémarrage

Ce code s'exécute lorsque vous cliquez sur le bouton Redémarrer. Il va réinitialiser les variables nécessaires et les auditeurs pour redémarrer le niveau.

 fonction finale privée restartLvl (e: MouseEvent): void / * Supprimer les auditeurs * / gameListeners ('rmv'); / * Destroy World * / world = null; / * Détruire les ballons, réinitialiser le score et les glands * / pour (var i: int = 0; i < balloons.length; i++)  balloons[i].destroy(); scoreTF.text = '0'; acornsTF.text = '5';  balloons = [];//clear balloons array startGame(); 

Étape 39: alerte

Cette fonction arrêtera le jeu et affichera le message Game Over. Il ajoute également un écouteur de souris pour réinitialiser le jeu lorsque vous cliquez dessus..

 alerte de fonction finale privée (gameState: String = 'win'): void gameListeners ('rmv'); world.stop (); var alert: AlertView = new AlertView (); alert.x = stage.stageWidth * 0.5; alert.y = stage.stageHeight * 0,5; alert.scoreTF.text = scoreTF.text; alert.addEventListener (MouseEvent.MOUSE_UP, redémarrer); if (gameState == 'lost') alert.titleTF.text = 'Level Failed!';  addChild (alerte); TweenNano.from (alert, 0.6, scaleX: 0.2, scaleY: 0.2, facilité: Expo.easeOut); 

Étape 40: Redémarrer

Ce code rechargera le fichier SWF, restaurera les valeurs et reviendra à l'écran initial..

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

Conclusion

Faites vos propres modifications au jeu et profitez-en pour le créer. Peut-être que vous pourriez changer la disposition des bulles, ou ajouter de nouveaux niveaux, ou modifier les graphiques.

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