Écrire votre premier jeu Android avec le SDK Corona

Auteur: Randy Alexander
Date De Création: 1 Avril 2021
Date De Mise À Jour: 26 Juin 2024
Anonim
Écrire votre premier jeu Android avec le SDK Corona - Applications
Écrire votre premier jeu Android avec le SDK Corona - Applications

Contenu


La catégorie la plus populaire sur le Google Play Store a toujours été les jeux. Bien que nous utilisions probablement toutes des applications de productivité clés telles qu'un navigateur Web, un client de messagerie et une application de messagerie instantanée, les jeux restent une partie importante de l'expérience mobile. Il n’est donc pas surprenant que de nombreuses personnes désirant apprendre à développer pour Android souhaitent commencer par créer un jeu. En outre, soyons honnêtes, écrire un jeu est bien plus amusant que de développer une application de productivité!

La langue officielle d'Android est Java et l'environnement de développement officiel est Android Studio. Si vous souhaitez vous pencher sur Java, je vous suggère notre tutoriel sur les bases de Java, et si vous souhaitez apprendre à écrire une application à l'aide d'Android Studio, je vous suggère de consulter notre didacticiel sur l'écriture de votre première application Android. Cependant, Java et le studio Android ne sont pas les seuls moyens de développer pour Android. Vous trouverez un aperçu des langues et des kits SDK disponibles dans notre guide: Je souhaite développer des applications Android - Quelles langues dois-je apprendre?


Un des SDK mentionné dans le guide des langages de programmation est Corona, un SDK tiers conçu principalement pour l’écriture de jeux. Au lieu de Java, Corona utilise Lua, un langage de script rapide, facile à apprendre et puissant. Cependant, Corona n’est pas le seul SDK de jeu mobile qui utilise Lua. Parmi d’autres exemples bien connus, citons Cocos2d-X, Marmalade et Gideros.

Télécharger et installer

Pour commencer à utiliser Corona, vous devez télécharger et installer le SDK. Allez sur le site Web Corona et cliquez sur le bouton de téléchargement. Vous devrez créer un compte (gratuit) avant de pouvoir télécharger le kit. Si vous souhaitez créer un fichier .apk réel plutôt que d'exécuter votre programme dans l'émulateur, vous devez installer Java 7, mais vous n'aurez pas besoin d'installer le SDK Android. Pour installer le kit de développement Java 7, rendez-vous sur le site Web d’Oracle, recherchez la section intitulée «Kit de développement Java SE 7u79» et téléchargez la version pour votre PC.


Une fois Corona installé, vous devez l'activer. Ceci est un processus unique, qui est gratuit. Démarrez le simulateur Corona et acceptez la licence. Entrez l'adresse e-mail et le mot de passe que vous avez utilisés pour le téléchargement, puis cliquez sur Connexion.

Lancer le projet

Dans Corona Simulator, cliquez sur "Nouveau projet". Saisissez un nom pour votre application dans le champ "Nom de l'application:" et laissez le reste des paramètres à leurs valeurs par défaut. Cliquez sur OK."

Trois fenêtres vont maintenant apparaître. Les deux premiers sont le simulateur Corona et la sortie Corona Simular. Corona ouvrira également une fenêtre d’explorateur de fichiers contenant les fichiers de votre projet.

La majorité des fichiers (environ 23) dans le répertoire du projet sont pour l'icône de l'application! Le fichier le plus important pour nous en ce moment est main.lua, car c’est là que nous écrirons le code de notre application.

Introduction à Lua

Avant de commencer à écrire le code, nous devons faire une visite éclair de Lua. L'interpréteur Lua (rappelez-vous qu'il s'agit d'un langage de script et non d'un langage compilé) est disponible pour Windows, OS X et Linux. Cependant, il est intégré à Corona, vous n’avez donc pas besoin d’installer d’application supplémentaire. Le moyen le plus simple de jouer avec Lua est d'utiliser la démo en ligne.

Vous pouvez trouver de nombreux bons tutoriels sur Lua en ligne et vous devriez jeter un coup d'œil au manuel de référence Lua, Programmation en Lua, The.Lua.Tutorial et Tutoriels Point Lua Tutorial.

Voici un petit programme Lua qui vous montrera certaines des caractéristiques clés de Lua:

fonction locale doubleIt (x) retourne x * 2 end pour i = 1,10,1 x = doubleIt (i) if (x == 10) puis print ("dix") sinon print (doubleIt (i)) end end

Le code ci-dessus montre trois constructions Lua importantes: les fonctions, les boucles et les instructions if. La fonction doubleIt () est très simple, il double simplement le paramètre passé X.

Le code principal est un pour boucle de 1 à 10. Il appelle doubleIt () pour chaque itération. Si la valeur de retour est 10 (c’est-à-dire quand je 5), le code affiche «dix», sinon il affiche simplement le résultat de doubleIt ().

Si vous avez une expérience de codage, l'exemple de code devrait être assez facile à suivre. Si vous souhaitez apprendre des bases de la programmation, je vous suggère d’utiliser certaines des ressources ci-dessus pour vous perfectionner.

Écrire le jeu

Écrire des programmes de base dans Corona est simple. Vous n'avez besoin que de vous préoccuper d'un seul fichier, main.lua, et laissez Corona faire tout le travail lourd. Le jeu que nous allons écrire est un simple jeu de pression. Un ballon ou une bombe échouera sur l'écran. Si le joueur tape sur le ballon, il marque un point, il tape sur une bombe, le score sera divisé par 2, à titre de pénalité. Pour écrire le code, vous devez éditer main.lua. Vous pouvez le faire dans n’importe quel éditeur de texte.

Le SDK Corona est doté d’un moteur physique 2D intégré, ce qui facilite grandement la création de jeux. La première étape de l'écriture du jeu consiste à initialiser le moteur physique:

physique locale = nécessite ("physique") physics.start ()

Le code est assez explicite. Le module physique est chargé et initialisé, il est affecté à la variable la physique. Pour activer le moteurphysics.start () est appelé.

Ensuite, nous créons des variables utiles qui seront utiles non seulement pour ce jeu simple, mais également pour des jeux plus complexes. demiW et demiH conservez les valeurs correspondant à la moitié de la largeur de l'écran et à la moitié de sa hauteur:

halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5

le afficher objet est un objet prédéfini que Corona rend disponible globalement.

Vient maintenant la première étape qui fait que quelque chose se passe à l'écran:

local bkg = display.newImage ("night_sky.png", halfW, halfH)

Ainsi que des propriétés comme contentHeight et contentWidth, le afficher objet a aussi beaucoup de fonctions utiles. le Nouvelle image() function lit un fichier image (dans ce cas un fichier .png) et l'affiche à l'écran. Les objets d'affichage sont rendus sous forme de calques. Comme il s'agit de la première image que nous affichons à l'écran, ce sera toujours l'arrière-plan (à moins que le code ne le fasse explicitement pour le modifier). Les paramètres demiW et demiH Dites à Corona de placer l'image au milieu.

À ce stade, vous pouvez exécuter le code dans l'émulateur et voir l'image d'arrière-plan. Si vous enregistrez le fichier, l'émulateur remarquera que le fichier a été modifié et vous proposera de le relancer. Si cela ne se produit pas, utilisez Fichier-> Relancer.

Puisque l'utilisateur marquera des points pour taper sur des bulles, nous devons initialiser une variable de score et afficher le score à l'écran:

score = 0 scoreText = display.newText (score, halfW, 10)

Le score sera conservé dans la variable nommée avec imagination But,et scoreTexte est l'objet qui affiche le score. Comme Nouvelle image(), newText () mettre quelque chose à l'écran, dans ce cas le texte. Puisque scoreTexte est une variable globale alors nous pouvons changer le texte à tout moment. Mais nous y arriverons bientôt.

Vous pouvez relancer l'émulateur et voir le score de 0 affiché en haut de l'écran.

Gauche: juste le fond. Droite: Contexte et score.

Maintenant, il y a quelque chose d'un peu plus compliqué, mais ne vous inquiétez pas, je vais l'expliquer ligne par ligne:

fonction locale balloonTouched (event) if (event.phase == "commencé"), puis d'exécution: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end

Le code ci-dessus définit une fonction appelée ballonTouched () qui sera appelé chaque fois qu'un ballon est exploité. Nous n’avons pas encore dit à Corona d’appeler cette fonction à chaque fois que la montgolfière est tapée, cela viendra plus tard, mais lorsque nous le faisons, c’est la fonction qui est appelée.

Appuyez ou touchez les événements ont plusieurs étapes, beaucoup pour supporter le glisser. L'utilisateur pose son doigt sur un objet, il s'agit de la phase «commencée». S'ils glissent leur doigt dans n'importe quelle direction, c'est la phase «déplacée». Lorsque l'utilisateur lève son doigt de l'écran, il s'agit de la phase «terminée».

La première ligne de ballonTouched () vérifie que nous sommes dans la phase «commencée». Nous voulons retirer le ballon et augmenter le score le plus rapidement possible. Si la fonction est appelée à nouveau pour d'autres phases comme «terminée», la fonction ne fait rien.

À l'intérieur desi déclaration sont quatre lignes de code. Parlons des deux derniers premiers, car ils sont plus simples.score = score + 1 incrémente simplement le score d'un etscoreText.text = score modifie le texte du score à l'écran pour refléter le nouveau score. Rappelez-vous comment j'ai dit çascoreTexte était mondial et pouvait être consulté n’importe où, eh bien c’est ce que nous faisons ici.

Passons maintenant aux deux premières lignes. Une fois qu'un ballon ou une bombe est tombé au bas de l'écran, il existe toujours dans la mémoire de l'application, c'est juste que vous ne pouvez pas le voir. Au fur et à mesure que le jeu avance, le nombre d'objets hors écran augmente régulièrement. Par conséquent, nous devons avoir un mécanisme qui supprime les objets une fois qu'ils sont hors de vue. Nous faisons cela dans une fonction appeléehors écran, que nous n’avons pas encore écrit. Cette fonction sera appelée une fois par image pendant le match. Une fois qu'une bulle a été exploitée, nous devons la supprimer et supprimer l'appel qui vérifie si la bulle est sortie de l'écran.

La ligneevent.target:removeSelf () supprime le ballon. Lorsqu'un événement tactile se produit, l'un des paramètres de la fonction d'écoute est leun événement paramètre. Il indique à la fonction l'événement et le type d'événement, par exemple.event.phase. Il nous dit également quel ballon a été exploité,event.target. leremoveSelf () function fait ce qu'elle dit, il supprime l'objet (dans ce cas, une bulle).

La ligne qui précède supprime le programme d’écoute «enterframe», qui est la fonction appelée chaque image pour voir si la bulle est tombée du bas de l’écran. Nous examinerons cela plus en détail lorsque nous viendrons rédiger lehors écran fonction auditeur.

Donc, pour récapituler.ballonTouched ()vérifie qu'il s'agit du début de la séquence tactile. Il supprime ensuite le programme d’écoute «enterframe», qui est la fonction appelée chaque image pour voir si la bulle est tombée du bas de l’écran. Il supprime ensuite la bulle, incrémente le score et affiche le nouveau score.

C'était pour les ballons, il nous faut maintenant quelque chose de similaire pour les bombes:

fonction locale bombTouched (événement) si (événement.phase == "a commencé"), puis exécution: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score fin fin

Comme vous pouvez le constater, le code est très similaire à la différence près qu'au lieu d'incrémenter le score, le score est multiplié par 0,5 (c'est-à-dire divisé par 2). le math.floor () function arrondit le score au nombre entier le plus proche. Donc, si le joueur avait un score de 3 et tapait une bombe, le nouveau score serait de 1, et non de 1,5.

J'ai mentionné le hors écran () fonctionner plus tôt. Cette fonction sera appelée à chaque image pour vérifier si un objet est sorti de l'écran. Voici le code:

fonction locale hors écran (self, événement) if (self.y == nil), puis retourne end si (self.y> display.contentHeight + 50) then Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

En informatique, il existe une situation connue sous le nom de condition de concurrence. C’est là que deux choses vont se passer, mais l’une peut arriver en premier ou parfois l’autre en premier. C'est une course. Certaines conditions de course ne sont pas visibles car une chose semble toujours se produire en premier lieu, mais elles peuvent causer des bugs intéressants en une journée. Dans de bonnes conditions, l’autre chose se produit en premier et le système se casse!

Il y a une condition de concurrence dans ce jeu simple parce que deux choses peuvent se passer très près l'une de l'autre: un ballon étant exploité et le hors écran () fonction étant appelée pour voir si le ballon est sorti de l'écran. Le résultat est que le code pour supprimer le ballon peut être appelé, puis le hors écran () La fonction est appelée (ce qui se produit environ 30 fois par seconde). Pour contourner cette étrange séquence d'événements, le hors écran () la fonction doit vérifier si le y la valeur de l'objet est néant (null) ou pas. Si c'est néant alors cela signifie que l’objet a déjà été supprimé, alors avancez bien, ce ne sont pas les droïdes que nous recherchons.

Si l’objet est toujours en lecture, vérifiez sa position. Si vous avez perdu 50 pixels de l’écran, supprimez-le et supprimez le programme d’écoute afin que le hors écran () La fonction ne sera plus appelée pour cet objet. Le code pour s'assurer quehors écran () est appelé chaque image fait partie de la prochaine section de code.

La prémisse de ce jeu est que de nouveaux ballons ou bombes continueront de tomber à l'écran. Par conséquent, nous avons besoin d’une fonction qui créera un nouveau ballon ou une nouvelle bombe:

fonction locale addNewBalloonOrBomb () local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1), puis - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = hors écran Durée: addEventListener ("enterFrame", bombe) bombe: addEventListener ("touch", bombTouched) else - Balloon ballon local = display.newImage ("red_balloon.png", startX, -300) physics.addBody (ballon) ballon.enterFrame = offscreen Durée d'exécution: addEventListener ("enterFrame", ballon) ballon: addEventListener ("touch", balloonTouched) fin fin

La première ligne de la fonction décide où le ballon tombera de l'écran X avion. Si le ballon ou la bombe tombe toujours au milieu, ce ne sera pas très intéressant! AlorsstartX est un nombre aléatoire compris entre 10% et 90% de la largeur de l'écran.

Ensuite, un nombre aléatoire est choisi entre 1 et 5.Si le nombre est 1, une bombe sera larguée. Si c'est 2, 3, 4 ou 5 alors un ballon sera largué. Cela signifie que les bombes seront larguées environ 20% du temps.

Le code de la bombe et du ballon est assez similaire. Tout d'abord, l'image (une bombe ou un ballon) est affichée à l'aide deNouvelle image(). Ses X la position est celle destartX tandis que son y position est réglée sur -300, c’est-à-dire en haut de l’écran. La raison en est que nous voulons que l'objet tombe de l'extérieur de la zone d'écran dans la zone visible, puis en bas. Étant donné que nous utilisons le moteur physique 2D, il est bon d'attribuer un peu de distance initiale à l'objet afin qu'il puisse prendre de la vitesse.

L'appel àphysics.addBody () prend l'image chargée par Nouvelle image() et le transforme en un objet dans le moteur physique. C'est très puissant. Tout fichier image peut être transformé en un corps qui réagit à la gravité et aux collisions simplement en appelantphysics.addBody ().

Les trois dernières lignes du code de la bombe ou du ballon configurent les auditeurs. Réglage duenterFrame propriété indique à Corona quelle fonction appeler chaque image et l'appel àDurée: addEventListener () le met en place. Enfin l'appel àballon: addEventListener () indique à Corona quelle fonction appeler si la bombe ou le ballon est touché.

Et maintenant, le jeu est presque terminé. Nous avons juste besoin de deux lignes de code supplémentaires:

addNewBalloonOrBomb () timer.performWithDelay (500, addNewBalloonOrBomb, 0)

La première ligne fait tomber la toute première bombe ou ballon en appelant explicitementaddNewBalloonOrBomb (). La deuxième ligne met en place une minuterie qui appelleraaddNewBalloonOrBomb () toutes les demi-secondes (500 millisecondes). Cela signifie qu'un nouveau ballon ou une nouvelle bombe tombera toutes les demi-secondes.

Vous pouvez maintenant exécuter le jeu dans l'émulateur.

Voici la liste complète de main.lua, le code source complet du projet pour ce jeu est disponible ici sur GitHub.

-------------------------------------------------- --------------------------------------- - - Ballon tombant et jeu à la bombe - Écrit par Gary Sims pour - ------------------------------------------- ---------------------------------------------- -- Commencer le moteur physique moteur local = requis ("physique") physics.start () - Calcule la moitié de la largeur et de la hauteur de l'écran halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Définit l'arrière-plan local bkg = display.newImage ("night_sky.png", halfW, halfH) - Score score = 0 scoreText = display.newText (score, halfW, 10) - Appelé lorsque le ballon est tapé par le joueur - Augmente le score de 1 fonction locale balloonTouched ( event) if (event.phase == "commencé") puis Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end - Appelé lorsque le la bombe est tapée par le joueur - La moitié du score est une pénalité fonction locale bombTouched (event) if (event.phase == "commencé") puis Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score end end - Supprime les objets tombés du bas de l'écran fonction locale hors écran (self, événement) if (self.y == nil) puis renvoie end if (self.y> display.contentHeight + 50) puis Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Ajoute une nouvelle fonction locale ballon ou bombe addNewBalloonOrBomb () - Vous pouvez trouver red_ballon.png et bomb.png dans le référentiel GitHub local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) alors - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = hors écran Durée: addEventListener ("enterFrame", bombe) bombe: addEventListener ("touch", bombTouched) else - Balloon ballon local = display.newImage ("red_balloon.png", startX, -300) physics.addBody (ballon) ballon.enterFrame = offscreen Durée d'exécution: addEventListener ("enterFrame", ballon) ballon: addEventListener ("touch", balloonTouched) end end - Ajoutez un nouveau ballon ou une nouvelle bombe maintenant addNewBalloonOrBomb () - Continuez à ajouter un nouveau ballon ou une nouvelle bombe toutes les 0,5 seconde timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Prochaines étapes

La prochaine étape consiste à jouer au jeu sur un véritable appareil Android. Pour créer un fichier .apk, cliquez sur Fichier-> Construire pour Android… et remplissez les champs. Le résultat sera un fichier .apk que vous pourrez copier sur votre appareil, puis installer. Vous devez vous assurer que vous avez configuré votre appareil pour permettre l'installation d'applications à partir de sources inconnues. Amazon dispose d'une bonne documentation à ce sujet, car vous devez également le configurer pour installer Amazon Appstore. Corona propose également un guide sur la manière de signer, de créer et de tester votre application sur des appareils Android.

Avec le jeu installé avec succès sur votre appareil, la prochaine chose à faire est d'améliorer le jeu. Par exemple, pourquoi ne pas essayer d’ajouter un son «pop» ou «bang» tout ce qu’un ballon ou une bombe est exploité. Corona a une API pour ça:media.playEventSound ().

Ou pourquoi ne pas essayer d'ajouter un troisième type d'objet, par exemple un super boost qui double le score actuel ou une musique de fond?

Emballer

Ecrire des jeux avec Corona est assez simple car le SDK gère des choses comme OpenGL et comprend un moteur de physique 2D intégré. De plus, Lua est facile à apprendre et ne devrait pas être difficile pour ceux qui ont un minimum d’expérience en programmation. Le site Web Coronalabs contient de nombreux documents, notamment des guides et des tutoriels.

En moins de 100 lignes de code, nous avons un jeu qui fonctionne. OK, il ne va pas gagner de prix, mais il montre la puissance et la flexibilité du SDK Corona.

Le Pixel 3a et le téléphone le moin cher que Google a publié cette année. Même avec on prix abordable, vou dipoez toujour d'excellente caractéritique matérielle,...

Hier, Google a publié une nouvelle publicité qui outient le Pixel 3a et poue le dernier iPhone au bord de la route. Contrairement à la précédente annonce qui traitait de la ph...

Populaire