Corona SDK Créer un jeu de mots

Dans ce tutoriel, je vais vous apprendre à créer un jeu Word Drop à l'aide du SDK Corona. Nous allons construire le jeu de bout en bout, je vous encourage donc à suivre. Dans ce tutoriel, nous allons travailler avec les temporisateurs, la physique et mettre en œuvre nos propres commandes tactiles. Commençons.


introduction

L'objectif du jeu est de créer des mots à partir des balles à lettres. Si les balles traversent la barre en haut, le jeu est terminé. Vous avez trois bombes que vous pouvez utiliser pour retirer cinq balles, il est donc essentiel de les utiliser avec parcimonie. Toutes les dix secondes, plus de balles tombent du haut de l'écran. Jetez un coup d'œil à la capture d'écran pour vous faire une idée du jeu..



1. Nouveau projet

Ouvrez le simulateur Corona et choisissez Nouveau projet.


Sur l'écran suivant, appliquez les paramètres suivants.


Cliquez sur Suivant et choisir Ouvrir dans l'éditeur. Cela va ouvrir Main.lua dans votre éditeur de texte de choix.


2. Configuration du projet

Ouvrir Config.lua et remplacez le contenu du fichier par la configuration indiquée ci-dessous. Cela définira la largeur, la hauteur, l'échelle et le FPS (images par seconde) par défaut du projet. le letterBox Le réglage de l'échelle signifie que l'application sera mise à l'échelle dans les deux directions aussi uniformément que possible. Si nécessaire, toutefois, le jeu sera en boîte aux lettres..

 application = contenu = largeur = 320, hauteur = 480, échelle = "letterBox", fps = 30,

3. Masquer la barre d'état

Pour empêcher l'affichage de la barre d'état en haut de l'écran, ajoutez l'extrait de code suivant à Main.lua.

 display.setStatusBar (display.HiddenStatusBar)

4. Variables locales

Dans l'extrait de code suivant, vous pouvez voir une liste des variables que nous allons utiliser dans ce jeu. Lire les commentaires pour avoir une idée de la responsabilité de chaque variable.

 local gameBackground = display.newImage ("background.png", true) theWord local = "" - le mot que l'utilisateur épelle theWordText local - affiche le mot local isNewGame = true local allBallsGroup - le groupe contient toutes les boules local wordTable =  - contiendra les mots du fichier texte local selectedBalls =  - contiendra les boules que l'utilisateur a choisies instructions localesText - affiche les instructions locales countDownText - affiche l'heure locale numBallsToGenerate = 10 - combien de boules générer local allBalls =  - contient toutes les balles générées localement theBombs =  - contient des références à l'image de la bombe locale generateBallTimer - timer pour générer des balles local clockTimer - timer pour l'horloge locale gameTime = 10 - - combien de secondes avant que les nouvelles balles tombent

5. Mise en place de la physique

Avec l'extrait suivant, nous demandons et démarrons le moteur physique. Nous établissons une gravité élevée pour nous assurer que les billes tombent rapidement.

 physique locale = nécessite ("physique") physics.start (true) physics.setGravity (0,50)

6. installer

Dans installer, nous semons le générateur aléatoire pour assurer math.random génère un nombre aléatoire quand nous en avons besoin.

 function setup () math.randomseed (os.time ()) fin

Appel installer immédiatement après sa déclaration.

 installer()

7. setupGameAssets

Dans les prochaines étapes, nous expliquerons un certain nombre de fonctions, que nous implémenterons un peu plus tard dans ce tutoriel..

Dans setupGameAssets, les atouts du jeu sont mis en place.

 fonction setupGameAssets () end

8. nouveau jeu

le nouveau jeu la fonction est responsable du démarrage d'un nouveau jeu.

 fonction newGame () end

9. setupGameBoundaries

Dans setupGameBoundaries, les limites des balles à gauche, à droite et en bas des écrans sont définies.

 fonction setupGameBoundaries () end

dix. boutons de configuration

le boutons de configuration fonction met en place les boutons.

 fonction setupButtons () end

11. setupTextFields

Dans setupTextFields, les champs de texte sont configurés.

 fonction setupTextFields () end

12. setupBombs

Cette fonction configure les images pour les bombes.

 fonction setupBombs () end

13. setBombsVisible

En invoquant setBombsVisible, les bombes sont définies pour être visibles.

 fonction setBombsVisible () end

14. setBombsInvisible

Cette fonction n'a pas besoin d'être expliquée. Droite?

 fonction setBombsInvisible () end

15. générer des appels

le générer des appels la fonction est responsable de la génération de nouvelles balles à des intervalles de temps réguliers.

 function generateBalls () fin

16. startTimer

startTimer démarre le chronomètre.

 fonction startTimer () end

17. doCountDown

Dans doCountDown, le temps de jeu est décrémenté.

 fonction doCountdown () end

18. createBall

le createBall la fonction est responsable de la création d'une balle. Il faut un argument, la lettre que contient la balle.

 fonction createBall (createVowel) end

19. checkGameOver

Dans checkGameOver, nous vérifions si le jeu est terminé, c'est-à-dire si le mur de balles a franchi la barre en haut de l'écran.

 function checkGameOver () fin

20. checkWord

Dans checkWord, on vérifie si le mot épelé par l'utilisateur est valide.

 function checkWord () end

21. réinitialiser le mot

le réinitialiser le mot la fonction est invoquée lorsque le joueur annule une soumission.

 fonction resetWord () end

22. createVowelBalls

le createVowelBalls fonction garantit que certaines des boules contiennent une voyelle. Il faut un paramètre, le nombre de boules qui devrait contenir une voyelle.

 function createVowelBalls (nombre) fin

23. formString

Cette fonction crée une chaîne à partir des lettres sur les boules que l'utilisateur a choisies..

 fonction formString (e) end

24. exploser

le exploser La fonction est appelée lorsque le joueur utilise une bombe. Il supprime cinq balles du jeu.

 fonction exploser (e) fin

25. enleverBall

le enleverBall fonction choisit un ballon au hasard pour le retirer du jeu.

 fonction removeBall () end

26. readTextFile

le readTextFile fonction est utilisée pour lire un fichier texte et stocker les mots qu'il contient dans un tableau pour une utilisation dans le jeu.

 fonction readTextFile () end

27. Contrôle de progression

Vérifiez bien que vous avez créé les implémentations de stub pour les fonctions ci-dessus avant de poursuivre. Dans les prochaines étapes, nous allons implémenter chaque fonction.


28. Mise en œuvre readTextFile

Dans readTextFile, nous lisons le fichier texte à partir du répertoire de ressources et stockons chaque mot dans wordTable. Nous utilisons string.sub couper les espaces à la fin de chaque mot.

 chemin local = system.pathForFile ("wordlist.txt", system.ResourceDirectory) fichier local = io.open (chemin, "r") pour la ligne du fichier: lignes () do line = string.sub (ligne, 1, #) line - 1) table.insert (wordTable, line) fin io.close (fichier) fichier = nil

readTextFile est invoqué dans setupGameAssets comme indiqué ci-dessous. Nous mettrons à jour setupGameAssets un peu plus de temps plus tard dans ce tutoriel.

 function setupGameAssets () readTextFile () fin

29. Mise en œuvre setupGameBoundaries

Dans setupGameBoundaries, les limites du jeu sont définies. lineLeft et lineRight sont les limites droite et gauche, alors que ligne de fond est le bas de l'écran, le sol pour ainsi dire. Ceux-ci sont utilisés par le moteur physique et empêcheront les balles de sortir de la zone de jeu. Nous leur avons demandé de ne pas être visibles car nous n'avons pas besoin de les voir. La raison pour laquelle nous avons utilisé -29, est parce que le rayon des boules est 29 et le système physique utilise le centre des objets lors des tests de collision.

 groundLine local = display.newRect (0, 380, display.contentWidth, 2) lineLeft local = display.newRect (-29,0,2, display.contentHeight) local lineRight = display.newRect (display.contentWidth-29,0, 2, display.contentHeight) physics.addBody (groundLine, 'static', bounce = 0, friction = 0) physics.addBody (lineLeft, 'static', bounce = 0, friction = 0) physics.addBody ( lineRight, 'static', bounce = 0, friction = 0) groundLine.isVisible = false lineLeft.isVisible = false lineRight.isVisible = false

Juste comme readTextFile, setupGameBoundaries est invoqué dans setupGameAssets.

 fonction setupGameAssets () readTextFile () setupGameBoundaries () fin

30. Mise en œuvre boutons de configuration

Mettre en place boutons de configuration comme indiqué ci-dessous et invoquer la fonction dans setupGameAssets.

 goButton local = display.newImage ("goButton.png", 260,420) goButton: addEventListener ('tap', checkWord) arrêtButton local = display.newImage ("stopButton.png", 5,430) stopButton: addEventListener ('tap', réinitialisation local bar = display.newImage ("bar.png", 0,100)
 fonction setupGameAssets () readTextFile () setupGameBoundaries () setupButtons () end

31. Mise en œuvre setupTextFields

Mettre en place setupTextFields comme indiqué ci-dessous et invoquer la fonction dans setupGameAssets.

 countDownText = display.newText (gameTime, 290,10, native.systemFontBold, 20) countDownText: setTextColor ("# 000000") theWordText = display.newText ("", 60,437, native.systemFontBold, 25) theWordText: " 000000 ") instructionsText = display.newText (" ", 0,0, native.systemFontBold, 25) instructionsText.x = display.contentWidth / 2 instructionsText.y = display.contentHeight / 2 instructionsText: setTextColor (" # 000000 ")
 fonction setupGameAssets () readTextFile () setupGameBoundaries () setupButtons () setupTextFields () end

32. Mise en œuvre setupBombs

Mettre en place setupBombs comme indiqué ci-dessous et invoquer la fonction dans setupGameAssets. Dans setupBombs, nous générons trois images de bombe. En stockant les images dans une table, nous pouvons les référencer sans avoir à déclarer trois variables d'image distinctes.

 pour i = 1, 3 local tempBomb = display.newImage ("bomb.png") tempBomb.width = 30 tempBomb.height = 30 tempBomb.x = 33 * i tempBomb.y = 20 tempBomb: addEventListener ('tap', ' exploser) table.insert (theBombs, tempBomb) fin
 fonction setupGameAssets () readTextFile () setupGameBoundaries () setupButtons () setupTextFields () setupBombs () fin

33. Finition setupGameAssets

Finaliser la mise en œuvre de setupGameAssets en ajoutant l'extrait illustré ci-dessous. Il initialise le groupe pour les balles.

 allBallsGroup = display.newGroup ();

34. Finition installer

Avec le setupGameAssets fonction prête à l'emploi, on peut l'invoquer dans le installer fonctionne comme indiqué ci-dessous.

 function setup () math.randomseed (os.time ()) setupGameAssets () fin

35. Mise en œuvre createBall

Nous avons deux tableaux, l'un pour l'alphabet et l'autre uniquement pour les voyelles, car nous voulons nous assurer que certaines des boules contiennent des voyelles. Nous générons ensuite des valeurs aléatoires pour le type de balle et taille balle variables. La valeur de type de balle qui va de 1 à 4, alors que la valeur de taille balle qui va de 1 à 2. En utilisant ces variables, nous obtenons une couleur de balle et définissons son rayon. le letterText utilise la lettre aléatoire que nous avons générée et définit sa X et y être le même que le ballon. Nous insérons ensuite à la fois la lettre et la balle dans un groupe afin qu’elles apparaissent comme un élément du jeu. Ensuite, nous générons un aléatoire X position pour la balle et placez-le à -40 pour le y position. Nous ajoutons de la physique à la balle pour nous assurer qu'elle tombe du haut vers le bas de l'écran. Donne-le prénom et lettre touches, ajoutez un événement tap et insérez-le dans le allBalls table ainsi que le allBallsGroup table. Ce dernier nous permet de travailler avec toutes les balles actuellement dans le jeu..

 local var alphabetArray = "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", " L "," M "," N "," O "," P "," Q "," R "," S "," T "," U "," V "," W "," W "," X " , "Y", "Z" voyelles locales = "A", "E", "I", "O", "U" ballType local = math.random (4) ballSize local = math.random (2 ) lettreIndex locale lettre locale si (createVowel == true) alors letterIndex = math.random (#vowels) lettre = voyelles [letterIndex] else letterIndex = math.random (#alphabetArray); letter = alphabetArray [letterIndex] fin local ballGroup = display.newGroup (); ball local ballRadius local ball (type == 1) alors ball = display.newImage ("greenBall.png") elseif (ballType == 2) puis ball = display.newImage ("brownBall.png") elseif (ballType == 3 ) then ball = display.newImage ("pinkBall.png") else ball = display.newImage ("redBall.png") fin si (ballSize == 1) puis ball.width = 48 ball.height = 48 ballRadius = 24 else ball.width = 58 ball.height = 58 ballRadius = 29 end local letterText = display.newText (letter, 0,0, native.systemFontBold, 25); letterText: setTextColor (0,0, 0) letterText.x = ball.x letterText.y = ball.y ballGroup: insert (ball) ballGroup: insert (letterText) ballGroup.x = math.random (ballRadius, display.contentWidth-) ballRadius * 2) ballGroup.y = - 40 physics.addBody (ballGroup, 'dynamic', friction = 0, bounce = 0, rayon = ballRadius) ballGroup.name = "ball" ballGroup.letter = letter ballGroup: addEventListener ( 'tap', formString) table.insert (allBalls, ballGroup) allBallsGroup: insert (ballGroup)

Si vous appelez cette fonction dans installer, vous devriez voir une balle se créer et tomber du haut de l'écran vers le bas. N'oubliez pas de supprimer l'appel de la installer méthode quand vous avez fini de tester.


36. Mise en œuvre générer des appels

Dans générer des appels, nous invoquons checkGameOver après 1500 millisecondes, ce qui laisse suffisamment de temps aux boules pour tomber devant le bar. Si c'est un nouveau jeu, nous devons générer dix boules, sinon nous générons quatre boules dont au moins une contient une voyelle. Nous allons explorer la mise en œuvre de createVowelBalls prochainement. Si vous invoquez générer des appels dans installer, vous devriez voir dix balles générées.

 function generateBalls () timer.performWithDelay (1500, checkGameOver) if (isNewGame == true), puis numBallsToGenerate = 10 sinon numBallsToGenerate = 4 createVowelBalls (1) et fin generateBallTimer = timer.performWithDelay (50, createBallToog)

37. Mise en œuvre createVowelBalls

Toute cette fonction ne fait qu'appeler createBall autant de fois que la valeur de nombre cela a été passé à la fonction. Nous passons vrai comme paramètre, ce qui signifie createBall va générer une boule contenant une voyelle.

 pour i = 1, nombre crée createBall (true) end

38. Mise en œuvre enleverBall

Cette fonction choisit une balle au hasard parmi allBalls table et l'enlève. Cette fonction est appelée par le exploser fonction, que nous allons mettre en œuvre dans quelques instants.

 randomIndex local = math.random (#allBalls) tempBall local = allBalls [randomIndex] tempBall: removeSelf () tempBall = nil table.remove (allBalls, randomIndex)

39. Mise en œuvre setBombsVisible

Dans setBombsVisible, nous parcourons les bombes et les mettons en évidence.

 pour i = 1, #lesBombs font lesBombes [i] .isVisible = true end

40. Mise en œuvre setBombsInvisible

Dans cette fonction, nous faisons exactement le contraire comme nous le faisions dans setBombsVisible.

 pour i = 1, #lesBombs font lesBombes [i] .isVisible = false end

41. Mise en œuvre exploser

Dans exploser, on vérifie si allBalls contient moins de cinq balles. Si moins de cinq balles sont présentes, nous retirons toutes les balles, sinon nous ne retirons que cinq balles..

 local thisSprite = e.target thisSprite.isVisible = false local randomIndex local randomBall if (#allBalls < 5) then for i=1, #allBalls do removeBall() end else for i=1, 5 do removeBall() end end

42. Mise en œuvre formString

Dans formString, nous formons un mot chaque fois que l'utilisateur clique sur une balle. Rappelez-vous que chaque balle a un lettre clé ajoutée à elle. Nous vérifions si le élus la table ne contient pas la balle sur laquelle ils ont tapé. Si ce n'est pas le cas, nous insérons la balle dans le élus table, clouez la lettre à la fin de le mot variable, et l'afficher dans le champ de texte. Si la balle a déjà été choisie et ajoutée à élus, on ne l'ajoute pas à élus et imprimer un message sur la console à la place. Vous pouvez déjà tester notre jeu en tapotant quelques balles et en voyant le mot apparaître dans le champ de texte.

 local thisSprite = e.target local theLetter = thisSprite.letter if (table.indexOf (selectedBalls, thisSprite) == nil) puis table.insert (selectedBalls, thisSprite) theWord = leWord… theLetter theWordText.text = theWord theWordText.x = display .contentWidth / 2 else print ("déjà choisi cette balle") end

43. Mise en œuvre réinitialiser le mot

 instructionsText.text = ""; theWord = "theWordText.text =" "selectedBalls = 

Cette fonction réinitialise le mot actuel et efface le élus table. Si vous testez le jeu, vous pouvez cliquer sur le bouton Annuler pour effacer le champ de texte..


44.Mise en œuvre checkWord

Dans checkWord, on vérifie si la longueur de le mot est inférieur ou égal à un. Si c'est le cas, nous revenons de la fonction. Nous devons nous assurer que le joueur a choisi un mot avec un minimum de deux lettres. Nous devons ensuite vérifier si le mot correspond à un mot du wordTable. Si ce n'est pas le cas, nous définissons la instructionsTexte à PAS UN MOT et le montrer au joueur. Si c’est le cas, nous parcourons le élus table et retirer chaque balle du jeu.

 si (#le Mot <= 1) then return; end local lowerCaseWord = string.lower(theWord) local tempBall if(table.indexOf(wordTable,lowerCaseWord) == nil) then instructionsText.text = "NOT A WORD!" instructionsText:toFront() else for i=1, #chosenBalls do table.remove(allBalls,table.indexOf(allBalls,chosenBalls[i])) chosenBalls[i]:removeSelf() chosenBalls[i] = nil theWord = "" theWordText.text = "" end chosenBalls =  end

45. Mise en œuvre doCountDown

Dans doCountDown, nous prenons le nombre dans le champ de texte, le décrémentons et vérifions s'il est égal à zéro. Si c'est le cas, nous appelons générer des appels, réinitialiser et appeler startTimer, qui à son tour appelle doCountDown.

 local currentTime = countDownText.text currentTime = currentTime -1 countDownText.text = currentTime if (currentTime == 0), puis generateBalls () countDownText.text = gameTime startTimer () end

46. ​​Mise en œuvre startTimer

L'implémentation de startTimer est simple. Nous appelons faire le décompte chaque seconde et répétez cela autant de fois que la valeur de temps de jeu.

 clockTimer = timer.performWithDelay (1000, doCountdown, gameTime)

47. Mise en œuvre nouveau jeu

Pour démarrer une nouvelle partie, les variables que nous avons déclarées précédemment sont réinitialisées et startTimer est appelé pour commencer le jeu.

 isNewGame = true selectedBalls =  allBalls =  theWord = "" theWordText.text = "" instructionsText.text = "" countDownText.text = gameTime; createVowelBalls (2) generateBalls () setBombsVisible () startTimer () isNewGame = false

48. Mise en œuvre checkGameOver

Dans cette fonction, nous parcourons le allBalls table et vérifier si le y La valeur de n'importe laquelle des billes est supérieure à 100. Si c'est le cas, une ou plusieurs billes traversent la barre en haut et le jeu est terminé. Si le jeu est terminé, les balles sont retirées de la BallGroup table. Les minuteries sont annulées pour rendre les bombes invisibles et nouveau jeu est invoqué après trois secondes.

 gameOver local = false; pour i = 1, # allBalls faire si (allBalls [i] .y < (100 - allBalls[i].height))then gameOver = true break; end end if(gameOver) then for i=allBallsGroup.numChildren,1,-1 do local child = allBallsGroup[i] child:removeSelf() child = nil end timer.cancel(generateBallTimer) timer.cancel(clockTimer) instructionsText.text = "GameOver" instructionsText:toFront() setBombsInvisible() timer.performWithDelay(3000,newGame)

49. Terminer le jeu

Il ne nous reste plus qu'à appeler nouveau jeu dans le installer une fonction.

 function setup () math.randomseed (os.time ()) setupGameAssets () newGame () fin

Conclusion

Dans ce tutoriel, nous avons créé un jeu de mots créatif. N'hésitez pas à expérimenter le code que nous avons écrit pour voir comment il affecte le jeu. J'espère que vous avez trouvé ce tutoriel utile.