Anuncios Google

Ayuda en Lua Dev con Colisiones[Code actualizado]

Hola!:

BuenO estoy programando y quiero que cuando el objeto bola1  colisione(choque) con el objeto porteria aparesca un os.message.

Pero a la hora de que presiono X y se encuentran o por sí decirlo choqa la bola 1 con la porteria no aparece nada :S.

Aqui mi code:

--Nivel 1
--Tablas,cargo de imagennes y variables
bola1 = {img = image.load("bolas/bola1.png"),x=436,y=136,w=50,h=50}
porteria = {img = image.load("porterias/porteria1.png"),x1=0,y1=0,x=0,y=0,x2=0,y2=272,dir="d",w=80,h=44}
blanco = color.new(255,255,255)
 
--Funciones 
function colision(object1,object2)
if object1.x+object1.w >= object2.x and
object1.x <= object2.x+object2.w and
object1.y+object1.h >= object1.y and
object1.y <= object2.y+object2.h then
screen.print(100,100"Chocaste, pasa al siguiente nivel",blanco)
end
end
 
function move(object,vel)
if object.dir=="r" then 
	object.x=object.x+vel
elseif object.dir=="l" then 
	object.x=object.x-vel
elseif object.dir=="u" then 
	object.y=object.y-vel
elseif object.dir=="d" then 
	object.y=object.y+vel
end
if object.dir=="r" and object.x>=object.x2+1 then
	object.dir="l"
end
if object.dir=="l" and object.x<=object.x1-1 then
	object.dir="r"
end
if object.dir=="d" and object.y>=object.y2+1 then
	object.dir="u"
end
if object.dir=="u" and object.y<=object.y1-1 then
	object.dir="d"
end
end
 
function dispara()
if controls.press("cross") then
	bola1.x=bola1.x-8
end
end
 
function moverbola()
if controls.up() then
	bola1.y=bola1.y-4
end
if controls.down() then
	bola1.y=bola1.y+4
end
end
 
--Bucle Principal 
while true do
controls.read()
porteria.img:blit(porteria.x,porteria.y)
bola1.img:blit(bola1.x,bola1.y)
moverbola()
move(porteria,5)
dispara()
colision(bola1,porteria)
if controls.press("start") then 
	causaerror()
end
screen.flip()
end

Saludos y gracias de antemano (:.

Ahora lo he intentando asi, pero nada solo se ve la bola encima de la porteria, y nada no aparece nada S:

 


Creo que y alo ahn cerrado, Deviante si ves mi respuesta enviame un MP para responderme..


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.
Imagen de DeViaNTe

function

function colision(object1,object2)
if object1.x+object1.w >= object2.x and
object1.x <= object2.x+object2.w and
object1.y+object1.h >= object1.y and
object1.y <= object2.y+object2.h then
screen.print(100,100"Chocaste, pasa al siguiente nivel",blanco)
end
end
 
function colision(o1,o2)
 if o1.x+o1.w >= o2.x and
   o1.x <= o2.x+o2.w and
    o1.y+o1.h >= o2.y and
    o1.y <= o2.y+o2.h then
     screen.print(10,10,"OBJ 1 DENTRO DE OBJ 2");
 end
 
 local inrect(ox,oy,x,y,w,h) = function()
  return ox >= x and ox <= x+w and oy >= y and oy <= y+h 
 end
 
 if inrect(o1.x,o1.y,o2.x,o2.y,o2.w,o2.h) or inrect(o1.x+o1.w,o1.y,o2.x,o2.y,o2.w,o2.h) or inrect(o1.x,o1.y+o1.h,o2.x,o2.y,o2.w,o2.h) or inrect(o1.x+o1.w,o1.y+o1.h,o2.x,o2.y,o2.w,o2.h) then
  screen.print(10,30,"OBJ1 TOCA A OBJ2");
 end
end

Fijate en tu funcion original, y fijate en la que te puse yo.

Tu code mira que el objeto esté DENTRO del otro objeto. (a parte, pusiste mal una coordenada). Pero la porteria mide menos de alto, que la bola. Literalmente imposible que te cumpla la función, nunca te va a detectar colision por ningun lado.

Fijate mi función. Te dice si está dentro, o tocando en cualquier punto.

Las cosas si se pueden hacer, otra cosa es que desistas antes de conseguirlo :P


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de barney77

¿Podrías

¿Podrías decirme que coordenada tengo mal?, esque sigue sin funcionar ..

Aqui mi code(por si está mal):

--Nivel 1
--Tablas,cargo de imagennes y variables
bola1 = {img = image.load("bolas/bola1.png"),x=436,y=136,w=50,h=50}
porteria = {img = image.load("porterias/porteria1.png"),x1=0,y1=0,x=0,y=0,x2=0,y2=272,dir="d",w=80,h=44}
blanco = color.new(255,255,255)
 
--Funciones 
function colision(object1,object2)
if object1.x+object1.w >= object2.x and
object1.x <= object2.x+object2.w and
object1.y+object1.h >= object1.y and
object1.y <= object2.y+object2.h then
screen.print(100,100"Chocaste, pasa al siguiente nivel",blanco)
end
end
 
function colision(o1,o2)
 if o1.x+o1.w >= o2.x and
   o1.x <= o2.x+o2.w and
    o1.y+o1.h >= o2.y and
    o1.y <= o2.y+o2.h then
     screen.print(10,10,"OBJ 1 DENTRO DE OBJ 2")
 end
 
 local inrect(ox,oy,x,y,w,h) = function()
  return ox >= x and ox <= x+w and oy >= y and oy <= y+h 
 end
 
 if inrect(o1.x,o1.y,o2.x,o2.y,o2.w,o2.h) or inrect(o1.x+o1.w,o1.y,o2.x,o2.y,o2.w,o2.h) or inrect(o1.x,o1.y+o1.h,o2.x,o2.y,o2.w,o2.h) or inrect(o1.x+o1.w,o1.y+o1.h,o2.x,o2.y,o2.w,o2.h) then
  screen.print(10,30,"OBJ1 TOCA A OBJ2")
 end
end
 
function move(object,vel)
if object.dir=="r" then 
	object.x=object.x+vel
elseif object.dir=="l" then 
	object.x=object.x-vel
elseif object.dir=="u" then 
	object.y=object.y-vel
elseif object.dir=="d" then 
	object.y=object.y+vel
end
if object.dir=="r" and object.x>=object.x2+1 then
	object.dir="l"
end
if object.dir=="l" and object.x<=object.x1-1 then
	object.dir="r"
end
if object.dir=="d" and object.y>=object.y2+1 then
	object.dir="u"
end
if object.dir=="u" and object.y<=object.y1-1 then
	object.dir="d"
end
end
 
function dispara()
if controls.cross() then
	bola1.x=bola1.x-8
end
end
 
function moverbola()
if controls.up() then
	bola1.y=bola1.y-4
end
if controls.down() then
	bola1.y=bola1.y+4
end
end
 
--Bucle Principal 
while true do
controls.read()
porteria.img:blit(porteria.x,porteria.y)
bola1.img:blit(bola1.x,bola1.y)
moverbola()
move(porteria,5)
dispara()
colision(bola1,porteria)
if controls.press("start") then 
	causaerror()
end
screen.flip()
end

Y otra cosa, de esas funciones me parece que necesito la 2da, que es "Objeto 1 dentro de Objeto 2", el objeto1 es la bola y quiero que cuando este adentro de la porteria(objeto2) el puntaje aumente(eso me parece es con archivos .ini), pero me preocupa porque ninguna de las 3 funciona, en ningun momento aparece ningun texto en pantalla, o forzozamente tengo que atinarle a la porteria? porque cuando baja se supone que ya hace contacto con la bola S:.

Saludos.

Ya encontré el error, tenías

Ya encontré el error, tenías el mismo error que nauti, pruébalo así :

function colision(object1,object2) if object1.x+object1.w >= object2.x and object1.x <= object2.x+object2.w and object1.y+object1.h >= object2.y and object1.y <= object2.y+object2.h then screen.print(100,100"Chocaste, pasa al siguiente nivel",blanco) end end

Imagen de barney77

Na,

Naah !, no sirve queda igual, se encima en ella.

aqui el code:

--Nivel 1
--Tablas,cargo de imagennes y variables
bola1 = {img = image.load("bolas/bola1.png"),x=436,y=136,w=50,h=50}
porteria = {img = image.load("porterias/porteria1.png"),x1=0,y1=0,x=0,y=0,x2=0,y2=272,dir="d",w=80,h=44}
blanco = color.new(255,255,255)
 
--Funciones 
function colision(objeto1,objeto2)
if objeto1.x+objeto1.w >= objeto2.x and
objeto1.x <= objeto2.x +objeto2.w and
objeto1.y + objeto1.h >= objeto2.y and
objeto1.y <= objeto2.y + objeto2.h then
screen.print(100,100,"chocaste",blanco)
end
end
 
 
function move(object,vel)
if object.dir=="r" then 
	object.x=object.x+vel
elseif object.dir=="l" then 
	object.x=object.x-vel
elseif object.dir=="u" then 
	object.y=object.y-vel
elseif object.dir=="d" then 
	object.y=object.y+vel
end
if object.dir=="r" and object.x>=object.x2+1 then
	object.dir="l"
end
if object.dir=="l" and object.x<=object.x1-1 then
	object.dir="r"
end
if object.dir=="d" and object.y>=object.y2+1 then
	object.dir="u"
end
if object.dir=="u" and object.y<=object.y1-1 then
	object.dir="d"
end
end
 
function dispara()
if controls.cross() then
	bola1.x=bola1.x-8
end
end
 
function moverbola()
if controls.up() then
	bola1.y=bola1.y-4
end
if controls.down() then
	bola1.y=bola1.y+4
end
end
 
--Bucle Principal 
while true do
controls.read()
porteria.img:blit(porteria.x,porteria.y)
bola1.img:blit(bola1.x,bola1.y)
moverbola()
move(porteria,5)
dispara()
colision(bola1,porteria)
if controls.press("start") then 
	causaerror()
end
screen.flip()
end

Creo que no soy para programar, lo mio es ayudar.

Un saludo y gracias por tu ayuda =/.

Imagen de barney77

Miren

Miren: solo aparece la bola arriba de la porteria y aún así no aparece nada.

Crei que eran los limites, y los cambie para que no pasara de la porteria( para que no estuviera encima de ella) pero no sigue igual, no se si tenga que ver que la porteria se mueve y no le atino xD, pero aún así cuando pasa a la posicion donde quedo la bola deberia de pasar el screen,print a la pantalla no?.

 

EDITO: estoy intentaod quitandole el move a la porteria, pero se lo quite y se sigue moviendo o.o

Mira mi code:

--Nivel 1
--Tablas,cargo de imagennes y variables
bola1 = {img = image.load("bolas/bola1.png"),x=436,y=136,w=50,h=50}
porteria = {img = image.load("porterias/porteria1.png"),x1=0,y1=0,x=0,y=0,x2=0,y2=0,dir="d",w=80,h=44}
blanco = color.new(255,255,255)
 
--Funciones 
function colision(object1,object2)
if object1.x+object1.w >= object2.x and
object1.x <= object2.x+object2.w and
object1.y+object1.h >= object1.y and
object1.y <= object2.y+object2.h then
screen.print(100,100"Chocaste, pasa al siguiente nivel",blanco)
end
end
 
function dispara()
if controls.press("cross") then
	bola1.x=bola1.x-8
end
end
 
function moverbola()
if controls.up() then
	bola1.y=bola1.y-4
end
if controls.down() then
	bola1.y=bola1.y+4
end
end
 
--Bucle Principal 
while true do
controls.read()
porteria.img:blit(porteria.x,porteria.y)
bola1.img:blit(bola1.x,bola1.y)
moverbola()
dispara()
colision(bola1,porteria)
if controls.press("start") then 
	causaerror()
end
screen.flip()
end

EDITO2: Ahora he quitado de la tabla porteria el argumento "dir='d'" y se mueve D:.

Imagen de iRVing_Prog

No hay errores en código

Hasta donde veo no hay ningun error en el codigo, verifica si las medidas de altura y anchura de las imagenes son las correctas. No se me ocurre otra cosa.

Si necesitas que pruebe el codigo me lo puedes mandar por MP junto a las imagenes que usas :)

Saludos ^^


 

Prueba quitando eso: if

Prueba quitando eso:

if bola1.x<0 then bola1.x=0 elseif bola1.x+50>480 then bola1.x=480-50 end   if bola1.y<0 then bola1.y=0 elseif bola1.y+50>272 then bola1.y=272-50 end

Imagen de barney77

Pues

Pues mira, lo he quitado, pero sigue igual, aunque choquen o más bien dicho aunque lo toque no aparece nada, he cambiado el os.message por un screen.print, pero sigue igual.

Imagen de --Gomasz--

Mejor

Mejor porque no explicas como lo solucionaste ;).

Imagen de barney77

Porque

Porque no lo he solucionado =).

Imagen de --Gomasz--

ha

ahora veo no lei bien el titulo del hilo pense que decia me las arregle yo solo :P.

Saludos--

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.