Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Tayura_TT on December 17, 2017, 08:32:00 PM

Title: Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?
Post by: Tayura_TT on December 17, 2017, 08:32:00 PM
Saludos nuevamente a la comunidad del Foro de BennuGD, esta vez vengo a pedir un tip/consejo para evitar que el gráfico del personaje traspase el mapa de durezas y que este siempre quede al margen...

(http://sk.uploads.im/t/qwYou.png) (http://uploads.im/qwYou.png)

Nose si existe una función o truco para que en bennu se capture el gráfico entero del personaje y que se detecte cuando este hace contacto con alguna zona definida dentro del mapa de durezas (Algo asi como Map_get_pixel pero que en ves de 1 pixel, sea todo el gráfico)

Hasta los momentos el metodo que uso para detectar cuando existe contacto con una zona definida en el mapa de durezas es con la funcion "Map_Get_Pixel" sin embargo esta me da el resultado presente en la imagen...

Acá dejare un capture del código del juego que estoy creando, donde identifico las partes donde posiblemente este mi error ...

(http://sk.uploads.im/t/2wJmI.png) (http://uploads.im/2wJmI.png)

Y por si no me eh explicado bien que busco, acá un vídeo realizado por mi mostrando mejor el problema...

https://www.youtube.com/watch?v=k0hHmMaHWKY
Title: Re:Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?
Post by: Futu-block on December 17, 2017, 09:23:59 PM
el problema es que usas solo una comprobación de durezas, y seguro que es en el centro del personaje.
debes de hacer mas comprobaciones, una a la mitad del alto del personaje para la parte baja, y otra igual para la alta
igualmente para los laterales, cuantas mas comprobaciones mas fidelidad al mapa de durezas

y en cuanto al mapa de durezas procura no usar secciones delgadas, cuanto mas anchas mas fidelidad
Title: Re:Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?
Post by: FreeYourMind on December 18, 2017, 09:07:06 AM
puedes usar puntos de control y meter 4 por ejemplo en las esquinas del cuadrado total del personaje
Title: Re:Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?
Post by: SplinterGU on December 18, 2017, 12:29:21 PM
entre las cosas que dice Futu-block es que tienes el centro del personaje en el medio del grafico, deberia ir en los pies... el centro es el punto de control 0.
Title: Re:Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?
Post by: panreyes on December 18, 2017, 11:49:01 PM
Tal como han dicho los demás, las colisiones no debes hacerlas con el centro del gráfico, sino dependiendo de qué lado estés comprobando, debes comprobar los píxeles de los alrededores.

Un ejemplo básico:

// Aquí compruebo la colisión por la derecha, y me muevo sólo si no estoy tocando nada por la derecha:
if(key(_right) and map_get_pixel(file,graph,x+10,y)!=suelo)
x+=10;
end

// Aquí compruebo la colisión por la izquierda, y me muevo sólo si no estoy tocando nada por la izquierda:
if(key(_left) and map_get_pixel(file,graph,x-10,y)!=suelo)
x-=10;
end

// Aquí compruebo si toco el suelo, y salto solo si lo estoy tocando:
if(key(_space) and map_get_pixel(file,graph,x,y+10)==suelo)
saltando=1;
end


Eso es el principio. Luego vienen los problemas de verdad... la precisión y las correcciones.

Para conseguir plena precisión no basta con comprobar las colisiones en el momento de moverse, sobre todo si trabajas con inercia o "fuerzas externas" que muevan a tu personaje. En ese caso, lo que se hace es comprobar pixel a pixel la colisión. Por ejemplo:

if(key(_right))
x_incremento=10;
end
x_destino=x+x_incremento;
from x=x to x_destino; //válido solo para la derecha, no para la izquierda por la falta de step -1
if(map_get_pixel(file,graph,x+10,y)==suelo)
  break;
end
end


Este código comprueba todos los píxeles desde la posición actual hasta la posición de destino, y se para en la posición que justo toca contra la pared. Es la forma ideal, pero conlleva bastante gasto de CPU.

Otra opción es utilizar bloques gordos en vez de líneas de colisión y hacer comprobaciones de corrección: si nuestro personaje se ha metido dentro de una pared, moverlo hasta el punto en el que deje de estar dentro de ella.

Es bastante complejo, pero bueno, ve empezando por lo que comenté en el primer código :)
Title: Re:Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?
Post by: Drumpi on December 20, 2017, 12:14:19 AM
Una mejora a lo que dice Panreyes es usar mapas de durezas reducidos de tamaño. Por ejemplo, si tienes un mapa de durezas la mitad de grande, cada pixel representa dos pixels en horizontal y dos en vertical del mapa que usas para que lo vea el jugador. Pierdes precisión pero ganas rendimiento, a menos que tus durezas sean cuadradas.
Esto lo puedes hacer con mapas 3 veces más pequeños, 4, 5, ya depende de cuánto creas que es suficiente.

También puedes usar durezas que representen bloques. Por ejemplo, supón que tienes un mapa de durezas 4 veces más pequeño que tu mapa. Si colocas un pixel rojo significa que ese bloque de 4x4 no se puede pasar, si es verde significa que hay una rampa que se puede subir si se camina a la derecha, usando una simple fórmula matemática para calcular la altura. Es una técnica similar a los, al parecer, ya obsoletos mapas de tiles.

También te recomiendo que si vas a hacer un juego de plataformas, que pongas el "centro" del personaje a los pies del prota, como dicen por ahí arriba. A la larga facilita los cálculos con el entorno. Y si no quieres mover el centro, coloca un punto de control ahí y usa GET_REAL_POINT para obtener la posición de ese punto.

Y por último, si tienes acceso al manual avanzado de DIV2 o al tutorial del Castle of Dr. Malvado (juego de demostración del viejo DIV), convendría que le echases un vistazo.