Anuncios Google

(AYUDA) Colisiones 3D en LuaDev + otra duda (SOLUCIONADO)

Hace poco vi tutoriales de colisiones, y decidi añadirlo a uno de mis homebrew.

Pero no me sale, el error es : script.lua: 7: loop in gettable

Aquí el script:

bola = {objeto = model.load("modelos/bola.obj"),	pos={x=0,y=-2,z=-14},rot={x=0,y=0,z=0},	w = 0.93, h = 0.93, p = 0.93}
canasto ={objeto = model.load("modelos/canasto.obj"),	pos={x=0,y=-2,z=-2},rot={x=-106,y=0,z=90},	w = 1.57, h = 1.25, p = 0.38}
--bloque = model.load("modelos/palo.obj")
pause = false
blanco = color.new(255,255,255)
puntos = "0"
 
 
function colision(obj1, obj2) 
	if  obj1.pos.x + obj1.w > obj2.pos.x and obj1.pos.x < obj2.pos.x + obj2.w 
	and obj1.pos.y + obj1.h > obj2.pos.y and obj1.pos.y < obj2.pos.y + obj2.h
	and obj1.pos.z + obj1.p > obj2.pos.z and obj1.pos.z < obj2.pos.z + obj2.p then 
		return true 
	end
	return false 
end
function savedata()
		lugares = {
					"Ranura 1",
					"Ranura 2",
					"Ranura 3",
					"Ranura 4",
					"Ranura 5"
					}
		guardado = {gameid = "fran98s_CTB"..os.date("%S"),savenames = lugares};
		subinfo = {
					title = "Puntuación guardada",
					subtitle = "Puntuación guardada de CTB (Catch the Ball!)",
					details = { "Usuario: "..os.nick(),"Puntuación: "..puntos,"Fecha: "..os.date("%d/%m/%Y %H:%M") },
					savetext = "Sin datos",
					}
		correct, good = savedata.save(guardado,subinfo,info)
		if correct then return good
		else return nil end
end
 
function cargar_save()
lugares = {
			"Ranura 1",
			"Ranura 2",
			"Ranura 3",
			"Ranura 4",
			"Ranura 5"
			}
lugar_save = {gameid = "fran98s_CTB"..os.date("%S"), savenames = lugares};
correct, good, yeah = savedata.load(lugar_save)
	if correct then return yeah:explode(lugar);
	else return nil end
end
 
--[[function pausar()
	while true do
	controls.read()
	if pause == true then
		image.blend(0,0,220,220,100)
		screen.print(250,250,"Pausa",2)
	end
end
end
]]--
 
world.lightenabled(1,true)
world.lightambient(1,blanco)
world.lightdiffuse(1,blanco)
world.lightspecular(1,blanco)
world.lighttype(1,2)
world.lightcomponent(1,1)
world.lightposition(1,0,0,0)
world.ambient(blanco)
world.specular(4.04)
world.update()
seg = timer.new()
seg:start()
mint = timer.new()
mint:start()
 
while true do
controls.read()
	total_min = math.floor(mint:time() / 60000)
	totalsec = math.floor(seg:time() / 1000)
	if controls.l() then canasto.pos.z=canasto.pos.z-0.2 end
	if controls.r() then canasto.pos.z=canasto.pos.z+0.2 end
	--[[for choque=1,30 do
		bloque:blit();
	end]]--
	bola.objeto:position(bola.pos.x,bola.pos.y,bola.pos.z)
	canasto.objeto:rotation(math.rad(canasto.rot.x),math.rad(canasto.rot.y),math.rad(canasto.rot.z));
	canasto.objeto:position(canasto.pos.x,canasto.pos.y,canasto.pos.z)
	bola.objeto:blit()
	canasto.objeto:blit()
	screen.print(20,160,"Tiempo: "..total_min..":"..totalsec,1,blanco,"right")
	if totalsec >= 60 then
		seg:reset()
	end
	--screen.print(10,50"Puntuación: "..puntos,1,blanco,"center")
	screen.print(5,0,"- -Canasto")
	screen.print(5,20,"Pos: "..canasto.pos.x..":"..canasto.pos.y..":"..canasto.pos.z.."   Rot: "..canasto.rot.x.." : "..canasto.rot.y.." : "..canasto.rot.z)
	screen.print(5,40,"- -Bola")
	screen.print(5,60,"Pos: "..bola.pos.x..":"..bola.pos.y..":"..bola.pos.z.."   Rot: "..bola.rot.x.." : "..bola.rot.y.." : "..bola.rot.z)
	--[[if savedata() == false then
		os.message("No se pudo guardar. Inténtelo más tarde")
	end
 
	cargadogood = cargar_save();
	if cargagood then
		for i=1,#cargagood do
			assert(loadstring(cargagood[i]))();
		end
	end
	]]--
	if colision(bola, canasto) then
		puntos = puntos+1
		screen.print(50,50,"¡COLISIÓN!")
	end
	if controls.left() then
		canasto.pos.x = canasto.pos.x-0.1
	end
	if controls.right() then
		canasto.pos.x = canasto.pos.x+0.1
	end
	if controls.down() then
		bola.pos.y = bola.pos.y-0.3
	end
	if controls.select() then
		captura = os.osk("Escriba el nombre del pantallazo","Pantallazo",20,3,0)
		image.save(screen.toimage(),"ms0:/PICTURE/"..captura..".png")
 
		captura = nil
 
		os.message("Captura realizada y guardada en ms0:/PICTURE")
	end
	--[[if controls.start() and pause == true then
		pause = false
	else pause = true
	end
	pausar();]]--
screen.flip()
end

 

No se si voy por el buen camino, dado que no se hacer colisiones.

Espero que me ayuden.

Saludos.


También me gustaría saber como mostrar muchas veces un objeto 3d en pantalla en distintas posiciones.

Saludos.

 

EDITO: Aquí están para descargar los dos objetos 3d (el enlace es de dropbox) (reposteado auque sea la misma direccion).

 



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 Mills

Acabo de ver tus objetos, y

Acabo de ver tus objetos, y lo 1º que veo es que no están centrados, tienes que situarlos justo donde se unen los tres ejes (verde azul y rojo) para que su posición corresponda.

En cuanto a lo de las medidas, yo uso blender y da lo mismo en que unidades estén, pero tienes que hacerlos todos con la misma unidad... por ejemplo todos en metros.

Yo no las uso, en blender he quitado cualquier medida, y marca "unidades" para todos los modelos.


Pobre PSP

Imagen de fran98

Muchas gracias por responder.

Muchas gracias por responder. En cuanto pueda, lo aplico.

Saludos.

PD: Perdón por tardar en responder, he estado un poco liado con otras cosas.

 

EDITO: Sigue sin salirme las colisiones. Hice lo que me dijiste, pero nada. Pongo los objetos de nuevo. Aquí hay una imagen:

PD: He reposteado el codigo.


Imagen de Mills

No se mucho aún jeje, pero

No se mucho aún jeje, pero las cosas 3d se me dan bien, tienes que ponerlo así:

if  obj1.pos.x + obj1.w/2 > obj2.pos.x- obj2.w/2 and obj1.pos.x-obj1.w/2 < obj2.pos.x + obj2.w /2 ...

Y para la y y la z igual, y eso solamente vale si los objetos son esferas o cubos-rectángulos...

Creo que así funcionará aunque no sé si habrá que poner algún paréntesis para meter las sumas y las restas... Como lo tenias no va a funcionar porque a todos les ponias el + y eso no vale si el objeto se mueve al contrario.

Además le tienes que sumar o restar la medida del objeto dividida entre 2, porque la posición está en el centro, y si no lo centras, pues te haces un lío, porque entonces solamente le tendrías que sumar la longitud del objeto en una de las direcciones, y no en la otra... y .. eso  jeje.


Pobre PSP

Imagen de fran98

¡¡¡Eh, ha colisionado!!! Lo

¡¡¡Eh, ha colisionado!!!

Lo que me pasaba es que tenía los dos objetos a distinta distancia. Es como si el cuadrado estuviera delante de la bola.

Ahora lo que me queda es poner un poco más pequeño el cuadrado, y poner la misma profundidad a los dos.

Saludos y muchas gracias, de veras.

 

PD: ¿Cómo se hace para que, cuando colisione, desaparezca la bola, y se muestre en otro punto?


Pues haces que cuando

Pues haces que cuando colisionen cambien las coordenadas del objeto:

if colision(bola, canasto) then
	bola.pos.x = 
	bola.pos.y = 
	bola.pos.z = 
	puntos = puntos+1
end

Imagen de fran98

Muchas gracias, lo tendré en

Muchas gracias, lo tendré en cuenta.

Saludos.

Supongo que quieres algo

Supongo que quieres algo así:

bola    = { obj = model.load("modelos/bola.obj"),    pos={x=0,y=0,z=0},     rot={x=0,y=0,z=0}, w = 5, h = 5, p = 5}
canasto = { obj = model.load("modelos/canasto.obj"), pos={x=200,y=200,z=2}, rot={x=0,y=0,z=0}, w = 5, h = 5, p = 5}
--Acuérdate de poner bien las dimensiones ( w, h, p)
 
function colision(obj1, obj2) 
	if  obj1.pos.x + obj1.w > obj2.pos.x and obj1.pos.x < obj2.pos.x + obj2.w 
	and obj1.pos.y + obj1.h > obj2.pos.y and obj1.pos.y < obj2.pos.y + obj2.h
	and obj1.pos.z + obj1.p > obj2.pos.z and obj1.pos.z < obj2.pos.z + obj2.p then 
		return true 
	end
	return false 
end
 
 
while true do
	controls.read()
	if controls.left() then
		bola.pos.x = bola.pos.x-1
	end
	if controls.right() then
		bola.pos.x = bola.pos.x+1
	end
	--if controls.start() then
		--screen.clear(220,220,220)
	--end
	--canasto:rotation(math.rad(canasto.rot.x), math.rad(canasto.rot.y), math.rad(canasto.rot.z))
	if colision(bola, canasto) then
		--Aqui la colision
	end
	--Mover bola y canasto
		bola.obj:position(bola.pos.x, bola.pos.y, bola.pos.z)
		canasto.obj:position(canasto.pos.x, canasto.pos.y, canasto.pos.z)
	--Blitearlos
		bola.obj:blit()
		canasto.obj:blit()
	screen.flip()
end

Mírate el código, compara con el tuyo lo que haces mal y intenta aprender algo.

Imagen de fran98

Muchas gracias, de verdad,

Muchas gracias, de verdad, mañana lo comparo y comento (ahora estoy un poco liado con otra cosa)

Saludos.

EDITO: ¿Cómo puedo saber las dimensiones w,h,p en sketchup?


Sketchup tiene una cinta

Sketchup tiene una cinta métrica :P

Imagen de fran98

Vaya, es verdad, no había

Vaya, es verdad, no había caido!! XD

Y para medir esferas, también la cinta métrica?

 

PD: No me salen las colisiones, he reposteado el code, no sé que hecho mal. Tampoco me da error.

Saludos.


A lo mejor son por las

A lo mejor son por las medidas del sketchup, yo lo hago en metros y funciona perfectamente.

Imagen de fran98

Yo también lo tengo puesto en

Yo también lo tengo puesto en metros.

Mañana intentaré subir los modelos.

Saludos, y buenas noches a todos.

 

EDITO: Enlace de los archivos puesto. Está en un zip.


Para tu segunda duda... pues

Para tu segunda duda... pues lo bliteas tantas veces como necesites (aplicando en cada caso la rotación y/o cambio de posición que gustes).

Imagen de fran98

Ya pero yo decía si había

Ya pero yo decía si había alguna manera de blitearlo sin tener que escribir en cada posición.

¿Eso se puede hacer con el bucle for?

Saludos.


Claro, alguna manera habrá de

Claro, alguna manera habrá de adaptarlo ;)

Imagen de Dioni0396

si

si

Imagen de fran98

A ok muchas gracias a los

A ok muchas gracias a los dos.

Saludos.

Imagen de Dioni0396

normal....

Hijo... Estudiate las colisiones normales.... y las funciones

Errores:

  • Estas metiendo variables inexintentes en una funcion
  • No es necesario poner canasta ni bola. Las funciones estan para ayudarte no para complicarte
  • Abajo usas mas de 2 argumentos de los que pones arriba...
Imagen de fran98

OK me las estudiaré un poco

OK me las estudiaré un poco más a fondo.

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.