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.
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..
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.
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,
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)
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?
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)
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()
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
nuevo juego
los nuevo juego
La función es responsable de comenzar un nuevo juego..
función newGame () final
setupGameBoundaries
En setupGameBoundaries
, Se establecen los límites de las bolas a la izquierda, derecha e inferior de las pantallas..
función setupGameBoundaries () final
botones de configuración
los botones de configuración
función configura los botones.
función setupButtons () final
setupTextFields
En setupTextFields
, los campos de texto están configurados.
función setupTextFields () final
setupBombs
Esta función configura las imágenes para las bombas..
función setupBombs () final
setBombsVisible
Invocando setBombsVisible
, Las bombas están listas para ser visibles..
función setBombsVisible () final
setBombsInvisible
Esta función no necesita explicación. Derecha?
función setBombsInvisible () final
generar bolas
los generar bolas
La función es responsable de generar nuevas bolas a intervalos de tiempo regulares..
función genera bolas () final
startTimer
startTimer
inicia el temporizador.
función startTimer () fin
doCountDown
En doCountDown
, el tiempo de juego se decrementa.
función doCountdown () final
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
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
checkWord
En checkWord
, Verificamos si la palabra escrita por el usuario es válida..
función checkWord () fin
resetWord
los resetWord
La función se invoca cuando el jugador cancela un envío..
función resetWord () fin
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
formString
Esta función crea una cadena de las letras en las bolas que el usuario ha elegido.
función formString (e) fin
explotar
los explotar
La función se invoca cuando el jugador usa una bomba. Quita cinco bolas del juego..
función explotar (e) fin
removeBall
los removeBall
La función elige una bola aleatoria para eliminar del juego..
función removeBall () final
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
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..
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
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
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
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
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
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 ();
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
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.
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
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
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)
setBombsVisible
En setBombsVisible
, Atravesamos las bombas y las colocamos en visibles..
para i = 1, # theBombs do theBombs [i] .isVisible = true end
setBombsInvisible
En esta función, hacemos exactamente lo contrario que hicimos en setBombsVisible
.
para i = 1, # theBombs do theBombs [i] .isVisible = false end
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
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
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.
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
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
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)
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
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)
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
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.