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.
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..
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.
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,
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)
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
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)
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()
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
nouveau jeu
le nouveau jeu
la fonction est responsable du démarrage d'un nouveau jeu.
fonction newGame () end
setupGameBoundaries
Dans setupGameBoundaries
, les limites des balles à gauche, à droite et en bas des écrans sont définies.
fonction setupGameBoundaries () end
boutons de configuration
le boutons de configuration
fonction met en place les boutons.
fonction setupButtons () end
setupTextFields
Dans setupTextFields
, les champs de texte sont configurés.
fonction setupTextFields () end
setupBombs
Cette fonction configure les images pour les bombes.
fonction setupBombs () end
setBombsVisible
En invoquant setBombsVisible
, les bombes sont définies pour être visibles.
fonction setBombsVisible () end
setBombsInvisible
Cette fonction n'a pas besoin d'être expliquée. Droite?
fonction setBombsInvisible () end
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
startTimer
startTimer
démarre le chronomètre.
fonction startTimer () end
doCountDown
Dans doCountDown
, le temps de jeu est décrémenté.
fonction doCountdown () end
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
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
checkWord
Dans checkWord
, on vérifie si le mot épelé par l'utilisateur est valide.
function checkWord () end
réinitialiser le mot
le réinitialiser le mot
la fonction est invoquée lorsque le joueur annule une soumission.
fonction resetWord () end
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
formString
Cette fonction crée une chaîne à partir des lettres sur les boules que l'utilisateur a choisies..
fonction formString (e) end
exploser
le exploser
La fonction est appelée lorsque le joueur utilise une bombe. Il supprime cinq balles du jeu.
fonction exploser (e) fin
enleverBall
le enleverBall
fonction choisit un ballon au hasard pour le retirer du jeu.
fonction removeBall () end
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
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.
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
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
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
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
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
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 ();
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
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.
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)
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
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)
setBombsVisible
Dans setBombsVisible
, nous parcourons les bombes et les mettons en évidence.
pour i = 1, #lesBombs font lesBombes [i] .isVisible = true end
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
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
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
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..
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
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
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)
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
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)
Il ne nous reste plus qu'à appeler nouveau jeu
dans le installer
une fonction.
function setup () math.randomseed (os.time ()) setupGameAssets () newGame () fin
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.