[General] Mapas de Durezas

Hasta hoy solamente he programado en DirectX y PC y nunca había necesitado usar mapas de durezas ya que para los estilos de juego que he programado me ha valido con detección de colisiones entre figuras geométricas.

Pero ahora me he puesto con la GP2X y la SDL y he empezado a programar algo parecido a los primeros Metal Gear y para el terreno no quiero usar tiles. He pensado que la mejor solución quizas sean los mapas de durezas con diferentes colores para el tipo de terreno y evitar tener una complicada colección de figuras geométricas para cada tipo de terreno diferente.

Lo que debería de comprobar en el mapa de durezas es lo siguiente:

-Estilo de terreno para modificar la velocidad, el ruido o la cobertura: fácil, solo mirar el pixel del mapa de durezas sobre el que está el protagonista.

-Terreno que corta la visión: Para determinar si algún enemigo me ve lo primero que hago es ver la distancia a la que me encuentro de el, después y dependiendo de la dirección a la que está mirando el enemigo compruebo que me encuentro dentro del las dos líneas que determinan la zona que ve (muy al estilo commandos) y por último trazo una línea entre el personaje y el enemigo (y por consiguiente determinada mediante estos 2 puntos) y compruebo en el mapa de durezas si toca alguna zona que imposibilite la visión (por ejemplo el rojo). Este es mi primer problema, que no se como comprobar que una línea determinada por dos puntos corte o nó una zona de un determinado color.

-Terreno impracticable: Aquí está mi segundo problema. En cada frame el personaje y su movimiento está determinado por un punto (el personaje) y un vector (movimiento del personaje en este frame). El problema está en detectar si ese movimiento entra o nó en una zona no transitable. Esto parece facil pero también tengo que determinar cual es el punto exacto en el que el vector entra en la zona para dejar al personaje ahí, no solo comprabar si entra o nó.


Resumiendo para los que se han perdido con tan mala explicación y para los que se la sopla como será mi juego lo que necesito es:

1-Comprobar la colisión de una línea (Punto-Punto) con un derminado color del mapa de durezas.
2-Determinar la colisión y punto de intersección entre una línea (Punto-Vector) y un determinado color del mapa de durezas.


Quizas sea una pregunta algo rebuscada pero es la única traba que tengo sobre el cuaderno a la hora de diseñar el juego.
Para empezar me parece un proyecto muy interesante.

Ahora intentaré ayudarte:

Básicamente lo que necesitas es una función que te calcule los puntos de la línea.Para ello puedes utlizar un algoritmo de dibujo de líneas o hacerte tu mismo uno.Una vez tengas todos esos puntos pues los compruebas uno a uno.

Para el segundo caso, es lo mismo , pero el segundo punto sería donde se movería si no hubiese ningún obstáculo, entonces una vez tienes los puntos , los recorres en orden desde la posición actual a la deseada(haz la función que calcula los puntos de la recta de manera que te los de así), y en el primer punto que encuentres impracticable paras. El anterior punto era el último practicable.

Espero que me entiendas, sino hazlo saber y haber si te ayudo un poco mas.
Gracias por contestar parrincrisis, mas o menos había pensado en hacer algo así aunque como nunca antes he usado mapas de durezas (excepto en el viejo Div que te lo hacía practicamente el solo [tomaaa] ) había pensado que mejor preguntar, haber si voy a estar haciendo alguna burrada. Cuando lo solucione posteare la "vivencia".

En cuanto al juego, para quien le interese, lo estoy programando sobre un motor 2D propio (que programe mientras aprendia a usar DirectX) que he adaptado a SDL y a la GP2X. Soporta textos (insertando la fuente en una imagen), elementos animados (calculando las animaciones en tiempo de ejecución) y entrada de datos. Falta por añadir sonido y deformaciones, rotaciones e inversiones de sprites, aunque esto último en SDL no se como hacerlo ya que en DirectX lo hacía con matrices 3D directamente y eso en SDL no hay...

Adjunto las animaciones de "parado" del protagonista (con curioso parecido a Snake), una por cada arma, aunque casi seguro que para el juego final separo las piernas del cuerpo para ahorrar memoria tanto en disco como ram.

PD: Atención al movimiento de la bandana ¡Sangre sudé para que se moviera así!
:p
El sprite está muy currado.

La verdad, la solución que te di es la primera que se me ha ocurrido.
Yo también he trabajado con SDL y la verdad para rotar los sprites hay una funcion llamada rotozoomer o algo parecido pero para usarla en tiempo real es demasido costosa, al final terminé rotando con el gimp y haciendolo a mano.
3 respuestas