Todo el mundo ama un buen juego de física, pero seamos sinceros: ¡es mucho más divertido cuando estás explotando cosas! Este tutorial te mostrará cómo usar el motor de física Corona para crear explosiones en tu juego.
Como parte de la limpieza, comencemos por crear un archivo build.settings con el siguiente código:
settings = orientación = default = "landscapeRight", admitido = "landscapeLeft", "landscapeRight"
Los detalles detrás de todas las opciones para este archivo están fuera del alcance de este tutorial. La configuración anterior forzará la orientación del dispositivo móvil en modo horizontal u horizontal. Como solo tenemos un conjunto de gráficos, forzar una orientación horizontal mantendrá las cosas más simples.
A continuación, comenzaremos configurando nuestro motor de física en nuestro archivo main.lua:
física local = requiere ("física") physics.start () display.setStatusBar (display.HiddenStatusBar)
Fácil verdad? Corona es impresionante! En esta sección, también hemos incluido una línea para ocultar la barra de estado. Esto nos permite controlar toda la pantalla del dispositivo móvil sin ningún componente nativo.
Ahora que hemos terminado con lo básico, agreguemos un fondo de aspecto agradable y centre su posición con respecto al centro del dispositivo móvil:
local background = display.newImage ("bricks.png", 0, 0, true) background.x = display.contentWidth / 2 background.y = display.contentHeight / 2
En el código anterior, estamos agregando una imagen de fondo al escenario con el método display.newImage. Su posición inicial en la esquina superior izquierda es 0,0, como se indica en los parámetros 2 y 3. De forma predeterminada, Corona colocará las imágenes con un punto de anclaje en su centro exacto. Utilizamos los métodos x, y en el objeto de fondo para colocar el punto de anclaje de la imagen en el centro exacto de la pantalla.
Antes de agregar objetos dinámicos a la pantalla, agreguemos un piso para que se sienten:
local floor = display.newImage ("floor.png", 0, 280, true) physics.addBody (floor, "static", friction = 0.5)
Añadimos una imagen como lo hicimos para el fondo, colocándola en la parte inferior de la pantalla. El objeto de piso se agrega luego al escenario como un cuerpo físico "estático". "Estático" en este caso significa que el objeto interactuará con otros objetos físicos en la pantalla, pero no se verá afectado por la gravedad o cualquier fuerza inercial de los objetos en movimiento..
Nuestro siguiente paso será configurar un montón de cajas apiladas precariamente que están esperando para ser sacudidas:
cajas locales = para i = 1, 5 do para j = 1, 5 do crates [i] = display.newImage ("crate.png", 140 + (i * 50), 220 - (j * 50)) physics.addBody (cajas [i], densidad = 0.2, fricción = 0.1, rebote = 0.5) end end end
El código anterior puede parecer complejo al principio, pero en realidad es muy simple. Tenemos dos bucles anidados que hacemos un ciclo para crear un conjunto de cajas 5 de ancho y 5 de alto al incrementar los valores de x e y. Cada una de estas cajas se agrega al escenario como un cuerpo "dinámico". "Dinámico", aunque no se especifica en el código, es el tipo predeterminado para todos los cuerpos físicos. Hemos agregado algunos parámetros para determinar el comportamiento del objeto cuando las fuerzas actúan sobre él. El valor de densidad para cada caja será importante más adelante cuando determinemos la fuerza de nuestra explosión. Cuanto más densos son los objetos, mayor es la fuerza necesaria para moverlos. ¿Quieres probar algo divertido? Aumente el valor de rebote a 1.0 y observe qué sucede con las cajas..
¡Uf! Listo para la parte divertida? Vamos a volar estas cosas. El principio detrás de la creación de explosiones es determinar un epicentro de explosión y un radio de explosión, y afectar a todos los objetos que caen dentro de él. Para este ejemplo, el epicentro de la explosión estará determinado por el lugar donde tocamos la pantalla. Comencemos agregando ese comportamiento:
local circle = "" local function setBomb (event) si (event.phase == "comenzó") entonces circle = display.newCircle (event.x, event.y, 80) circle.myName =? circle? circle: setFillColor (0,0,0, 0) physics.addBody (circle, "static", isSensor = true) circle.collision = onLocalCollision circle: addEventListener ("collision", circle) end if (event.phase = = "terminó") luego circule: removeSelf () final fondo final: addEventListener ("touch", setBomb)
Aquí hemos definido un método llamado setBomb que genera un círculo invisible con un radio de 80. El círculo se coloca donde el usuario ha tocado la pantalla. El cuerpo de física que estamos agregando tiene un parámetro especial llamado isSensor establecido en verdadero. Los objetos sensores están presentes en el motor de física, pero no están afectados por la gravedad ni afectan a otros objetos. En este caso, estamos utilizando un objeto sensor simplemente para detectar qué cajas lo están contactando. El contacto se determinará escuchando eventos de colisión entre las cajas y nuestro sensor. Cualquier caja que colisione con nuestro sensor está dentro del radio de explosión y, por lo tanto, se verá afectada por la fuerza de la explosión..
El siguiente método se ejecutará cuando se detecte la colisión de cualquier objeto con el sensor que creamos en el código anterior.
* Como punto de información, el siguiente método debe definirse en el código antes del método setBomb anterior. Por razones de flujo, sin embargo, lo hemos colocado más adelante en el tutorial..
función local onLocalCollision (self, event) if (event.phase == "comenzó" y self.myName == "circle") entonces forcex local = event.other.x-self.x local forcey = event.other.y- self.y-20 if (forcex < 0) then forcex = 0-(80 + forcex)-12 else forcex = 80 - forcex+12 end event.other:applyForce( forcex, forcey, self.x, self.y ) end end
La idea básica detrás de este método es aplicar una fuerza a cualquier objeto que haya colisionado con nuestro círculo sensor. Hemos creado dos variables llamadas forcex y forcey. Usamos la distancia desde el centro de la caja al centro de nuestro círculo sensor para determinar la fuerza de la fuerza que aplicaremos. Al hacer esto, creamos la manera de un hombre pobre de disminuir la fuerza de la explosión cuanto más lejos esté el objeto del epicentro de la explosión. Todos estos números dependen en gran medida de las propiedades físicas de los objetos que estamos explotando..
* Nota: Las fuerzas como valores numéricos son mucho más altas que las propiedades de densidad, fricción y rebote de los objetos. Siéntase libre de jugar con estos valores para obtener algunos resultados interesantes.!
Y ahí lo tenemos. Este tutorial debería proporcionar un excelente punto de partida para crear todo tipo de juegos geniales con explosiones. Tómese un tiempo para experimentar con las propiedades y valores de todas las variables en este ejercicio.
En la Parte II de este tutorial, agregaremos algunas campanas y silbidos adicionales al marco de la explosión para hacerlo aún más destructivo.!
Deja algunos comentarios y hazme saber lo que piensas sobre la Parte I.