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).
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
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.
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
¡¡¡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:
Muchas gracias, lo tendré en
Muchas gracias, lo tendré en cuenta.
Saludos.
Supongo que quieres algo
Supongo que quieres algo así:
Mírate el código, compara con el tuyo lo que haces mal y intenta aprender algo.
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
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.
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).
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 ;)
si
si
A ok muchas gracias a los
A ok muchas gracias a los dos.
Saludos.
normal....
Hijo... Estudiate las colisiones normales.... y las funciones
Errores:
OK me las estudiaré un poco
OK me las estudiaré un poco más a fondo.
Saludos.