Escribiendo tu primer juego de Android usando el SDK de Corona

Autor: Randy Alexander
Fecha De Creación: 1 Abril 2021
Fecha De Actualización: 26 Junio 2024
Anonim
Writing your first Android game using the Corona SDK!
Video: Writing your first Android game using the Corona SDK!

Contenido


La categoría más popular en Google Play Store siempre ha sido Juegos. Aunque todos probablemente usamos aplicaciones clave de productividad como un navegador web, un cliente de correo electrónico y una aplicación de mensajería instantánea, los juegos siguen siendo una parte importante de la experiencia móvil. Por lo tanto, no sorprende que muchas personas que quieran aprender a desarrollar para Android quieran comenzar haciendo un juego. Además, seamos honestos, ¡escribir un juego es mucho más divertido que desarrollar una aplicación de productividad!

El idioma oficial de Android es Java y el entorno de desarrollo oficial es Android Studio. Si desea analizar Java, le sugiero nuestro tutorial básico de Java, y si desea aprender a escribir una aplicación con Android Studio, le sugiero que consulte nuestro tutorial sobre cómo escribir su primera aplicación de Android. Sin embargo, Java y Android Studio no son las únicas formas de desarrollar para Android. Puede encontrar una descripción general de los idiomas y SDK disponibles en nuestra guía: Quiero desarrollar aplicaciones de Android: ¿qué idiomas debo aprender?


Uno de los SDK mencionados en la guía de lenguajes de programación es Corona, un SDK de terceros diseñado principalmente para escribir juegos. En lugar de Java, Corona usa Lua, un lenguaje de script rápido que es fácil de aprender pero potente. Sin embargo, Corona no es el único SDK de juegos móviles que usa Lua, otros ejemplos bien conocidos incluyen Cocos2d-X, Marmalade y Gideros.

Descargar e instalar

Para comenzar con Corona, deberá descargar e instalar el SDK. Vaya al sitio web de Corona y presione el botón de descarga. Deberá crear una cuenta (que es gratuita) antes de poder descargar el kit. Si desea crear un archivo .apk real en lugar de simplemente ejecutar su programa en el emulador, deberá instalar Java 7, sin embargo, no necesitará instalar el SDK de Android. Para instalar el Kit de desarrollo de Java 7, vaya al sitio web de Oracle, busque la sección llamada "Kit de desarrollo de Java SE 7u79" y descargue la versión para su PC.


Una vez que haya instalado Corona, debe activarlo. Este es un proceso de una sola vez, que es gratis. Inicie el Simulador Corona y acepte la licencia. Ingrese la dirección de correo electrónico y la contraseña que utilizó para la descarga, y haga clic en Iniciar sesión.

Iniciando el proyecto

Desde dentro del simulador de Corona, haga clic en "Nuevo proyecto". Ingrese un nombre para su aplicación en el campo "Nombre de la aplicación:" y deje el resto de las configuraciones en sus valores predeterminados. Haga clic en Aceptar."

Ahora aparecerán tres ventanas. Los dos primeros son el simulador de corona y la salida simular de corona. Corona también abrirá una ventana del explorador de archivos que muestra los archivos para su proyecto.

¡La mayoría de los archivos (unos 23) en el directorio del proyecto son para el ícono de la aplicación! El archivo más importante para nosotros en este momento es main.lua, ya que aquí es donde escribiremos el código de nuestra aplicación.

Introducción a lua

Antes de comenzar a escribir el código, tenemos que hacer un recorrido por Lua. El intérprete de Lua (recuerde que este es un lenguaje de secuencias de comandos, no un lenguaje compilado) está disponible para Windows, OS X y Linux. Sin embargo, está integrado en Corona, por lo que en este momento no necesita instalar nada adicional. La forma más fácil de jugar con Lua es usar la demostración en vivo en línea.

Puede encontrar muchos buenos tutoriales sobre Lua en línea y debe echar un vistazo al Manual de referencia de Lua, Programación en Lua, The.Lua.Tutorial y The Tutorials Point Lua Tutorial.

Aquí hay un pequeño programa de Lua que le mostrará algunas de las características clave de Lua:

función local doubleIt (x) return x * 2 end para i = 1,10,1 do x = doubleIt (i) if (x == 10) luego print ("ten") más print (doubleIt (i)) end end

El código anterior muestra tres construcciones importantes de Lua: funciones, bucles y sentencias if. La función doubleIt () es muy simple, solo duplica el parámetro pasado X.

El código principal es un para bucle de 1 a 10. Llama doubleIt () para cada iteración Si el valor de retorno es 10 (es decir, cuando yo es 5) entonces el código imprime "diez" de lo contrario solo imprime el resultado de doubleIt ().

Si tiene alguna experiencia en codificación, entonces el código de ejemplo debería ser lo suficientemente fácil de seguir. Si está buscando aprender algo de programación básica, le sugiero que use algunos de los recursos vinculados anteriormente para perfeccionar sus habilidades.

Escribiendo el juego

Escribir programas básicos en Corona es simple. Solo necesita preocuparse por un archivo, main.lua, y deja que Corona haga todo el trabajo pesado. El juego que vamos a escribir es un simple juego de "tap". Un globo o una bomba fallarán en la pantalla. Si el jugador toca el globo, gana un punto, toca una bomba y el puntaje se dividirá entre 2, como penalización. Para escribir el código necesitas editar main.lua. Puedes hacer esto en cualquier editor de texto.

El Corona SDK tiene un motor de física 2D incorporado, que hace que crear juegos sea muy fácil. El primer paso para escribir el juego es inicializar el motor de física:

física local = require ("física") physics.start ()

El código se explica por sí mismo. La física del módulo se carga e inicializa, se asigna a la variable física. Para habilitar el motorphysics.start () se llama.

A continuación, creamos algunas variables útiles que serán útiles no solo para este juego simple, sino también para juegos más complejos. medio W y medio H mantenga los valores para la mitad del ancho de la pantalla y la mitad de la altura de la pantalla:

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

los monitor El objeto es un objeto predefinido que Corona pone a disposición global.

Ahora viene el primer paso que realmente hace que algo suceda en la pantalla:

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

Así como propiedades como contentHeight y contentWidth, el monitor El objeto también tiene muchas funciones útiles. los nueva imagen() La función lee un archivo de imagen (en este caso un .png) y lo muestra en la pantalla. Los objetos de visualización se representan en capas, por lo que, dado que esta es la primera imagen que colocamos en la pantalla, siempre será el fondo (a menos que el código explícitamente haga algo para cambiar eso). Los parametros medio W y medio H dile a Corona que coloque la imagen en el medio.

En este punto, puede ejecutar el código en el emulador y ver la imagen de fondo. Si guarda el archivo, el emulador notará que el archivo ha cambiado y ofrecerá reiniciarlo. Si eso no sucede, utilice Archivo-> Relanzar.

Dado que el usuario obtendrá puntos por tocar globos, debemos inicializar una variable de puntaje y mostrar el puntaje en la pantalla:

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

La puntuación se mantendrá en la variable llamada imaginativamente Puntuación,y scoreText es el objeto que muestra la puntuación. Me gusta nueva imagen(), nuevo texto() poner algo en la pantalla, en este caso texto. Ya que scoreText es una variable global, entonces podemos cambiar el texto en cualquier momento. Pero llegaremos a eso pronto.

Puede relanzar el emulador y ver la puntuación de 0 en la parte superior de la pantalla.

Izquierda: solo el fondo. Derecha: antecedentes y puntuación.

Ahora viene algo un poco más complicado, pero no se preocupe, lo explicaré línea por línea:

función local balloonTouched (event) if (event.phase == "begin") luego Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end

El código anterior define una función llamada balloonTouchched () que se llamará cada vez que se toque un globo. Todavía no le hemos dicho a Corona que llame a esta función cada vez que se toca el globo, eso vendrá más tarde, pero cuando lo hagamos, se llamará a la función.

Los eventos de toque o toque tienen varias etapas, muchas para admitir el arrastre. El usuario coloca su dedo sobre un objeto, esta es la fase "iniciada". Si deslizan su dedo en cualquier dirección, esa es la fase "movida". Cuando el usuario levanta su dedo de la pantalla, esa es la fase "finalizada".

La primera línea de balloonTouchched () comprueba que estamos en la fase "iniciada". Queremos eliminar el globo e incrementar la puntuación lo antes posible. Si se vuelve a llamar a la función para otras fases como "finalizada", la función no hace nada.

Dentro deSi declaración son cuatro líneas de código. Tratemos primero los dos últimos, ya que son más simples.puntaje = puntaje + 1 solo incrementa el puntaje en uno yscoreText.text = puntaje cambia el texto de la puntuación en la pantalla para reflejar la nueva puntuación. Recuerda como dije esoscoreText era global y se podía acceder a él desde cualquier lugar, bueno, eso es lo que hacemos aquí.

Ahora para las dos primeras líneas. Una vez que un globo o bomba cae de la parte inferior de la pantalla todavía existe en la memoria de la aplicación, es solo que no puedes verlo. A medida que el juego progresa, el número de estos objetos fuera de la pantalla aumentará constantemente. Por lo tanto, necesitamos tener un mecanismo que elimine los objetos una vez que estén fuera de la vista. Hacemos eso en una función llamadafuera de la pantalla, que aún no hemos escrito. Esa función se llamará una vez por fotograma durante el juego. Una vez que se ha tocado un globo, debemos eliminarlo y eliminar la llamada que verifica si el globo se ha salido de la pantalla.

La líneaevent.target:removeSelf () elimina el globo Cuando ocurre un evento táctil, uno de los parámetros de la función de escucha esevento parámetro. Le dice a la función sobre el evento y qué tipo de evento es, p.event.phase También nos dice qué globo fue golpeado,event.target. losremoveSelf () La función hace lo que dice que hace, elimina el objeto (en este caso un globo).

La línea anterior elimina el oyente "enterframe", que es la función que se llama cada cuadro para ver si el globo se ha caído de la parte inferior de la pantalla. Lo veremos con más detalle cuando lleguemos a escribir elfuera de la pantalla función de oyente

Entonces, para recapitular.balloonTouchched ()comprueba que este es el comienzo de la secuencia táctil. Luego, elimina el oyente "enterframe", que es la función que se llama cada cuadro para ver si el globo se ha caído de la parte inferior de la pantalla. Luego elimina el globo, incrementa el puntaje y muestra el nuevo puntaje.

Eso fue para globos, ahora necesitamos algo similar para bombas:

función local bombTouched (event) if (event.phase == "begin") luego Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = puntaje final final

Como puede ver, el código es muy similar con la excepción de que, en lugar de incrementar el puntaje, el puntaje se multiplica por 0.5 (es decir, se divide por 2). los math.floor () La función redondea la puntuación al entero más cercano. Entonces, si el jugador tenía un puntaje de 3 y tocaba una bomba, el nuevo puntaje sería 1 y no 1.5.

Mencioné el fuera de la pantalla() funcionar antes Esta función se llamará cada cuadro para verificar si un objeto ha salido de la pantalla. Aquí está el código:

función local fuera de pantalla (self, event) if (self.y == nil) luego return end if (self.y> display.contentHeight + 50) luego Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

En informática existe una situación conocida como condición de carrera. Aquí es donde sucederán dos cosas, pero una podría suceder primero, o, a veces, la otra podría suceder primero. Es una carrera. Algunas condiciones de carrera no se ven porque una cosa siempre parece suceder primero, pero pueden causar errores interesantes en ese día, en las condiciones adecuadas, lo otro sucede primero y luego el sistema se rompe.

Hay una condición de carrera en este juego simple porque dos cosas pueden suceder muy cerca una de la otra: un globo que se toca y fuera de la pantalla() Se llama a la función para ver si el globo se ha salido de la pantalla. El resultado es que se puede invocar el código para eliminar el globo y luego fuera de la pantalla() Se llama a la función (que ocurre como 30 veces por segundo). Para sortear esta extraña secuencia de eventos, el fuera de la pantalla() la función necesita verificar si el y el valor del objeto es nulo (nulo) o no. Si esto es nulo entonces significa que el objeto ya se ha eliminado, así que avance, estos no son los droides que estamos buscando.

Si el objeto todavía está en juego, verifique su posición, si se ha alejado 50 píxeles de la pantalla, elimínelo y elimine el oyente para que fuera de la pantalla() No se volverá a llamar a la función para este objeto. El código para asegurarse de quefuera de la pantalla() se llama cada cuadro es parte de la siguiente sección de código.

La premisa de este juego es que nuevos globos o bombas continuarán desplegando la pantalla. Por lo tanto, necesitamos una función que cree un globo nuevo o una bomba nueva:

función local addNewBalloonOrBomb () local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) then - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) else - Globo local balloon = display.newImage ("red_balloon.png", startX, -300) physics.addBody (globo) balloon.enterFrame = fuera de pantalla Tiempo de ejecución: addEventListener ("enterFrame", globo) globo: addEventListener ("touch", globo tocado) fin final

La primera línea de la función decide desde dónde caerá el globo X avión. Si el globo o la bomba siempre caen en el medio, ¡eso no será muy interesante! Asi questartX es un número aleatorio entre 10 por ciento y 90 por ciento del ancho de la pantalla.

A continuación, se elige un número aleatorio entre 1 y 5.Si el número es 1, se arrojará una bomba. Si es 2, 3, 4 o 5, se lanzará un globo. Esto significa que las bombas se lanzarán alrededor del 20 por ciento de las veces.

El código de la bomba y el globo son bastante similares. Primero, la imagen (ya sea una bomba o un globo) se muestra usandonueva imagen(). Sus X posición es la destartX mientras que es y la posición se establece en -300, es decir, fuera de la parte superior de la pantalla. La razón de esto es que queremos que el objeto caiga desde fuera del área de la pantalla hacia el área visible y luego desde la parte inferior. Como estamos usando el motor de física 2D, es bueno darle al objeto un poco de distancia inicial para que caiga, de modo que pueda ganar algo de velocidad.

La llamada aphysics.addBody () toma la imagen cargada por nueva imagen() y lo convierte en un objeto en el motor de física. Esto es muy poderoso. Cualquier archivo de imagen puede convertirse en un cuerpo que responda a la gravedad y a las colisiones simplemente llamandophysics.addBody ().

Las últimas tres líneas del código de bomba o globo configuraron a los oyentes. Establecer elenterFrame La propiedad le dice a Corona qué función llamar a cada trama y la llamada aTiempo de ejecución: addEventListener () lo configura Por último la llamada aglobo: addEventListener () le dice a Corona qué función llamar si se toca la bomba o el globo.

Y ahora el juego está casi completo. Solo necesitamos dos líneas más de código:

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

La primera línea hace caer la primera bomba o globo al llamar explícitamenteaddNewBalloonOrBomb (). La segunda línea configura un temporizador que llamaráaddNewBalloonOrBomb () cada medio segundo (500 milisegundos). Esto significa que un nuevo globo o bomba caerá cada medio segundo.

Ahora puedes ejecutar el juego en el emulador.

Aquí está la lista completa de main.lua, el código fuente completo del proyecto para este juego se puede encontrar aquí en GitHub.

-------------------------------------------------- --------------------------------------- - - Juego de globo y bomba que cae - Escrito por Gary Sims para - ------------------------------------------- ---------------------------------------------- -- Iniciar el physics engine local physics = require ("physics") physics.start () - Calcula la mitad del ancho y la altura de la pantalla halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Establece el fondo local bkg = display.newImage ("night_sky.png", halfW, halfH) - Score score = 0 scoreText = display.newText (score, halfW, 10) - Llamado cuando el jugador toca el globo - Aumenta la puntuación en 1 globo de función local Tocado ( evento) if (event.phase == "comenzado") entonces Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end - Se llama cuando el jugador toca la bomba: la mitad del puntaje como penalización función local bombTouched (event) if (event.phase == "comenzó") luego Tiempo de ejecución: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score end end - Eliminar objetos que se han caído parte inferior de la pantalla función local fuera de la pantalla (self, event) if (self.y == nil) luego return end if (self.y> display.contentHeight + 50) luego Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Agregue una nueva función local de globo o bomba descendente addNewBalloonOrBomb () - Puede encontrar red_ballon.png y bomb.png en el repositorio de GitHub local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) entonces - ¡BOMBA! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) else - Globo local balloon = display.newImage ("red_balloon.png", startX, -300) physics.addBody (globo) balloon.enterFrame = fuera de pantalla Tiempo de ejecución: addEventListener ("enterFrame", globo) globo: addEventListener ("touch", balloonTouched) end end - Agregue un nuevo globo o bomba ahora addNewBalloonOrBomb () - Siga agregando un nuevo globo o bomba cada 0.5 segundos timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Próximos pasos

El siguiente paso es jugar el juego en un dispositivo Android real. Para compilar un archivo .apk, haga clic en Archivo-> Compilar para Android ... y complete los campos. El resultado será un archivo .apk que puede copiar en su dispositivo y luego instalar. Deberá asegurarse de haber configurado su dispositivo para permitir la instalación de aplicaciones de fuentes desconocidas. Amazon tiene buena documentación sobre esto, ya que también debe configurarlo para instalar Amazon Appstore. Corona también tiene una guía sobre cómo firmar, crear y probar su aplicación en dispositivos Android.

Con el juego instalado con éxito en su dispositivo, lo siguiente que debe hacer es mejorar el juego. Por ejemplo, ¿por qué no intentar agregar un sonido "pop" o "bang" cada vez que se toca un globo o una bomba? Corona tiene una API para eso:media.playEventSound ().

¿O por qué no intentar agregar un tercer tipo de objeto, digamos un súper impulso que duplica la puntuación actual, o qué tal un poco de música de fondo?

Envolver

Escribir juegos con Corona es bastante sencillo porque el SDK maneja cosas como OpenGL e incluye un motor de física 2D incorporado. Además, Lua es fácil de aprender y no debería ser difícil para cualquier persona con el mínimo de experiencia en programación. El sitio web de Coronalabs tiene mucha documentación que incluye muchas guías y tutoriales.

En menos de 100 líneas de código tenemos un juego que funciona. OK, no va a ganar ningún premio, sin embargo, muestra el poder y la flexibilidad del Corona SDK.

Tu múica merece er ecuchada en el de la máxima calidad, pero u aldo bancario no tiene por qué vere afectado. Por tiempo limitado, puede adquirir lo altavoce Bluetooth Thonet y Vander Ve...

Nuetra neceidade de carga etán aumentando día a día. A medida que acumula má dipoitivo con diferente método de carga, lo que realmente neceita e un cargador todo en uno. ¿...

Publicaciones Fascinantes