Anuncios Google

Duda con colisiones (Luadev)

Bien pues tras leerme no se cuantas veces el tuto de chime sobre las colisiones no se como aplicarlas...

function colision(obj1, obj2) -- esta función, verifica si hay colisión o no entre dos objetos, notar que, DENTRO de la función se usan los parámetros que recibe, más adelante, veremos como se usa
	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, es decir, no hay colisión
end

 

Alguien podría explicarme las colisiones de una forma sencilla??

 

------------------

Edito

Jajajaja ya lo tengo...

 

Aqui dejo mi codigo por si le sirve a alguien ;) Lo explico TODO con -- xDD

--Esta funcion es la base... Las colisiones...
 
function colision(obj1, obj2) 
	if obj1.x+obj1.w>obj2.x 
	and obj1.x<obj2.x+obj2.w 
	and obj1.y+obj1.h>obj2.y 
	and obj1.y<obj2.y+obj2.h then 
		return true 
	end
return false 
end
 
--Color rojo
 rojo=color.new(255,0,0)
 
--Arrays (Fijense que al final pone "oldx" y "oldy" eso se refiere a la antigua "x" e "y".
 
 
personaje = {img = image.load("imagen.png"),x=100,y=100,w=0,h=0,vida=100,oldx=0,oldy=0}
 
--Igual... (OJO en "w" y "h" pongo 0 porque seran las de la imagen...
 
jer = {img = image.create(30,20,rojo),x=200,y=100,w=0,h=0,vida = 100,oldx=0,oldy=0}
 
-- Y aqui igual pero no pongo old porque con este no me interesa...
enemigo = {img= image.load("imagen2.png"),x=44,y=57,w=0,h=0}
 
personaje.w = personaje.img:width()
personaje.h = personaje.img:height()
enemigo.w = enemigo.img:width()
enemigo.h = enemigo.img:height()
 
--Ya tenemos los personajes, vamos por lo interesante xDDD
 
while true do 
--Jajajaj aqui decimos que la antigua posicion es igual a la verdadera... 
--Pronto entenderan esto
 
personaje.oldx=personaje.x
personaje.oldy=personaje.y
jer.oldx=jer.x
jer.oldy=jer.y
 
 
controls.read()
 
--Mostramos la vida
screen.print(20,20,personaje.vida)
 
--Mostramos la imagen (Siempre usamos la coordenada verdadera no la "old")
personaje.img:blit(personaje.x, personaje.y)
jer.img:blit(jer.x, jer.y)
enemigo.img:blit(enemigo.x,enemigo.y)
 
--Movemos el personaje (Siempre usamos la coordenada verdadera no la "old")
if controls.press("down") then personaje.y=personaje.y+10 jer.y=jer.y+10 end
if controls.press("left") then personaje.x=personaje.x-10 jer.x=jer.x-10 end
if controls.press("up") then personaje.y=personaje.y-10 jer.y=jer.y-10 end
if controls.press("right") then personaje.x=personaje.x+10  jer.x=jer.x+10 end
 
--POR FIN: Si colisionan personaje y enemigo entonces las coordenadas del personaje
--seran las anteriores, y por lo tanto no podra atravesar nunca eso...
--E igual con las otras 2
 
if colision(personaje,enemigo) then
	personaje.x = personaje.oldx
	personaje.y = personaje.oldy
--Aqui puedes decir que si colisionan vida=vida-"Lo que tu quieras" por ejemplo
end
 
if colision(jer,enemigo) then
	jer.x = jer.oldx
	jer.y = jer.oldy
end
 
if colision(jer,personaje) then
	jer.x = jer.oldx
	jer.y = jer.oldy
 
end
 
--Y ya esta...!!! Asi de sencillo

 

Gracias y Saludos

 

 


Risa Dos años en SCENEBETA Risa

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


Anuncios Google

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.

Como puedes ver esa función

Como puedes ver esa función necesita de parámetros dos tablas o arrays o matrices o vectores o arreglos, como le quieras llamar, que contengan cada una 4 variables, esas son la coordenada x donde se encuentra, la y, el ancho del "objeto" y el alto. Entonces esa función retorn true si se cumple la colisión entre dos objetos, para aplicarlo basta con un simple if y luego lo que quieres que haga si se cumple la colisión, por ejemplo, quieres que si colisione el jugadot contra el enemigo, la vida del jugar baje 10:

--Creas las tablas/arrays/vectores/matrices/arreglos
	personaje = {x=100,y=100,w=40,h=50,vida = 100}
	enemigo = {x=40,y=57,w=20,h=60}
--Y la colisión
	if colision(personaje,enemigo) then
		personaje.vida = personaje.vida - 10
	end
 

Imagen de jorge_97

By jorge_97

Si pero obj1 y obj2 funcionan como cualquier variable???

Si es asi seria buenisimo

Claro, la funcion no la

Claro, la funcion no la tienes que tocar, es como si ya viniera de LuaDEV, el primer parámetro pasa a ser obj1 y el segundo ob2.

Imagen de jorge_97

By jorge_97

Todo perfecto!! Muchas gracias xerpi excepto esto:

He puesto comentarios en el codigo --

 

function colision(obj1, obj2) 
	if obj1.x+obj1.w>obj2.x 
	and obj1.x<obj2.x+obj2.w 
	and obj1.y+obj1.h>obj2.y 
	and obj1.y<obj2.y+obj2.h then 
		return true 
	end
return false 
end
 
--Arrays
personaje = {x=100,y=100,w=40,h=50,vida = 100}
enemigo = {x=40,y=57,w=20,h=60}
--Las imagenes si me funcionan xDDD
imagen=image.load("imagen.png")
imagen2=image.load("imagen2.png")
--Todo perfecto
while true do 
controls.read()
screen.print(20,20,personaje.vida)
 
 
imagen:blit(personaje.x, personaje.y)
imagen2:blit(enemigo.x,enemigo.y)
 
if controls.press("down") then personaje.y=personaje.y+10 end
if controls.press("right") then x=x+10 x=x+10 end
if controls.press("left") then personaje.x=personaje.x-10 end
if controls.press("up") then personaje.y=personaje.y+10  end
if controls.press("right") then personaje.x=personaje.x+10 end
--Este es el problema... Mi duda es: ¿Como hago para que si colisiona vuelva a su posicion anterior?
 
	if colision(personaje,enemigo) then
		personaje.vida = personaje.vida - 10 --Es decdir que pongo aqui?
	end
	--Esta condicion es para salir, la he cambiado porque Broke() me aburria xDDD
	if controls.cross() then alamierda() end
	screen.flip()
	end


Risa Dos años en SCENEBETA Risa

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

Imagen de barney77

Mmm...if

Mmm...

if colision(personaje,enemigo) then personaje.posicion=laposicsion end

Eso es lo que entendi, pero veo que disminuye 10 pixeles conforme vaya presionando, entonces se me ocurre...

if colision(personaje,enemigo) then personaje.x=personaje.x-10 end

 

Imagen de jorge_97

By jorge_97

Eiii pues no he pensado eso... xDDDD podria funcionar...

Imagen de barney77

Pues ya sabes, solo

Pues ya sabes, solo imaginación xD, prueba aver que tal.

Imagen de jorge_97

By jorge_97

Ok y te cuento!!... Pero mañana xDDD que aqui en España ya son las 02:00

Saludos y gracias!

Imagen de Dioni0396

asi te funciona?

vaya...

No me se bien las colisiones xD

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.