Ayuda con mapeo de imagen

Iniciado por hackkpo1, 24 Julio 2013, 17:44 PM

0 Miembros y 1 Visitante están viendo este tema.

hackkpo1

Solicito ayuda con un proyecto para la universidad. Resulta que estoy programando un juego llamdo knightmare y tengo un problema, nose como determinar que zonas son "caminables" por el personaje y cuales no, si vieron el video, hay unas columnas a los dos costados y un rio aparece cada tanto (donde solo puede caminar sobre el puente).

Ya lo tengo bastante avanzado, tengo el "jpg" del nivel 1 y 2, y lo que hago es mostrar en la ventana el final del mismo, para luego ir restandole pixeles al eje Y (y asi dar la sensacion de que el fondo se va moviendo para abajo constantemente). Tuve un par de ideas de como programar las zonas no caminables, pero siempre llego a un punto en que es imposible que funcione por tal o cual causa.

En fin, espero haberme explicado bien, cualquier idea me viene bien xq ya me tiene cansado pensar formas y "chocar contra la pared" :P. Saludos, despues tengo otra consulta mas para hacer, pero quiero resolver esto primero.

eleon

#1
Buenas tardes:

Normalmente cuando se pregunta una duda posteas lo que llevas hecho, o al menos la especificación aunque no muestres los detalles de implementación para que nos hagamos una idia. Por cómo lo has descrito voy a suponer que te refieres a este juego: https://www.youtube.com/watch?v=2btqbTFtwSo

Debes dividir el mapa en un array bidimensional donde en cada posición hay un objeto de la clase "Terreno":

Terreno: ¡No es el suelo de todo el mapa! sino que es un fragmento del mapa y va a tener las siguientes variables:

int x;
int y;
boolean caminable;
Image imagen; (Este tipo no es real, aqui depende del que tú uses para cargar la imagen).

Cuando crees un objeto de tipo "Terreno", sus valores "x" e "y" definirán en qué posición del mapa se encuentra y la variable "caminable" nos dirá si el personaje puede pisarla o no. Por tanto tu mapa se dividirá en un montón de objetos "Terreno" de la siguiente manera:

T = Objeto de tipo Terreno

T T T T T T T
T T T T T T T
T T T T T T T
T T T T T T T
T T T T T T T
T T T T T T T
T T T T T T T
T T T T T T T
...
(Será tan largo como objetos terreno añadas).

Cuando tu personaje se vaya a mover, hará la siguiente comprobación:

Código (java) [Seleccionar]
if (terrenoActual.adyacente(direccion).caminable == true) //Movemos el personaje si se cumple la condición, sino no hará nada

terrenoActual es una variable que debes añadir al PERSONAJE que apunta al terreno en el que se encuentra posicionado en este momento, cada vez que muevas el personaje cambias su valor a la nueva posición.

terrenoActual.adyacente(direccion) es un método que devuelve el terreno adyacente en la dirección que le pases (debes implementarlo).

terrenoActual.adyacente(direccion).caminable -> Ahora que tenemos el terreno adyacente, por ejemplo, el personaje se quiere mover hacia arriba, y por tanto el terreno que hemos obtenido con terrenoActual.adyacente(direccion) es justo la posición de arriba, comprobamos si la variable caminable es igual a true (es decir se puede caminar sobre él), sino no hará nada el personaje y se quedará en la misma posición.

Si no has comprendido alguna cosa comenta. Ten en cuenta que esto es la base de los videojuegos en dos dimensiones, el 90% de los juegos 2D utilizan este sistema de colisión de mapas con objetos no movibles.

Un saludo.

hackkpo1

Primero perdon que no deje link al video del juego al cual le estoy haciendo la "remake", crei haberlo hecho, pero esta mas que claro que no jaja. El juego es ese justamente pero solo que no "uso" el de PC sino de la mitica MSX

[youtube=640,360]http://www.youtube.com/watch?v=CFglKPvQmN4[/youtube]

Voy a intentar desarrollar lo que propones, cualquier cuestion, consulto nuevamente. Pero hay algo que no me cerro, un "terreno" de los q decis vos, seria solo un pixel?? es decir solo una coordenada "x,y" ?

PD: Aca te dejo el codigo q tengo desarrollado y la carpeta res donde estan las imagenes utilizadas.

http://goo.gl/56FbRr

Muchas gracias!

eleon

#3
Cada bloque "Terreno" sería algo así:



Los atributos (x, y) nos dicen dónde hay que colocarlo. Por ejemplo: (x =2,  y = 3) hay que colocar este bloque en la columna número 2 fila número 3:

T X T T T
T T T T T
T T T T T

Siempre comenzando a contar desde abajo que es el inicio del mapa y por tanto del plano de coordenadas.

La diferencia entre un bloque y otro según los atributos que te he indicado yo (tendrás que añadir otros dependiendo de cómo funcione tu juego) son:

Código (java) [Seleccionar]
int x; //Le dice al mapa en qué columna colocar este bloque
int y; //Le dice al mapa en qué fila colocar este bloque
boolean caminable; //Le dice al jugador si puede colocarse encima de este bloque o no
Image imagen; //La imagen del bloque que será: Suelo, Rio, Puente, etc.


Los objetos que hay encima del terreno (la columna, la llama, etc) hay dos formas de trabajarlos:

1- Colocarlos del mismo modo que resto del terreno (solo tendrás que asignar en la variable "Image imagen" la imagen de la columna) pero esto tiene un problema:

Las imagenes todas tienen que tener el mismo tamaño. ¿Qué pasa si quiero hacer un objeto más ancho o alto que otro?. Ejemplo: La columna es el doble de alta que un bloque de suelo o rio -> tendrás que dividir la columna en 2 imágenes: parte superior y parte inferior y se quedaría así:

T T T C T
T T T C T

Al colocar la mitad superior encima de la mitad inferior crearás una columna completa. Pero todas las imágenes tienen que tener el mismo tamaño o el mapa aparece con "blancos" aunque esto seguramente ya lo tendrías estudiado.

2- Otra forma de hacerlo es crear primero el terreno únicamente con: Suelo, Rio y Puente y a partir de ahi colocar encima los objetos (si imprimes el suelo en una posición y luego imprimes la columna en la misma posición se ve la segunda imagen encima de la primera, por tanto no habría ninguna complicación en este aspecto). Aqui no haría falta que todas las imágenes tuvieran el mismo tamaño pero crea otro problema: Si has imprimido el suelo que es "caminable" y encima imprimes la columna que no es "caminable" cuando el personaje intente pasar por encima tendrás tratar el código de manera que se tenga en cuenta que no se puede pasar por esa posición porque hay una columna que no se puede atravesar aunque el suelo si sea atravesable.

Cualquier duda comenta.