Créez un jeu de boxe inspiré d'Atari avec AS3

Dans ce didacticiel Premium, vous apprendrez à créer un jeu rétro divertissant à l’aide de Flash et d’ActionScript 3.0. Découvrez la démo - le résultat est basé sur le classique Boxe pour l'Atari.


Étape 1: bref aperçu

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

Le joueur sera capable de se déplacer et de se battre contre l'adversaire dans le temps imparti.


É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, MovieClips et plus.

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


Étape 4: Contexte

Un simple rectangle vert remplira la scène.

Sélectionnez l'outil Rectangle (R) pour créer un rectangle de 320x480px # 649428 et le centrer sur la scène..


Étape 5: ring de boxe


'

En utilisant le même outil, créez une série de rectangles # FF9A2E pour créer un anneau de 290x213px.


Étape 6: personnages

Pour obtenir l’effet pixelisé sur les caractères, utilisez l’outil Rectangle pour créer de petits rectangles et carrés correspondant à l’image ci-dessus. Vous voudrez peut-être télécharger cette image et la placer sur un calque inférieur de votre plan de montage, puis y placer des rectangles.


Étape 7: Champs de texte dynamiques

Trois Dynamic TextFields sont placés dans la scène, ils serviront de compteurs de coups et de minuteur. Vérifiez l'image ci-dessus et placez-les en conséquence.


Étape 8: Incorporer la police

Pour utiliser une police personnalisée dans un champ de texte dynamique, nous devons d'abord l'intégrer..

Une fois le champ de texte sélectionné, accédez au panneau de propriétés et cliquez sur le bouton incorporer. Une boîte de dialogue s'affiche pour vous permettre de sélectionner les personnages nécessaires à votre jeu. Sinon, il suffit de cocher "majuscule", "minuscule", "chiffres" et "ponctuation".


Étape 9: noms d'instance

Convertissez les formes de la scène en MovieClip et donnez-leur les noms d'occurrence indiqués dans l'image.


Étape 10: Tween Nano

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 Tween Nano depuis son site officiel.


Étape 11: 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 12: 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 13: 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.utils.Timer; import flash.events.TimerEvent; import flash.events.KeyboardEvent; import flash.events.Event; import com.greensock.TweenNano; import flash.events.MouseEvent; import flash.net.navigateToURL; import flash.net.URLRequest;

Étape 14: 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 aucun commentaire.

 var timer privé: Timer = new Timer (1000); // utilisé pour diminuer le temps privé var min: int = 2; // nombre total de minutes de combat privé var secondes: int = 0; // secondes de début private var moveLeft: Boolean = false; // les prochains vars sont utilisés pour déplacer le joueur de manière fluide privé var moveRight: Boolean = false; private var moveUp: Boolean = false; private var moveDown: Boolean = false; private var eTimer: Minuterie = nouvelle minuterie (50); // le décalage du mouvement ennemi

Étape 15: 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. Il s'exécute également lorsque le fichier SWF est chargé si une partie de la classe.

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 16: Arrêtez les caractères

Nous allons commencer par appeler la fonction addListeners et arrêter les animations des personnages..

 addListeners (); / * Arrêtez MovieClips * / player.stop (); ennemi.stop ();

Étape 17: Ajouter des auditeurs

Ensuite, nous ajoutons la clé nécessaire et les écouteurs enterframe.

 fonction finale privée addListeners (): void stage.addEventListener (KeyboardEvent.KEY_DOWN, movePlayer); stage.addEventListener (KeyboardEvent.KEY_UP, stopPlayer); stage.addEventListener (KeyboardEvent.KEY_DOWN, hit); stage.addEventListener (KeyboardEvent.KEY_UP, resetHit); stage.addEventListener (Event.ENTER_FRAME, mise à jour);

Étape 18: Ajouter des minuteries

? Suivie par les timers requis:

 / * Timers * / timer.addEventListener (TimerEvent.TIMER, updateCounter); timer.start (); eTimer.addEventListener (TimerEvent.TIMER, ennemisUpdate); eTimer.start (); 

Étape 19: compteur de temps

Cette fonction s'exécute toutes les secondes, elle gère la minuterie dans la scène.

 fonction finale privée updateCounter (e: TimerEvent): void / * Réduire le temps * / secs--; si (secondes < 0)  secs = 59; min--;  if(min == 0 && secs == 0) //remove listeners if out of time  removeListeners(); 

Étape 20: Minuterie à deux chiffres

Nous ajouterons un 0 à gauche des secondes si le nombre est inférieur à 10 (donc le chronomètre aura toujours deux chiffres).

 / * Horloge à deux chiffres * / var s: String = "; if (String (secondes) .length == 1) s = '0'; else s =";  time.text = String (min) + ':' + s + String (secs); 

Étape 21: déplacer le joueur

Ici, nous détectons la touche appuyée et changeons la variable en conséquence. Nous pourrions déplacer le joueur en utilisant cette même fonction, mais le mouvement ne sera pas fluide, comme si nous utilisions un événement d'entreprise..

 fonction finale privée movePlayer (e: KeyboardEvent): void / * Movement * / if (e.KeyCode == 37) moveRight = false; moveLeft = true;  else if (e.keyCode == 39) moveLeft = false; moveRight = true;  if (e.keyCode == 38) moveDown = false; moveUp = true;  else if (e.keyCode == 40) moveUp = false; moveDown = true; 

Étape 22: Arrêtez le joueur

Cette fonction détecte la touche relâchée pour arrêter le mouvement du joueur..

 fonction finale privée stopPlayer (e: KeyboardEvent): void if (e.KeyCode == 37) moveLeft = false;  else if (e.keyCode == 39) moveRight = false;  if (e.keyCode == 38) moveUp = false;  else if (e.keyCode == 40) moveDown = false;  if (e.KeyCode == 90 || e.keyCode == 88) player.gotoAndStop (1); 

Étape 23: Définir la classe principale

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

Ajoutez le nom de la classe à la Classe champ dans le Publier section de la Propriétés panneau pour associer la FLA à la classe de document Main.

Maintenant, essayez-le. La minuterie devrait compter à rebours et les images devraient apparaître, mais le mouvement ne fonctionnera pas encore:

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 source. Si, pour une raison quelconque, votre fichier ne l'imite pas, jetez un coup d'œil à la source pour voir ce qui pourrait le causer..


Étape 24: Attaque du joueur

Cette fonction modifie l'image du MovieClip du joueur en image d'attaque..

 fonction finale privée hit (e: KeyboardEvent): void if (e.CodeCode == 90) // touche Z stage.removeEventListener (KeyboardEvent.KEY_DOWN, hit); player.scaleY = 1; player.gotoAndPlay (2);  else if (e.keyCode == 88) // X key stage.removeEventListener (KeyboardEvent.KEY_DOWN, hit); player.scaleY = -1; // change l'échelle pour utiliser un autre arm player.gotoAndPlay (2); 

Étape 25: Arrêter l'attaque du joueur

Arrête les attaques des joueurs.

 fonction finale privée resetHit (e: KeyboardEvent): void if (e.KeyCode == 90 || e.keyCode == 88) stage.addEventListener (KeyboardEvent.KEY_DOWN, hit); 

Étape 26: Fonction de mise à jour

L'une des principales fonctions de la classe contient le code logique qui sera exécuté sur enterframe. J'ai cassé l'explication au cours des prochaines étapes.

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

Étape 27: Contrôles

Vérifiez les variables de mouvement pour déplacer le joueur.

 / * Contrôles * / if (moveLeft) player.x - = 4;  else if (moveRight) player.x + = 4;  if (moveUp) player.y - = 4;  else if (moveDown) player.y + = 4; 

Étape 28: Bordures de la scène (joueur)

Empêcher le joueur de quitter l'anneau.

 / * Player Borders * / if (player.hitTestObject (topWall)) player.y = topWall.y + topWall.height + player.height * 0.5;  else if (player.hitTestObject (bottomWall)) player.y = bottomWall.y - player.height * 0.5 - bottomWall.height;  if (player.hitTestObject (leftWall)) player.x = leftWall.x + leftWall.width + player.width * 0.5;  else if (player.hitTestObject (rightWall)) player.x = rightWall.x - player.width * 0.5; 

Étape 29: Étapes de l'étape (adversaire)

Empêcher l'ennemi de quitter le ring.

 / * Frontières ennemies * / if (ennemis.hitTestObject (topWall)) ennemis.y = topWall.y + topWall.height + ennemis.height * 0.5;  else if (ennemis.hitTestObject (bottomWall)) ennemis.y = bottomWall.y - ennemis.height * 0.5 - bottomWall.height;  if (ennemis.hitTestObject (leftWall)) ennemis.x = leftWall.x + leftWall.width + ennemis.width * 0.5;  else if (ennemis.hitTestObject (rightWall)) ennemis.x = rightWall.x - ennemis.width * 0.5; 

Étape 30: Collisions joueur-adversaire

Les personnages sont repoussés en cas de collision (pas d'attaque).

 / * Hit * / if (player.hitTestObject (ennemi)) player.x = player.x - 5; ennemi.x = ennemi.x + 5; 

Faisons une autre pause pour voir comment notre code fonctionne à ce stade. Utilisez les touches fléchées pour vous déplacer et Z / X pour perforer:


Étape 31: Coups de joueur-adversaire

Un coup sera ajouté au compteur lorsque le poing joueur / ennemi frappe la tête de l'ennemi / joueur.

 / * Coup de tête * / if (player.currentFrame! = 1 && player.fist.hitTestObject (ennemis.head)) playerHits.text = String (int (playerHits.text) + 1); player.x = ennemi.x - player.width - 26;  if (ennemis.currentFrame! = 1 && ennemis.fist.hitTestObject (player.head)) ennemisHits.text = Chaînes (int (ennemisHits.text) + 1); ennemi.x = joueur.x + ennemi.width + 26; 

Étape 32: Fonction IA ennemie

La deuxième fonction principale, cette fois-ci manipulant l'IA ennemi.

 fonction finale privée ennemisUpdate (e: TimerEvent): void 

Étape 33: Mouvement ennemi

Ces lignes contrôlent le mouvement ennemi.

 / * Mouvement ennemi * / if (ennemis.x> joueur.x + 40) ennemis.x - = 4;  si (ennemi.x < player.x)  enemy.x += 4;  if(enemy.y > joueur.y) ennemi.y - = 4;  si (ennemi.y < player.y)  enemy.y += 4; 

Étape 34: Attaque ennemie

Ce code gère l'attaque de l'ennemi. Il vérifie fondamentalement sa position et frappe lorsque le poing peut frapper la tête du joueur..

 / * Attaque ennemie * / if (ennemi.y> joueur.y + 10 && ennemi.y < player.y + 21)  enemy.scaleY = 1; enemy.gotoAndPlay(2);  else if(enemy.y < player.y - 10 && enemy.y > player.y - 21) ennemis.scaleY = -1; ennemi.gotoAndPlay (2);  else if (joueur.x - ennemi.x> = -40 && joueur.x - ennemi.x <= -30)  enemy.gotoAndPlay(2);  else  enemy.gotoAndStop(1);  

Étape 35: Supprimer les auditeurs

Les auditeurs seront retirés à la fin du temps imparti.

 fonction finale privée removeListeners (): void stage.removeEventListener (KeyboardEvent.KEY_DOWN, movePlayer); stage.removeEventListener (KeyboardEvent.KEY_UP, stopPlayer); stage.removeEventListener (KeyboardEvent.KEY_DOWN, hit); stage.removeEventListener (KeyboardEvent.KEY_UP, resetHit); stage.removeEventListener (Event.ENTER_FRAME, mise à jour);

Étape 36: Arrêter les minuteries

? Comme les timers.

 / * Arrêter les minuteries * / timer.stop (); timer.removeEventListener (TimerEvent.TIMER, updateCounter); eTimer.stop (); eTimer.removeEventListener (TimerEvent.TIMER, ennemisUpdate); ennemi.gotoAndStop (1); showAlert (); 

Étape 37: Afficher l'alerte

Une alerte sera affichée après cela, ce code instancie l'alerte.

 fonction finale privée showAlert (): void var alert: AlertView = new AlertView (); alert.x = stage.stageWidth * 0.5; alert.y = stage.stageHeight * 0,5;

Étape 38: Vérifier la victoire ou la perte

Afin d’afficher le texte correct dans l’alerte, nous vérifions les compteurs de hits pour déterminer le résultat..

 / * Recherchez les gains ou les pertes en fonction des résultats * / if (int (playerHits.text)> int (ennemiHits.text)) alert.msg.text = 'vous gagnez!';  else if (int (playerHits.text) < int(enemyHits.text))  alert.msg.text = 'you lose!';  else  alert.msg.text = 'draw!';  TweenNano.from(alert, 0.3, scaleX: 0.5, scaleY: 0.5); alert.addEventListener(MouseEvent.MOUSE_UP, restart); addChild(alert); 

Étape 39: Redémarrez

La fonction suivante rechargera le fichier SWF, réinitialisant toutes les variables et revenant au premier écran..

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

Étape 40: test

Nous sommes maintenant prêts à tester notre jeu et à vérifier que tout fonctionne comme prévu.


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!