CoronaSDK Créer un jeu de rebond divertissant

Dans ce tutoriel, je vais vous montrer comment créer un jeu qui rebondit avec le SDK Corona. Vous en apprendrez plus sur l'API de dessin, les commandes tactiles et les nombres aléatoires. L'objectif de ce jeu est d'utiliser une pagaie pour empêcher les balles de toucher le sol. Pour en savoir plus, lisez la suite!

1. Aperçu de l'application

Nous utiliserons des graphiques prédéfinis pour coder un jeu passionnant à l'aide des API Lua et Corona SDK.

Une fois l'opération terminée, le lecteur utilisera l'écran tactile de l'appareil pour contrôler une raquette. Les paramètres du code peuvent être modifiés pour personnaliser le jeu..


2. Dispositif cible

La première chose à faire est de sélectionner la plateforme sur laquelle vous souhaitez exécuter notre application. Ainsi, nous pourrons choisir la taille des images que nous utiliserons..

La plateforme iOS présente les caractéristiques suivantes:

  • iPad 1/2 / Mini: 1024x768px, 132 ppi
  • iPad Retina: 2048x1536, 264 ppp
  • iPhone / iPod Touch: 320 x 480 pixels, 163 ppp
  • iPhone / iPod Retina: 960x640px, 326 ppi
  • iPhone 5 / iPod Touch: 1136x640, 326 ppi

Android étant une plate-forme ouverte, il existe de nombreux appareils et résolutions. Certaines des caractéristiques d'écran communes sont:

  • Asus Nexus 7 Tablet: 800x1280px, 216 ppp
  • Motorola Droid X: 854x480px, 228 ppi
  • Samsung Galaxy SIII: 720x1280px, 306 ppi

Dans ce tutoriel, nous allons nous concentrer sur la plate-forme iOS avec la conception graphique, spécialement conçue pour la distribution sur un iPhone / iPod touch, mais le code présenté ici s'applique également au développement Android avec le SDK Corona..


3. interface

Une interface simple et conviviale sera utilisée. Cela implique plusieurs formes, boutons, bitmaps, etc..

Les ressources graphiques d'interface nécessaires à ce tutoriel sont disponibles dans le téléchargement ci-joint..


4. Exporter des graphiques

Selon le périphérique sélectionné, vous devrez peut-être exporter les graphiques dans l'IPP recommandé. Vous pouvez le faire avec votre éditeur d'image préféré.

J'ai utilisé le Ajuster la taille… fonction dans l'application Aperçu sur Mac OS X.

N'oubliez pas de donner un nom descriptif aux images et de les enregistrer dans votre dossier de projet..


5. Configuration de l'application

Nous utiliserons un fichier externe pour que l’application devienne plein écran sur tous les appareils (le config.lua fichier). Ce fichier indique la taille d'écran d'origine et la méthode utilisée pour redimensionner ce contenu si l'application s'exécute dans une résolution d'écran différente..

 application = contenu = largeur = 320, hauteur = 480, échelle = "boîte aux lettres",

2. Main.lua

Ecrivons l'application!

Ouvrez votre éditeur Lua préféré (n'importe quel éditeur de texte fonctionnera, mais vous n'aurez pas la coloration syntaxique en surbrillance) et préparez-vous à écrire votre superbe application. N'oubliez pas de sauvegarder le fichier sous main.lua dans votre dossier de projet.


7. Structure du code

Nous structurerons notre code comme s'il s'agissait d'une classe. Si vous connaissez ActionScript ou Java, vous trouverez la structure familière..

 Classes nécessaires Variables et constantes Déclarer des fonctions méthodes de classe du constructeur (fonction principale) (autres fonctions) appelle la fonction principale

8. Masquer la barre d'état

 display.setStatusBar (display.HiddenStatusBar)

Le code ci-dessus masque la barre d'état. La barre d'état est la barre en haut de l'écran de l'appareil qui affiche l'heure, le signal et d'autres indicateurs..


9. Contexte

Un simple vecteur est utilisé comme arrière-plan pour l'interface de l'application. La ligne de code suivante le crée.

 -- Graphiques - [Arrière-plan] local bg = display.newRect (0, 0, display.contentWidth, display.contentHeight) bg: setFillColor (52, 46, 45)

10. Vue du titre

Ceci est la vue du titre, ce sera le premier écran interactif à apparaître dans notre jeu. Ces variables stockent ses composants:

 -- [Vue titre] local title local playBtn local creditsBtn local titleView

11. Credits Voir

Cette vue montrera le générique et le copyright du jeu. Cette variable sera utilisée pour le stocker:

 -- [CreditsView] crédits locauxVoir

12. Message d'instruction

Un message d'instruction apparaîtra au début du jeu et sera interpolé après 2 secondes. Vous pouvez changer l'heure plus tard dans le code.

 -- Instructions locales ins

13. Cercles de couleur

Voici les cercles ou les balles. L’objectif du jeu est de les empêcher de toucher le bas de l’écran.

 -- Cercles de couleur cercles locaux = display.newGroup ()

14. Alerte

C'est l'alerte qui sera affichée quand une balle touche le sol. Il affichera le score et mettra fin au jeu..

 -- Alerte locale alertVoir

15. sons

Nous utiliserons des effets sonores pour améliorer le ressenti du jeu. Les sons utilisés dans ce jeu ont été créés dans as3sfxr.

 -- Sons locaux bounceSnd = audio.loadSound ('bounce.wav') local perdSnd = audio.loadSound ('lost.wav')

16. variables

Ce sont les variables que nous allons utiliser. Vous pouvez lire les commentaires dans le code pour en savoir plus à leur sujet..

 -- Variables locales circleTimer - Ajoute chaque fois un nouveau cercle appelé couleurs locales = 71, 241, 255, 255, 204, 0, 245, 94, 91, 0, 255, 204,  250, 140, 254, - Couleurs possibles pour les cercles (R, G, B)

17. Déclarer des fonctions

Ensuite, déclarez toutes les fonctions en tant que local au début.

 -- Fonctions local Main =  startButtonListeners local =  showCredits local =  hideCredits local =  showGameView local =  gameListeners local =  local moveBar =  local addCircle =  localCollision =  local alert =  

18. constructeur

Au cours de cette étape, nous allons créer la fonction qui initialise la logique du jeu:

 fonction Main () - code… fin

19. Ajouter une vue du titre

Maintenant nous allons placer le TitleView dans la scène et appeler une fonction qui ajoute le robinet les auditeurs aux boutons.

 function Main () title = display.newImage ('title.png') playBtn = display.newImage ('playBtn.png', 130, 248) creditsBtn = display.newImage ('creditsBtn.png', 125, 316) titleView = display.newGroup (title, playBtn, creditsBtn) startButtonListeners ('add') end

20. Bouton de démarrage auditeurs

Cette fonction ajoute les auditeurs nécessaires à la TitleView boutons:

 function startButtonListeners (action) if (action == 'add'), puis playBtn: addEventListener ('tap', showGameView) creditsBtn: addEventListener ('tap', showCredits) sinon playBtn: removeEventListener ('tap', showGameView) 'tap', showCredits) end end

21. Afficher les crédits

L’écran des crédits s’affiche lorsque l’utilisateur appuie sur le bouton sur bouton, un robinet écouteur est ajouté à la vue des crédits pour le supprimer.

 function showCredits: tap (e) playBtn.isVisible = false creditsBtn.isVisible = false creditsView = display.newImage ('credits.png', 0, display.contentHeight) transition.to (creditsView, heure = 300, y = affichage. contentHeight - (creditsView.height - 40), onComplete = fonction () creditsView: addEventListener ('tap', hideCredits) fin) fin

22. Masquer les crédits

Lorsque l'écran des crédits est exploité, il sera interpolé hors de la scène et supprimé.

 function hideCredits: tapez (e) transition.to (creditsView, heure = 300, y = display.contentHeight + 40, onComplete = fonction () creditsBtn.isVisible = true playBtn.isVisible = vrai creditsView: removeEventListener ('tap', hideCredits ) display.remove (creditsView) creditsView = nil fin) fin

23. Afficher la vue du jeu

Quand le Jouer le bouton est tapé, le TitleView est interpolé et supprimé, révélant la GameView. Il y a beaucoup de parties impliquées dans cette vue, nous allons donc les séparer dans les prochaines étapes.

 function showGameView: tapez sur (e) transition.to (titleView, heure = 300, x = -titleView.height, onComplete = fonction () startButtonListeners ('rmv') display.remove (titleView) titleView = nil end)

24. Message d'instructions

Les lignes suivantes ajoutent le message d'instructions:

 ocal ins = display.newImage ('ins.png', 160, 355) transition.from (ins, heure = 200, alpha = 0,1, onComplete = fonction () timer.performWithDelay (2000, function () transition.to ( ins, heure = 200, alpha = 0.1, onComplete = fonction () display.remove (ins) ins = nil fin) fin) fin)

25. Ajouter une pagaie

Cette étape crée la raquette et la place sur la scène. Un nom peut être ajouté ultérieurement pour un accès plus facile.

 -- Ajouter une barre = display.newRoundedRect (70, 340, 160, 10, 3) bar.name = 'bar'

26. murs

Maintenant, nous allons créer des murs autour de l'écran pour empêcher les balles de quitter la scène.

 -- Murs left = display.newLine (0, 240, 0, 720) left.isVisible = false à droite = display.newLine (320, 240, 320, 720) right.isVisible = false en bas = display.newLine (160, 480, 480 , 480) bottom.isVisible = false

27. Score

Voici un score Champ de texte créer en haut à droite de la scène:

 -- Score score = display.newText ('0', 300, 0, 'Futura', 15)

28. physique

Ensuite, nous devons ajouter de la physique à nos objets. Ici, nous allons utiliser le Filtre propriété qui empêche certains objets d'entrer en collision les uns avec les autres. Cela empêche nos cercles d'entrer en collision tout en maintenant les collisions entre les murs et la pagaie. Vous pouvez trouver une explication simple de son comportement sur le site Corona..

 -- Physique physique.addBody (barre, 'statique', filtre = categoryBits = 4, maskBits = 7) physics.addBody (gauche, 'statique', filter = categoryBits = 4, maskBits = 7) physique .addBody (right, 'static', filter = categoryBits = 4, maskBits = 7) physics.addBody (en bas, 'static', filter = categoryBits = 4, maskBits = 7) gameListeners (' ajouter ') end

29. Auditeurs de jeu

La fonction suivante ajoute les écouteurs nécessaires pour démarrer la logique de jeu:

 fonction gameListeners (action) if (action == 'add') puis bg: addEventListener ('touch', moveBar) circleTimer = timer.performWithDelay (2000, addCircle, 5) barre: addEventListener ('collision', onCollision) en bas: addEventListener ('collision', alerte) else bg: removeEventListener ('touch', moveBar) timer.cancel (circleTimer) circleTimer = nil barre: removeEventListener ('collision', onCollision) bas: removeEventListener ('collision', alerte) end end

30. déplacer la pagaie

Toucher l'arrière-plan appelle la fonction suivante qui gère le mouvement de la palette. Il suit le doigt et reste dessus.

 function moveBar (e) if (e.phase == 'déplacé') puis bar.x = e.x bar.y = e.y - 40 end - Laisse la barre 1/3 à partir du haut si (bar.y < 160) then bar.y = 160 end end

31. Ajouter un cercle

le circleTimer appelle ce code. Il crée un cercle ou une balle en haut de l'écran (qui est ensuite déplacé vers le bas par gravité) et lui donne une taille et une couleur aléatoires choisies dans notre couleurs Table. Les valeurs de couleur sont ensuite stockées dans pour modifier également la palette. Un petit coup de pouce est ajouté dans une direction aléatoire calculée par le dir et r les variables.

 fonction addCircle () local r = math.floor (math.random () * 12) + 13 local c = display.newCircle (0, 0, r) cx = math.floor (math.random () * (display.contentWidth - (r * 2))) cy = - (r * 2) - Couleur du cercle, couleur locale = math.floor (math.random () * 4) + 1 c.c1 = couleurs [couleur] [1] c. c2 = couleurs [couleur] [2] c.c3 = couleurs [couleur] [3] c: setFillColor (c.c1, c.c2, c.c3) physics.addBody (c, 'dynamique', radius = r , bounce = 0,95, filter = categoryBits = 2, maskBits = 4) cercles: insérer (c) --déplacer horizontalement le répertoire local if (r < 18) then dir = -1 else dir = 1 end c:setLinearVelocity((r*2) * dir, 0 ) end

32. Collisions

Cette fonction est activée lorsque la raquette entre en collision avec une balle. Il joue un son, augmente le score et change la couleur de la palette.

 function onCollision (e) audio.play (bounceSnd) bar: setFillColor (e.other.c1, e.other.c2, e.other.c3) score.text = chaîne (tonumber (score.text) + 50) score: setTextColor (e.other.c1, e.other.c2, e.other.c3) score.x = 300 fin

33. Alerte

La fonction d'alerte crée une vue d'alerte, l'anime et met fin au jeu..

 function alert () audio.play (lostSnd) gameListeners ('rmv') alertView = display.newImage ('alert.png', 90, 200) transition.from (alertView, heure = 200, alpha = 0.1) score localTF = display.newText (score.text, 145, 253, 'Futura', 17) scoreTF: setTextColor (255, 255, 255) - Attendez 100 ms pour arrêter la physique timer.performWithDelay (100, function () physics.stop ( ) fin, 1) fin

34. Appel de la fonction principale

Afin de démarrer le jeu, le Principale la fonction doit être appelée. Avec le code ci-dessus en place, nous le ferons ici:

 Principale()

35. Écran de chargement

le Default.png fichier est une image affichée au démarrage de l'application pendant qu'iOS charge les données de base à afficher dans l'écran principal. Ajoutez cette image dans le dossier source de votre projet, elle sera ensuite ajoutée automatiquement par le complémenteur Corona..


36. icône

En utilisant les graphiques que vous avez créés précédemment, vous pouvez maintenant créer une belle icône. La taille de l'icône de l'iPhone non rétinien est de 57x57px, mais la version de la rétine est de 114x114px. Gardez à l'esprit que l'iTunes Store nécessite une version de 512x512px. Je suggère de créer d'abord la version 512x512, puis de la réduire pour les autres tailles.

Il n'est pas nécessaire que les angles soient arrondis ou les reflets transparents, iTunes et l'iPhone le font pour vous..


37. Test en simulateur

C'est l'heure du test final. Ouvrez le simulateur Corona, accédez au dossier de votre projet, puis cliquez sur Ouvrir. Si tout fonctionne comme prévu, vous êtes prêt pour la dernière étape!


38. Construire

Dans le simulateur Corona, accédez à Fichier> Construire et sélectionnez votre appareil cible. Remplissez les données requises et cliquez sur Construire. Attendez quelques secondes et votre application est prête pour le test de l'appareil et / ou la soumission pour la distribution.!


Conclusion

Dans ce tutoriel, nous avons appris à dessiner des API, des minuteries, des nombres aléatoires et d'autres compétences pouvant s'avérer extrêmement utiles dans un grand nombre de jeux..

Expérimentez avec le résultat final et essayez de créer votre propre version personnalisée du jeu.!

J'espère que vous avez apprécié ce didacticiel et que vous l'avez trouvé utile. Merci pour la lecture!