Anuncios Google

Lua: Colisiones y Sprites.

Tutoriales avanzados de Homebrewes

Hola de nuevo, como sabréis con esta ya llevamos la 9º Entrega, nos ha costado mucho, seguramente habréis pasado etapas con muchas dificultades, pero no os rindáis, debéis continuar. Y como sabréis poco a poco estas entregas se irán acabando, quizá esta sea una de las ultimas que se vayan haciendo. Bueno dejémonos de tanta palabrería y centrémonos, en esta entrega aprenderemos ha hacer una colisión y a manejar sprites.

Dividiremos este tutorial en 2 partes, primero las colisiones y luego los sprites.

Aprendiendo a usar colisiones.

La colisión es una función que cuando se produce (La colisión) devuelve un valor true, en caso contrario devolverá false. Veamos la colisión mas común y simple que se puede encontrar.

function Colision(obj1, obj2) --Esta función, verifica si hay colisión entre los objetos, dentro de la función se usan los parámetros que recibe.
	if obj1.x+obj1.w>obj2.x --Borde derecho obj1 > borde izquierdo obj2
	and obj1.x<obj2.x+obj2.w --Borde izquierdo obj1 < borde derecho obj2
	and obj1.y+obj1.h>obj2.y --Borde inferior obj1 > borde superior obj2
	and obj1.y<obj2.y+obj2.h then --Borde superior obj1 < borde inferior obj2
		return true --Retorna verdadero si hay colisión
	end
return false --Si el if no se cumple, viene a esta línea y retorna false, no hay colisión
end

Ahora al simplemente seria que donde queramos usarlo poner nuestros objetos, NECESITAMOS SI O SI SABER LA X, LA Y, EL ANCHO Y EL ALTO DE LOS OBJETOS OBLIGATORIAMENTE. En caso de que no se sepa, la funcion dara error. Un uso practico;

while true do
...
...
...
if Colision(Flecha, Cruz) then
os.exit()
end

Ahora si queremos que nuestro personaje no salga de la pantalla, usamos esta funcion que he creado personalmente;

function SinSalida(obj)
if obj.x <= 0 then obj.x = 0 end
if obj.y <= 0 then obj.y = 0 end
if obj.x >= (256 - obj.w) then obj.x = (256 - obj.w) end
if obj.y >= (192 - obj.h) then obj.y = (192 - obj.h) end
end

Igualmente necesitamos saber OBLIGATORIAMENTE todos los datos de la imagen. Est colisión impide que la imagen se salga de la pantalla.

Aprendiendo a usar sprites.

Los sprites son una de las caracteristicas principales de un RPG, sin ellos los RPG no serian lo que son hoy, quizás fuera otra cosa, vamos a aprender a usar sprites. Vamos a ver como usaríamos/cargaríamos un sprite:

Sprite.new(Imagen, FrameW, FrameH, VRAM)
--Frame W significa que en la imagen cuantos frames o pixeles debemos recortar en posicion X
--Frame H significa que en la imagen cuantos frames o pixeles debemos recortar en posicion Y
--Con un ejemplo lo entendereis mejor os pongo el ejemplo para la imagen de arriba:
spr = Sprite.new("sprite.png", 24, 32, VRAM) --Lo cargamos en una variable
--La estructura de los sprites en algo compleja, pero es sencillo de usar
--Como funciona, pues es simple, ponemos el nombre de la variable que contiene el Sprite.new(Yo al anterior lo pongo asi spr = Sprite.new("sprite.png", 24, 32, VRAM))
--Despues ponemos los dos puntos y escribimos addAnimaticion
--Y despues pondriamos los fotogramas.
--spr:addAnimation({0,1,2,1}, FPS)   
--[[ lo que hay entre corchetes { } son las divisiones que se mostraran a la hora de blitear la animacion , y FPS es la velocidad en milisegundos que queremos que vaya la animacion, facil verdad?]]
spr:addAnimation({0,1,2,1}, 300)                                   -- Camina hacia arriba
spr:addAnimation({3,4,5,4}, 300)                                   -- Camina hacia derecha
spr:addAnimation({6,7,8,7}, 300)                                   -- Camina hacia abajo
spr:addAnimation({9,10,11,10}, 300)                              -- Camina hacia izquierda

Bien, ahora debemos mostrar/cargar unas variables y finalmente mostrar el sprite.

x = 150
y = 80
direction = 1
while not Keys.newPress.Start do
Controls.read()
spr:playAnimation(SCREEN_DOWN, x, y, direction)     -- Cargamos animacion o mostramos animacion (como quieran llamarlo)
if Keys.held.Up then
 direction = 1 
y = y - 1 
end
if Keys.held.Right then
 direction = 2 
x = x + 1 
end
if Keys.held.Down then
 direction = 3 
y = y + 1 
end
if Keys.held.Left then 
direction = 4
 x = x - 1
 end
render()
end

¿Ven que fácil ha sido cargarlo?, Bueno pues así con todos, los sprites se preparan igual que las imágenes que se ven en el 5º Tutorial de imagen, aun así, les dejo la imagen de ejemplo que sirve perfectamente para los códigos de arriba (Cambiar el "sprite.png" de los ejemplos por este, sino nunca ira).

3.935485
Tu voto: Ninguno Votos totales: 3.9 (31 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de AnimeRoy

Problema en función SinSalida

Hola Dioni, gracias por tus tutoriales porque me han servido mucho. Queria comentarte un problema.

Yo también quería usar la misma idea de la función SinSalida para evitar que una imagen se salga de la pantalla pero me marca error de que intento comparar un nil con un número en las lineas que tienen coparaciones como obj.x <= 0.

La documentación del API de la versión 4.5 para el manejo de imagenes (http://code.google.com/p/microlua/wiki/ApiFourDotFive#Images) no menciona como obtener el valor X y Y de una imagen, pero si su ancho y alto mediante la función Image.width(imagen) y Image.height(imagen); a diferencia de usar img.w y img.h que no se mencionan en la documentación.

Es posible pasar el valor X y Y como parámetros para solucionar lo anterior pero entonces me surgió el problema del alcance de las variables (http://www.lua.org/manual/5.1/manual.html#2.6) que todavia no resuelvo.

Si a ti te funciona bien la función SinSalida me ayudaría mucho que mostraras el código completo para ver su funcionamiento.

EDIT:

Revisando código de un Pong en Lua me di cuenta de que el 'truco' es tener todos los atributos de una imagen dentro de un array:

img = {}
img.w = Image.width(imagen)
img.h = Image.height(imagen)
img.x = (SCREEN_WIDTH/2) - (Image.width(imagen)/2)
img.y = (SCREEN_HEIGHT/2) - (Image.height(imagen)/2)


Rodrigo [Roy]

Computación, Facultad de Ciencias, UNAM (México)

Imagen de jorge_97

By Jorge_97

Enhorabuena por los tutos Dioni se ve que te has esforzado mucho... Pero estos tutoriales no son casi los mismos que los de Chimecho??

Salu2


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Imagen de Dioni0396

En que sentido quieres hablar

en el orden? Si, es identico a chimecho, eso no lo niego, pero la explicacion si que es mia.

Gracias ^^

Imagen de jorge_97

By Jorge_97

Me refiero a que como es similar al de Chimecho que fue el que yo aprendi podria programar perfectamente para DS es muy sencillo por lo que veo...

Pero como tengo PSP y no DS..

 


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Imagen de Dioni0396

Gracias ^^

Y si quieres pon en el buscador Micro lua simulator y ya tienes tu emulador xD

y luego si tienes tu creacion me la pasas y la testeo.

Imagen de Kevinjosue2326

Ayuda....

Por Favor ayuda!!!!

http://nds.scenebeta.com/node/16291

 

Imagen de Dioni0396

Esto no tiene nada que ver con lua

Esto no tiene nada que ver con lua

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.