Ver la versión completa : Mapa tileado (¿durezas o colisión?
zikitrake
06/08/2006, 07:44
Buenas (muy) noches...
Estoy intentando adaptar el Madmix game (tipo PacMan) a la negra y como son los primeros pasos que doy en Fenix se me plantea una duda....
Teniendo en cuenta que los mapas de cada fase pueden ser de unos 1200x 1200 pixels, creado a partir de 'tiles' de 32x32,del estilo:
2,2,2,2,2,2,
2,3,4,3,4,3,
2,4,2,2,2,4,
2,8,2,2,2,3,
2,4,3,4,3,4;
¿cual sería el método más eficiente (en cuanto a velocidad)?:
a) Crear un mapa de durezas y detectar cuando colisiona Mr. Pacman con un color en concreto asignado por las paredes... o
b) Que Mr. Pacman detecte cada bloque de 32x32 que represente una pared.
c) .... tu solución va aquí
Gracias mil!
Segata Sanshiro
06/08/2006, 07:53
Bueno, si las paredes van a coincidir con los bloques, que es lo más probable, lo mejor sería tener un array/tabla (en Fenix se llaman tablas) para los tiles y otra tabla para durezas.
Por ejemplo:
//Tabla tiles
byte mapa[3,3]=4,5,6,5,
4,5,5,4,
4,6,5,4,
4,4,4,4;
//Tabla durezas
byte durezas[3,3]=1,1,1,1,
1,0,0,1,
1,1,0,1,
1,1,0,1;
He usado tablas de dos dimensiones pero pueden ser de una perfectamente. Para comprobar si hay una pared... pues depende.
Por ejemplo, si tu pacman va a la derecha, solo tienes que comprobar lo que hay en durezas[pacman_x+1,pacman_y].
Hacerlo con tablas de una sola dimensión podría ser más rápido, y no es tan difícil.
Si tienes alguna duda más pregunta ;)
Depende del tipo de durezas que uses:
Si las durezas coinciden con los graficos puede que no necesites dos tabalas.
En caso de necesitar dos tablas depende de lo complejos que sean las durezas. La solucion de casillas "pisables" o no, es la mas sencilla y recomendada para durezas sencillas.
El uso de collision en estos casos esta reservado para uso exclusivo de muy muy novatos y siendo cada tile un proceso, habiendo solo los procesos visibles, pues es algo muy costoso en recursos. Jamas de los jamases uses un mapa enoooorme con collision (ni se recomiendan los mapas grandes)
Tambien se puede usar un metodo hibrido, en el que por un lado tienes la tabla que seria el mapa de durezas, y luego compruebas a nivel de pixel sobre el grafico de la dureza las zonas pisables o no. Es un mapa de durezas, comprobando los colores directamente sobre los tiles de durezas, y no en un mapa.
Espero que este suficientemente claro y que te ayude.
zikitrake
06/08/2006, 19:45
Gracias a ambos dos, pero la tabla de los mapas son del estilo INT INT MAPA[]=
111111,
104021,
111111;
Esto es lo que tengo por ahora... personales.ya.com/zikitrake/varios/madmixfenix.zip
Lleva un scroll 'infinito' vertical y horizontal
(A ver si me imprimo el lunes el manual de Osk:confused:)
---------
Por otro lado, una tabla tipo INT TABLA[3][4], se puede volver a definir con otras dimensiones?... digamos TABLA[9][15].
Gracias gente, por aguantar preguntas de este tipo
No, las tablas no se pueden redimensionar.
Un truco es usar punteros que, aunque te deje trabajar con un array unidimensional, es facil adaptar las 2 dimensiones a una (dato=(nºfila*ancho de filas)+columna)
Para los que no saben:
-Declaracion, crear un puntero "nombre" para guardar datos tamaño int: int pointer nombre;
-Inicializacion, se recomienda usar el comando sizeof para determinar el nº de bytes que tiene cada tipo (word, int...): nombre=alloc(nº bytes);
-Reinicializacion: nombre=realloc(nombre,nº bytes);
-Acceso: nombre[nº del dato];
-Liberacion: free(nombre);
Hala, bien masticadito ;)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.