Uno mas con mapas de durezas

Started by gecko, December 22, 2009, 08:05:53 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

gecko

bueno, vamos directo al problema...

Estoy intentando hacer un sistema de deteccion de durezas un poco mas complejo que el clasico de plataformas.

La idea es poder detectar suelos irregulares, y permitir el movimiento solo sobre determinana empinacion o inclinacion del terreno.

Un ejemplo seria un terreno asi:


La idea seria que el personaje lo recorra perfectamente en el centro,subiendo y bajando los desniveles,  pero sin poder llegar completamente hasta el borde.


Lo que por el momento estoy intentando implementar es por cada pixel de VELOCIDAD_X, compruebo que la altura sea menor a un valor determinado como la maxima altura que pueda escalar. Entonces ademas de un avance en X tambien se hacen pequeñas correcciones en Y basadas en esa altura.

Antes de seguir luchando con esto queria saber si conocen algun metodo efectivo para hacer esto.

Espero haberlo explicado bien...
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

quizas mas que con un mapa de durezas deberias trabajar con algun arreglo de alturas, en base a la posicion horizontal x... dicha tabla podria ser calculada a partir del mapa de durezas... no se, es una idea... que puede tener sus grises...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Es un problema complejo que no tiene una unica solucion... Te recomiendo que uses graphic_info ( ) para obtener la anchura y altura del grafico del personaje, y con ella calcular la altura del terreno al que te aproximas. Segun tu velocidad actual y la altura del terreno que tienes frente a ti puedes decidir si seguir adelante o bien interpretar que hay una "pared" y frenar.

Si empiezas a hacer algo palpable al respecto sube ejemplos please :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Hombre, la solución de splinter es muy eficaz si hablamos de suelos sin nada encima sobre lo que posarse, es decir, si no hay varios pisos.
Pero creo que la única solución a este problema es la de recorrer el borde superior del suelo y detectar cuando se sube más de la cuenta, ya que hablamos de terrenos irregulares. Si existiese algún patrón, se podría simplificar en base a estos, ejemplos como tiles, o funciones matemáticas sencillas (parábola, linea recta, sinusoide...).
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)

Futu-block

y entonces la inclinacion (angle) no tendria nada que ver??? porque se puede poner que al seguir el suelo que empiece a inclinarse se incline el personaje, y al llegar a una cierta inclinación se impide seguir avanzando...

digo yo...

Drumpi

Hombre, la técnica sencilla es que el personaje puede subir unos determinados números de pixels, lo que ayudaria a hacer pequeñas escaleras. Ten en cuenta que estamos trabajando con rampas de distinta inclinación a nivel infinitesimal: altura de 1 pixel equivale a 45º de inclinación, 2 pixels ya son 60º, 3 pixels ¿75º?...

Angle no tiene nada que ver con esto, eso es la parte gráfica, y por lo general conviene tenerla apartada de la parte del motor (por ejemplo, en un pong es mejor comprobar las posiciones de los objetos en lugar de usar collision para los rebotes).

Aunque ahora que lo dices, hace tiempo que pensé en ello, y uno de los métodos que se me ocurrió fue la de recorrer la superficie del suelo en ambas direcciones unos pocos pixels, así se puede determinar con mayor precisión la inclinación del terreno... pero puede generar cierto margen de error si el radio de curvatura del suelo cambia mucho, y puede dar problemas si nos encontramos con un barranco o una pared.
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)

SplinterGU

la inclinacion podria tener que ver si queres meterle fisica, y la altura a llegar dependeria de la velocidad, pero todo depende de que quieras hacer, si tu personaje puede trepar, si tiene cierta adherencia o no... etc...

con pocos datos es un poco dificil sugerir correctamente...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

la idea seria lograr imitar un movimiento como el que tenia Earth Worm Jim, que caminando se iba adptando a la supeficie sin problemas...

El salto lo tengo con una gravedad simple y funciona bien, por lo que esas diferencias del terreno las baja sin problemas. Los problemas empiezan cuando tiene que subir en esas rampas y desniveles.

Y por ahora el sistema que me parece adecuado seria el de ir comprobando en el avance, por cada pixel horizontal, la altura en vertical... y despues vere si complia mucho al rendimiento tener 3 bucles (uno para la gravedad y otros 2 para ese avance) en cada frame del personaje...

Muchas gracias por las respuestas muchachos!

cualquier avance les cuento!...
Torres Baldi Studio
http://torresbaldi.com

Windgate

Si solamente quieres eso puedes usar el modulo gravedad.prg de mi Just Fantasy, no se si lo has visto, pero se adapta a los suelos a la perfeccion... Incluso tiene en cuenta posibles cambios de tamaño en el grafico, incluso cambios en la variable size.

Busca Just Fantasy en el buscador y baja cualquier version.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Pues yo cuento dos bucles: el que va siguiendo la superficie del suelo pixel por pixel horizontal (mientras se pueda mover), y el que busca la altura en cada pixel (si se mueve hacia la derecha, comprueba el tile de la derecha; vacío, busca hacia abajo; lleno, busca hacia arriba), la gravedad bastaría con calcular la posición final y compararla con la altura obtenida con la función anterior.

Rendimiento: en PCs modernos no hay problema, en máquinas más ajustadas... bueno, con Fenix 092a, pintaba pixel por pixel una imagen de 320x240 en GP2X a 200MHz a 30 fps o menos, haz tus cuentas.
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)

gecko

ya pude conseguir una solucion que me convence bastante...

Lo que hice fue que para cada pixel horizontal que avanza cuente la cantidad de pixels suelo que hay en vertical para arriba, y si estos son menores a una cierta tolerancia recien ahi avanza.

Lo hice solamente con altura hacia arriba ya que del descenso se encarga la gravedad por separado, y en combinacion funcionan perfecto.

Ahora que lo veo es algo simple, pero me costo varios dolores de cabeza poder lograr el movimiento, asi que me gustaria compartirlo con todos a ver que dicen!

(PD: Espero que los comentarios en el codigo sean de ayuda, la intencion no era dejarlo tan sobrecargado)
Torres Baldi Studio
http://torresbaldi.com