Muy buenas, aqui estoy de nuevo con otra duda. Ahora ya es algo mas serio xD
He comenzado a desarrollar mi primer juego para DS seriamente. Se trata de un juego de guerra que mezcla accion y estrategia que ya programe en su momento para PC. Pues bien, el problema esta en la camara: la vista del juego es desde arriba, es decir, como un RPG, en 2D moviendo a tu personaje en las 4 direcciones, arriba, abajo, izquierda y derecha. Y los mapas donde se desarrolla la batalla son mas grandes que la pantalla, por ello necesito crear una camara que siga a mi personajito alla donde vaya.
Habia pensado que lo que podia hacer era un simple scroll del fondo, y asi daria la sensacion de que el personaje se mueve. Sin embargo, va a haber una buena cantidad de soldaditos deambulando por el mapa (tantos como pueda poner sin que de error ni se ralentice) que se moveran ellos solos siguiendo una IA, y si muevo el mapa, debo mover a todos los soldados junto con el mapa a la vez, lo que ademas de complicar la cosa un rato, consume bastante memoria puesto que necesitaria una o dos mas instrucciones for. Por no hablar de la dinamica de punto fijo, que no he usado nunca y aun no controlo muy bien xD
Por eso me preguntaba si hay otra forma de crear una camara en NFlib. Es que recuerdo que en XNA las camaras se generaban mediante un tipo matriz, pero es excluivo de esas librerias y no se muy bien en que se basaba para funcionar.
Cualquier idea es bienvenida. Muchisimas gracias por la ayuda!! ^^
e.e
Dos bucles
más FOR no te van a reventar la memoria, puedes estar tranquilo.
Lo que creo que deberías hacer es una variable que se modifique según muevas al personaje, y por otro lado una variable que recoja la posición de los soldados (que si los maneja la IA, a priori no sabemos qué harán).
Luego por un lado tienes que la posición del fondo depende de hacia dónde te muevas:
fondox=movimientox;
fondoy=movimientoy;
La posición de tu personaje en el mapa, que será la posición del fondo + la posición en pantalla. La posición de fondo no se considera a la hora de mostrar al personaje en pantalla, pero si a la hora de saber en qué posición del mapa se encuentra:
personajex=posicionx;
personajey=posiciony;
Y por otro lado tienes tanto la posición de los soldados en el mapa como su posición en la pantalla. Esto es lo más complicado (aunque no mucho más) del tinglado.
soldadox=posicion_soldado_mapax;
soldadoy=posicion_soldado_mapay;
Esas dos variables se modificarán según considere la IA. A priori no podemos conocer su valor. Luego, ¿cómo sé cuándo aparecerán por pantalla? La pantalla de la DS es de 256x192, por lo que la diferencia entre posicion_soldado_mapax y movimientox (ídem para el eje y), ha de ser menor a 256 y a 192, respectivamente.
Cuando tengas a los soldados en pantalla, la ecuación de movimiento cambia, pues has de tener en cuenta los movimientos de tu personaje (que realmente, recordemos, son los movimientos del fondo), para que se muevan acorde a ello.
Entonces, cuando los soldados estén en pantalla habrá otra ecuación (¡la anterior, que modifica su posición en mapa se sigue usando igual!:
soldadox=posicion_soldado_mapax-movimientox;
soldadox=posicion_soldado_mapay-movimientoy;
No he probado la idea pero creo que ha de funcionar como digo.
Salu2
EDITO: Huelga decir que cuando no tengas soldados en la pantalla borres sus sprites de pantalla para ahorrar memoria.
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Sep.
Efectivamente, en el ejemplo TileChange de las librerias, como dice kNightFox, hay un codigo que "emula" a la camara, y es mas o menos como tu dices:
// Posicion del fondo
bg_x = (x - 128);
if (bg_x < 0) bg_x = 0;
if (bg_x > 512) bg_x = 512;
bg_y = (y - 96);
if (bg_y < 0) bg_y = 0;
if (bg_y > 320) bg_y = 320;
// Posicion del Sprite
spr_x = (x - bg_x) - 4;
spr_y = (y - bg_y) - 4;
NF_MoveSprite(1, 0, spr_x, spr_y);
Bastante simple, deberia funcionar, voy a probarlo ahora mismo ^^. La proxima vez mirare con mas detenimiento los ejemplos antes de preguntar directamente.
Y, bueno, en estas librerias no hay problema por estar borrando y creando sprites continuamente, no? Es que en PAlib era un peligro xD
Muchas gracias por vuestra ayuda =D
e.e
hay un ejemplo en la libreria
hay un ejemplo en la libreria (el de modificar tiles) que tiene una camara 2d dinamica. Para el resto de sprites, es restar la posicion del sprite - posicion de la camara, si la x esta entre -64 y 256 y la Y entre -64 y 192, ese sprite se crea y se muestra, si , no, se borra. La posicion del fondo es posicion de la camara -127/-96
Nuestra web oficial:
http://www.nightfoxandco.com/
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.
NFLIB
Mira en el source de NFLIB si quieres saber mas de la funcion NF_ScrollBg, que eso no mueve la camara, solo el fondo, pasando las tiles a la posicion que quieras, por lo que los sprites tendras que moverlos usando NF_MoveSprite
Ya se que es un coñazo, pero si se hiciera a 3D entonces no usas tanta memoria y puedes usar la camara para moverte y no mover todo lo que veas
Yo haria con 3D el mapita aereo como textura de un plano, lo pongo mirando a la camara(como en 2D), y mueves los ejes x e y con el glLookAt(), y tambien podrias acercar y alejar el mapa aereo con el eje z, sin necesidad de mover sprites ni fondos, solo la camara.
O si eso hazte tu propia camarita en 2D, a ver que sale ::)
Bueno, espero haberte ayudado, Salu2!
~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~
Usara bastante (pero mucha
Usara bastante (pero mucha menos) memoria en 2d... No es nada dificil hacer lo que pide...
Mmmm...
La solucion del 3D no es mala, pero entonces ya tendria que trabajar
con las funciones del 3D, y convertir todos los graficos a planos.
Ademas, si no me equivoco, al cargarlos todo como objetos 3D ¿no se emplea
mas memoria, en vez de reducirla...?
Efectivamente, lo que quiero es mover una camara no el fondo,
puesto que en ese caso podria usarla para cualquier juego 2D. Si lo hago
moviendo sprites y con scroll de fondos, lo tengo que hacer siempre de
forma diferente para cada juego que tenga que quiera hacer, y en el caso por
ejemplo de los de plataformas puede ser mas complicado.
kNightFox, si me pudieras decir algo de tu metodo, me vendria muy bien.
PD: Una vez logre (si es que lo logro) crear una camara en 2D posteare el codigo para que lo peguueis en vuestro fichero C... Realmente la funcion de camara es una de las mas importantes de los videojuegos =S
e.e
Pues, por favor,
no dude en postear cual es :S
EDIT: Porque quieres que se mueva la camara 2D(a saber si eso existe en 2D), no el fondo