Karoshi MSX Community
06 de Julio de 2021, 12:52:13 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: DETECCIÓN DE COLISIONES EN BASIC.  (Leído 7557 veces)
0 Usuarios y 1 Visitante están viendo este tema.
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« : 17 de Abril de 2008, 04:24:33 pm »

Aqui sigo con mi minijuego en Basic y creo que parte de la información que se ha perdido en el foro, respondia a varias preguntas mias (no voy a hacer que me vuelvas a explicar la tabla de atributos de sprites, tranki viejo Grin) Pero si que me gustaria que alguien me ayudase a comprender el como hacer lo siguiente:

Estamos en screen 1, el personaje que movemos esta formado por 2 sprites de 16*16 y cada enemigo también. La historia es que nuestro personaje puede caer en  elementos del escenario(más sprites) con los que al contactar provoque por ejemplo que los puntos suban, pero también puede colisionar con los enemigos, asi que me gustaria saber como puedo hacer una buena rutina para esto, que diferencie cuando estamos en contacto con algo bueno y cuando con algo malo, No puedo usar on sprite, ya que al haber varios sprites solapados para formar los personajes queda descartado, habia pensado en hacerlo por coordenadas tipo: if px(x del personaje)=>ex(coordenada x del enemigo) and py... etc,etc... Pero no doy con ello...
que me recomendais??? es posible hacerlo mediante vpeek? o es solo para caracteres este metodo?

Gracias amigos!

Saludos!
En línea
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #1 : 17 de Abril de 2008, 09:22:15 pm »

Hola???
nadie puede ayudarme?
estoy estancadisimo!!! por favor! un alma caritativa! :god: :god: :god:
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #2 : 17 de Abril de 2008, 10:41:17 pm »

Ese mismo problema lo tienia yo al programar en ASM.

La solucion seria la siguiente (Te lo voy a poner en basic, creo que me acuerde de como se programa) Grin

Código:
IF (X+16>X1)AND(X<X1+16)AND(Y+16>Y1)AND(Y<Y1+16)THEN....

Se tienen que cumplir todas estas condiciones, donde X e Y son las coordenadas de tu personaje y las X1 e Y1 son las cordenadas de los enemigos. Si se cumplen todas estas condiciones, estonces despues del THEN tendras que poner lo que quieras hacer (Mandarle a otra linea de programa etc...)

Por supuesto las coordenadas las puedes ajustar como a ti te convenga (me refiero al +16, esto puede ser menos, segun a ti te venga mejor para tu personaje o enemigos)

Espero que te haya servido de ayuda. Wink
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #3 : 18 de Abril de 2008, 09:02:10 am »

Muchisimas gracias Oki, de verdad!!
voy a probar durante la mañana y te cuento.  Wink
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #4 : 18 de Abril de 2008, 09:59:20 am »

Efectivamente no hay otra que la de comparar coordenadas. Gráficamente se ve más claro:

 

El problema es que en BASIC este tipo de comprobaciones son muy lentas, no vas a poder hacer muchas. Lo más práctico es idear algún truco para reducir el número de operaciones: que los enemigos se muevan sólo por unas zonas (areas de pantalla, coordenadas múltiplos de algo, etc.), tratar de no comparar con todos los enemigos cada vez, hacer las comprobaciones sólo cada x iteraciones; en fin, todo lo que sea con tal de reducir el cálculo.

También puedes usar carácteres en lugar de sprites ;-), en ese caso si que te valdrían los VPEEK...
En línea

Doom dee doom dee doom
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #5 : 18 de Abril de 2008, 10:14:18 am »

Gracias JL!
con el gráfico me queda bastante más claro.

Una pena lo que dices de que irá lento, aunque solo tengo que hacer esta comparación realmente con dos de los enemigos en pantalla, el resto "objetos estacionarios" al ser estaticos puedo crearlos mediante caracteres.
Pero estoy pensando si podrias explicarme por favor el procedimiento a seguir, para detectarlos mediante vpeek, porque no lo tengo nada claro...

Gracias!
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #6 : 19 de Abril de 2008, 11:28:47 am »

Bueno te lo voy a intentar explicar. (Si me equivoco en algo ya me corregira alguien)

Lo primero que tienes que saber es que los datos de la pantalla que quieres detectar estan almacenados en la VRAM a partir de la direccion 6144 y acaba en la direccion 6911 (esto correcponde a 768 tiles de 8 x 8, almacenados de izquierda a derecha y de arriba a abajo)
Asi el primer tile seria para la direccion 6144, el segundo para la 6145... asi hasta el ultimo del la primera fila que seria el tile 32 que corresponderia a la direccion 6175, despues pasariamos a la segunda fila de tiles pero en la primera colunna de la izquierda que corresponderia la direccion 6176 y asi sucecivamente. (Vamos que la pantalla esta dividida en filas (24) y colunnas (32) y todo ello almacenado en la VRAM)

No se si lo estare liando yo solo, pero sigamos.

Lo que tenemos que hacer es conocer sobre que tiles esta situado nuestro Sprite, para ello haremos lo siguiente:

Código:
A=INT(X/8):B=INT(Y/8)
 

Esto lo hacemos para calcular un numero la posicion X e Y del Sprite, pero lo dividimos entre 8 porque la pantalla esta formada por tiles de 8 x 8, con esto tendriamos lo equivalente al LOCATE A,B del basic pero justo con la posicion de nuestro Sprite.

Ahora que hacemos?, pues tenemos que calcular el numero de tiles que tenemos que sumar a la direccion de incio de la VRAM para saber exactamente que tile o caracter esta situado en la pantalla bajo nuestro Sprite.

Código:
C=(B*32)+A

Con esta formula lo conseguimos y ahora solo tendriamos que leer el dato de la VRAM para posteriormente compararle con el tile que tu quieres detectar.

Código:
D=VPEEK(6144+C)

Despues con hacer una simple comparacion del estilo IF D="AQUI EL CARACTER A COMPARAR" THEN....

Bueno no se si te habra sido de ayuda o te habre liado mas, si tienes alguna duda pregunta otra vez. Cheesy

Hasta luego.
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #7 : 19 de Abril de 2008, 12:25:31 pm »

gRACIAS okI. lO ENTIENDO TODO, CREO QUE BIEN, EL PROBLEMA ES QUE LO APLICO Y NO ME FUNCIONA...
SERA POR USAR SPRITES DE 16*16?
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #8 : 19 de Abril de 2008, 05:16:13 pm »

Pues tendria que funcionar.

Vamos a ver si afinamos un poco mas, tu sprite esta compuesto como has dicho por dos sprites de 16*16 puestos uno encima de otro (supongo que para tener dos colores en el personaje y los enemigos)

Con los calculos que hemos hecho antes, en "D" tendriamos que tener si no me he equivocado el codigo del tile que esta situado en la pantalla en las coordenadas del sprite. Estas son, recuerda x,y que corresponde a la parte superior izquierda del sprite, si quisieramos detectar la parte inferior del sprite, la formula de B tendriamos que cambiarla por:

Código:
B=INT((Y+16)/8)

Yo creo que esto tendria que funcionar, en caso de que siga sin funcionar me lo comentas, te podria enviar un ejemplo de un viejo juego mio.

Adios.
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #9 : 19 de Abril de 2008, 07:58:57 pm »

Te cuento:
he conseguido que el primer ejemplo funcione, es para como tú has dicho para la coordenada x e y del sprite, digamos "la cabeza" del keko

Pero el segundo ejmplo no funciona, quiero decir cuando cambio la B como tú has dicho, no sucede nada...
Estoy haciendo pruebas pero no lo consigo, puede que haya algun calculo mal en la formula o algo así?

Gracias Oki, ya sé que soy un poco brasa, pero muchas gracias por tu ayuda!
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #10 : 19 de Abril de 2008, 11:11:19 pm »

No se porque me da a mi que tu personajeesta constituido por dos sprites pero no situados uno esncima del otro, no?

Corrigeme si me equivoco pero creo por lo que comentas tienes un sprite en x,y y el otro en x,y+16. (Si no es asi dimelo)

En caso de que esto sea como yo he dicho, para detectar algo en las piernas del keko como tu lo lllamas, la la formula tendriamos que sumarle 32 y no 16 como estabamos haciendo (piensa que tenemos 2 sprites de 16 x 16 uno encima del otro)

Prueba haber si asi funciona.

Adios
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #11 : 22 de Abril de 2008, 03:31:42 pm »

Gracias Oki!
Lo tengo. No se porque no funcionaba, pero ahora si (el orden de linea imagino...) Cry
Ahora el problema es que hay que detectar colisión, no solo en la cabeza y a los pies, sino también en los laterales, esto son 4 comprobaciones o 6 en total, y se ralentiza muchisimo.

despues de darle varias vueltas he pensado que quizas haya una manera de hacer unicamente una comprobación por cada bucle del juego, con alguna formula que utilize y compruebe las 4 o 6 coordenadas...

¿es esto posible o me lo estoy inventando?

Espero ansioso la respuesta.
un saludo!

En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #12 : 22 de Abril de 2008, 09:38:06 pm »

Vamos a ver, esto requiere un poco de tactica.

Al menos yo hacia lo siguiente:

Cuando pulso derecha, yo solo hacia comprobaciones de la derecha y abajo, con lo que solo hay dos comprobaciones y no 6 como tu dices. Igualmente si voy a la izquierda compruebo colisiones por la izquierda y abajo. Si hay salto y voy hacia arriba hago las comprobaciones de arriba y la direccion a la que voy (bien izquierda o bien derecha), y en la caida hago las pertinentes comprobaciones de abajo y la direccion.

Con esto lo que haces es como mucho dos comprobaciones, cada comprobacion la haces en las subrutinas correspondientes de cada direccion, no en el bucle principal del juego. Grin

Ten en cuenta que para la deteccion de la derecha la formula hay que modificarla a lo siguiente:

Código:
A=int(X+16/8)

Y para la izquierda se queda como estaba.

Espero que te haya servido de ayuda.

Adios
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #13 : 22 de Abril de 2008, 10:02:09 pm »

Bueno, OKI ya te ha puesto sobre el buen camino, el truco está en descuernarse buscando formas de reducir el número de operaciones (esto creo que ya lo comenté en un mensaje anterior... Roll Eyes).
Aquí va otro posible truco para que pienses si lo puedes aplicar: Los VPEEK se hacen a nivel de caracter (8 píxeles cada uno) y tú supongo que estás desplazando sprites a una velocidad de ¿1?, ¿2? ¿quizá 4? píxeles por iteración. Pongamos por caso que lo haces cada píxel, si es así de cada 8 píxleles, sólo 1 es necesario para obtener el valor, los otros 7 directamente sobran. De igual manera si los mueves cada 2 píxeles, sólo necesitarías hacer la comprobación cada 4 iteraciones y así sucesivamente.
Espero que esto también te haya servido de ayuda Smiley

En línea

Doom dee doom dee doom
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #14 : 24 de Abril de 2008, 12:51:21 pm »

Pues si, me es de ayuda, como siempre Wink
voy a probar cosas y os cuento vale?
muchisimas gracias!!
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!