Algún Tip para Evitar que el Gráfico del Character Traspase el Mapa de Durezas?

Started by Tayura_TT, December 17, 2017, 08:32:00 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Tayura_TT

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...



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 ...



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
Trabajos Actuales: "Proyecto Chizuru" y "Hoppy Bat"

Futu-block

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

FreeYourMind

puedes usar puntos de control y meter 4 por ejemplo en las esquinas del cuadrado total del personaje

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

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 :)

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)