Corona SDK Make a Word Drop Game

En este tutorial, te enseñaré cómo crear un juego Word Drop usando el SDK de Corona. Construiremos el juego de principio a fin, por lo que lo invito a seguirlo. En este tutorial, trabajaremos con temporizadores, física e implementaremos nuestros propios controles táctiles. Empecemos.


Introducción

El objetivo del juego es crear palabras de las bolas con letras. Si las bolas cruzan la barra en la parte superior, el juego termina. Tienes tres bombas, que puedes usar para eliminar cinco bolas, así que es clave usarlas con moderación. Cada diez segundos, más bolas caen desde la parte superior de la pantalla. Echa un vistazo a la captura de pantalla para tener una idea del juego..



1. Nuevo proyecto

Abre el simulador de corona y elige Nuevo proyecto.


En la siguiente pantalla, aplique las siguientes configuraciones..


Hacer clic Siguiente y elige Abrir en Editor. Esto abrirá Main.lua en su editor de texto de elección.


2. Configuración del proyecto

Abierto Config.lua y reemplace el contenido del archivo con la configuración que se muestra a continuación. Esto establecerá el ancho, la altura, la escala y los FPS predeterminados del proyecto (cuadros por segundo). los buzón el ajuste de escala significa que la aplicación se escalará en ambas direcciones de la manera más uniforme posible. Si es necesario, sin embargo, el juego será buzón.

 application = content = width = 320, height = 480, scale = "letterBox", fps = 30,

3. Ocultar la barra de estado

Para evitar que la barra de estado se muestre en la parte superior de la pantalla, agregue el siguiente fragmento de código a Main.lua.

 display.setStatusBar (display.HiddenStatusBar)

4. Variables locales

En el siguiente fragmento de código, puedes ver una lista de las variables que usaremos en este juego. Lee los comentarios, hazte una idea de la responsabilidad de cada variable..

 local gameBackground = display.newImage ("background.png", true) local theWord = "" - la palabra que el usuario deletrea local theWordText - muestra la palabra local isNewGame = true local allBallsGroup - group para mantener todas las bolas local wordTable = : retendrá las palabras del archivo de texto local chosenBalls =  - retiene las bolas que el usuario ha elegido. Instrucciones localesText - muestra instrucciones local countDownText - muestra la hora local numBallsToGenerate = 10 - cuántas bolas generar local allBalls =  - contiene todas las bolas que se han generado local theBombs =  - contiene referencias a la imagen de la bomba local generateBallTimer - temporizador para generar bolas local clockTimer - temporizador para el reloj local gameTime = 10 - - ¿Cuántos segundos antes de que caigan las nuevas bolas?

5. Configuración de la física

Con el siguiente fragmento de código, requerimos y arrancamos el motor de física. Establecemos la gravedad alta para asegurarnos de que las bolas caigan rápido.

 física local = requiere ("física") physics.start (true) physics.setGravity (0,50)

6. preparar

En preparar, Sembramos el generador aleatorio para asegurar math.random genera un número aleatorio cuando necesitamos uno.

 función setup () math.randomseed (os.time ()) end

Llamada preparar inmediatamente después de su declaración.

 preparar()

7. setupGameAssets

En los siguientes pasos, se mostrarán algunas funciones, que implementaremos un poco más adelante en este tutorial..

En setupGameAssets, Los activos del juego están configurados..

 función setupGameAssets () final

8. nuevo juego

los nuevo juego La función es responsable de comenzar un nuevo juego..

 función newGame () final

9. setupGameBoundaries

En setupGameBoundaries, Se establecen los límites de las bolas a la izquierda, derecha e inferior de las pantallas..

 función setupGameBoundaries () final

10. botones de configuración

los botones de configuración función configura los botones.

 función setupButtons () final

11. setupTextFields

En setupTextFields, los campos de texto están configurados.

 función setupTextFields () final

12. setupBombs

Esta función configura las imágenes para las bombas..

 función setupBombs () final

13. setBombsVisible

Invocando setBombsVisible, Las bombas están listas para ser visibles..

 función setBombsVisible () final

14. setBombsInvisible

Esta función no necesita explicación. Derecha?

 función setBombsInvisible () final

15. generar bolas

los generar bolas La función es responsable de generar nuevas bolas a intervalos de tiempo regulares..

 función genera bolas () final

dieciséis. startTimer

startTimer inicia el temporizador.

 función startTimer () fin

17. doCountDown

En doCountDown, el tiempo de juego se decrementa.

 función doCountdown () final

18. createBall

los createBall La función es responsable de crear una bola. Se necesita un argumento, la letra que contiene la pelota..

 función createBall (createVowel) end

19. checkGameOver

En checkGameOver, Verificamos si el juego ha terminado, es decir, si la pared de bolas ha cruzado la barra en la parte superior de la pantalla..

 función checkGameOver () final

20. checkWord

En checkWord, Verificamos si la palabra escrita por el usuario es válida..

 función checkWord () fin

21. resetWord

los resetWord La función se invoca cuando el jugador cancela un envío..

 función resetWord () fin

22. crear bolas de voces

los crear bolas de voces La función asegura que algunas de las bolas contengan una vocal. Se necesita un parámetro, el número de bolas que debe contener una vocal..

 función createVowelBalls (número) final

23. formString

Esta función crea una cadena de las letras en las bolas que el usuario ha elegido.

 función formString (e) fin

24. explotar

los explotar La función se invoca cuando el jugador usa una bomba. Quita cinco bolas del juego..

 función explotar (e) fin

25. removeBall

los removeBall La función elige una bola aleatoria para eliminar del juego..

 función removeBall () final

26. readTextFile

los readTextFile La función se usa para leer un archivo de texto y almacenar las palabras que contiene en una tabla para usar en el juego..

 función readTextFile () final

27. Verificación del progreso

Vuelva a comprobar que ha creado implementaciones de código auxiliar para las funciones anteriores antes de continuar. En los siguientes pasos, implementaremos cada función..


28. Implementando readTextFile

En readTextFile, Leemos el archivo de texto del directorio de recursos y almacenamos cada palabra en tabla de palabras. Hacemos uso de string.sub para recortar espacios en blanco desde el final de cada palabra.

 local path = system.pathForFile ("wordlist.txt", system.ResourceDirectory) archivo local = io.open (ruta, "r") para la línea en el archivo: lines () do line = string.sub (line, 1, # línea - 1) table.insert (wordTable, line) final io.close (archivo) archivo = nil

readTextFile se invoca en setupGameAssets Como se muestra abajo. Estaremos actualizando setupGameAssets Un poco más de tiempo más adelante en este tutorial..

 función setupGameAssets () readTextFile () end

29. Implementando setupGameBoundaries

En setupGameBoundaries, Los límites del juego están definidos.. lineLeft y lineRight Son los límites derecho e izquierdo, mientras que línea de tierra Es la parte inferior de la pantalla, el suelo por así decirlo. Estos son utilizados por el motor de física e impedirán que las bolas se muevan fuera del área de juego. Los configuramos para que no sean visibles porque no necesitamos verlos. La razón por la que hemos utilizado -29, Es porque, el radio de las bolas es. 29 y el sistema de física utiliza el centro de los objetos al probar la colisión.

 local groundLine = display.newRect (0, 380, display.contentWidth, 2) local lineLeft = 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

Al igual que readTextFile, setupGameBoundaries se invoca en setupGameAssets.

 función setupGameAssets () readTextFile () setupGameBoundaries () end

30. Implementando botones de configuración

Implementar botones de configuración como se muestra a continuación e invocar la función en setupGameAssets.

 local goButton = display.newImage ("goButton.png", 260,420) goButton: addEventListener ('tap', checkWord) stopButton = display.newImage ("stopButton.png", 5,430) stopButton: addEventListener ('tap', resetword local bar = display.newImage ("bar.png", 0,100)
 función setupGameAssets () readTextFile () setupGameBoundaries () setupButtons () final

31. Implementando setupTextFields

Implementar setupTextFields como se muestra a continuación e invocar la función en setupGameAssets.

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

32. Implementando setupBombs

Implementar setupBombs como se muestra a continuación e invocar la función en setupGameAssets. En setupBombs, Generamos tres imágenes de bombas. Al almacenar las imágenes en una tabla, podemos hacer referencia a ellas sin tener que declarar tres variables de imagen separadas.

 para i = 1, 3 do local tempBomb = display.newImage ("bomb.png") tempBomb.width = 30 tempBomb.height = 30 tempBomb.x = 33 * i tempBomb.y = 20 tempBomb: addEventListener ('tap' explotar) table.insert (theBombs, tempBomb) end
 función setupGameAssets () readTextFile () setupGameBoundaries () setupButtons () setupTextFields () setupBombs () end

33. Acabado setupGameAssets

Finalizar la implementación de setupGameAssets añadiendo el fragmento que se muestra a continuación. Se inicializa el grupo para las bolas..

 allBallsGroup = display.newGroup ();

34. Acabado preparar

Con el setupGameAssets Función lista para usar, podemos invocarla en el preparar funciona como se muestra a continuación.

 función setup () math.randomseed (os.time ()) setupGameAssets () end

35. Implementando createBall

Tenemos dos tablas, una para el alfabeto y otra solo para las vocales, ya que queremos asegurarnos de que algunas de las bolas contengan vocales. Entonces generamos valores aleatorios para el tipo de pelota y tamaño de pelota variables El valor de tipo de pelota rangos desde 1 a 4, mientras que el valor de tamaño de pelota rangos desde 1 a 2. Al usar estas variables, obtenemos un color de bola y establecemos su radio. los letraTexto utiliza la letra aleatoria que generamos y establece su X y y Ser igual a la pelota. Luego insertamos la letra y la bola en un grupo para que aparezcan como un elemento en el juego. A continuación, generamos un azar X posición para la pelota y colocarla en -40 Para el y posición. Añadimos física a la pelota para asegurarnos de que caiga desde la parte superior de la pantalla hasta la parte inferior. Darle nombre y carta teclas, agregue un evento de tap e insértelo en el todas las bolas mesa así como la allBallsGroup mesa. Este último nos permite trabajar con todas las bolas actualmente en el juego..

 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 "," X " , "Y", "Z" vocales locales = "A", "E", "I", "O", "U" local ballType = math.random (4) local ballSize = math.random (2 ) local letterIndex letra local if (createVowel == true) luego letterIndex = math.random (#vowels) letter = vocales [letterIndex] else letterIndex = math.random (#alphabetArray); letter = alphabetArray [letterIndex] end local ballGroup = display.newGroup (); local ball local ballRadius if (ballType == 1) luego ball = display.newImage ("greenBall.png") elseif (ballType == 2) luego ball = display.newImage ("brownBall.png") elseif (ballType == 3 ) luego ball = display.newImage ("pinkBall.png") else ball = display.newImage ("redBall.png") finaliza si (ballSize == 1) luego 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, radio = ballRadius) ballGroup.name = "ball" ballGroup.letter = letter ballGroup: addEventListener ( 'tap', formString) table.insert (allBalls, ballGroup) allBallsGroup: insert (ballGroup)

Si invocas esta función en preparar, Debería ver una bola que se está creando y caer desde la parte superior de la pantalla hasta la parte inferior. No olvides eliminar el formulario de llamada preparar método cuando haya terminado de pruebas.


36. Implementando generar bolas

En generar bolas, invocamos checkGameOver después de 1500 milisegundos, lo que da a las bolas el tiempo suficiente para caer más allá de la barra. Si es un juego nuevo, necesitamos generar diez bolas, de lo contrario generamos cuatro bolas, de las cuales al menos una contiene una vocal. Exploraremos la implementación de crear bolas de voces dentro de poco. Si invocas generar bolas en preparar, deberías ver diez bolas siendo generadas.

 function generateBalls () timer.performWithDelay (1500, checkGameOver) si (isNewGame == true) entonces numBallsToGenerate = 10 else numBallsToGenerate = 4 createVowelBalls (1) end generateBallTimer = timer.performWithDelay (50, createBallAccale

37. Implementando crear bolas de voces

Todo lo que hace esta función es invocar. createBall tantas veces como el valor de número Eso fue pasado a la función. Pasamos cierto como el parámetro, que significa createBall generará una bola que contiene una vocal.

 para i = 1, el número do createBall (true) end

38. Implementando removeBall

Esta función elige una bola aleatoria de la todas las bolas Tabla y la quita. Esta función es invocada por el explotar Función, que implementaremos en unos instantes..

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

39. Implementando setBombsVisible

En setBombsVisible, Atravesamos las bombas y las colocamos en visibles..

 para i = 1, # theBombs do theBombs [i] .isVisible = true end

40. Implementando setBombsInvisible

En esta función, hacemos exactamente lo contrario que hicimos en setBombsVisible.

 para i = 1, # theBombs do theBombs [i] .isVisible = false end

41. Implementando explotar

En explotar, comprobamos si todas las bolas Contiene menos de cinco bolas. Si hay menos de cinco bolas presentes, eliminamos todas las bolas, de lo contrario solo eliminamos cinco bolas.

 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. Implementando formString

En formString, formamos una palabra cada vez que el usuario hace clic en una bola. Recuerda que cada bola tiene una carta llave añadida a ella. Verificamos si el bolas elegidas La mesa no contiene la pelota que giraron. Si no es así, insertamos la bola en el bolas elegidas tabla, pegar la letra en el final de la palabra variable, y mostrarlo en el campo de texto. Si la pelota ya fue elegida y añadida a bolas elegidas, no lo agregamos a bolas elegidas e imprimir un mensaje a la consola en su lugar. Ya puedes probar nuestro juego tocando algunas bolas y viendo aparecer la palabra en el campo de texto.

 local thisSprite = e.target local theLetter = thisSprite.letter si (table.indexOf (chosenBalls, thisSprite) == nil) luego table.insert (chosenBalls, thisSprite) theWord = theWord ... theLetter theWordText.text = theWordText.x = display .contentWidth / 2 else print ("ya elegí esa bola") final

43. Implementando resetWord

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

Esta función restablece la palabra actual y borra la bolas elegidas mesa. Si prueba el juego, puede hacer clic en el botón Cancelar para borrar el campo de texto.


44.Implementando checkWord

En checkWord, comprobamos si la longitud de la palabra es menor o igual que uno. Si es así, volvemos de la función. Debemos asegurarnos de que el jugador haya elegido una palabra con un mínimo de dos letras. Entonces necesitamos verificar si la palabra coincide con una palabra de la tabla de palabras. Si no es así, configuramos el instruccionesTexto a NI UNA PALABRA y mostrárselo al jugador. Si lo hace, pasamos por el bolas elegidas Mesa y saca cada bola del juego..

 si (#la Palabra <= 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. Implementando doCountDown

En doCountDown, tomamos el número del campo de texto, lo disminuimos y comprobamos si es igual a cero. Si es así, llamamos. generar bolas, reinicia y llama startTimer, que a su vez invoca doCountDown.

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

46. ​​Implementando startTimer

La implementación de startTimer es simple. Nosotros llamamos doCountdown Cada segundo y repita esto tantas veces como el valor de tiempo de juego.

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

47. Implementando nuevo juego

Para comenzar un nuevo juego, las variables que declaramos anteriormente se restablecen y startTimer Se invoca para iniciar el juego..

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

48. Implementando checkGameOver

En esta función, hacemos un bucle a través de la todas las bolas mesa y comprobar si el y el valor de cualquiera de las bolas es mayor que 100. Si lo es, una o más bolas cruzan la barra en la parte superior y el juego termina. Si el juego termina, las bolas se quitan de la grupo de pelota mesa. Los temporizadores se cancelan para hacer invisibles las bombas y nuevo juego se invoca después de tres segundos.

 gameOver local = falso; para i = 1, # allBalls do if (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. Terminando el juego

Todo lo que nos queda por hacer es llamar nuevo juego en el preparar función.

 función setup () math.randomseed (os.time ()) setupGameAssets () newGame () end

Conclusión

En este tutorial, creamos un juego de palabras creativo. Siéntase libre de experimentar con el código que hemos escrito para ver cómo afecta el juego. Espero que hayas encontrado este tutorial útil.