NightFox & Co - Desarrollo de Homebrew para NDS
Blog dedicado a los proyectos presentes y futuros desarrollados para la pequeña Nintendo DS
Aficiones: desarrollo, homebrew, nintendo ds, programación, videojuegos
Hola!
Poquita cosa hoy, ya que las funciones de rotacion y escalado del sprite son tan simples como indicarle al OAM (Object Attribute Memory) que Rotset de los 32 disponibles por pantalla queremos asignarle al sprite y luego solo decirle al rotset correspondiente que valor queremos para el angulo y escalado.
Como las Libnds usan valores para la rotacion de entre -32768 y 32768, he decidido pegarle un bitshift para poder usar valores entre -512 y 512 (suficientes digo yo), ademas decorregir que los valores positivos giren a la derecha y los negativos a la izquierda (en las libnds se interpreta al reves, que cosas). El factor de escalado se mueve entre el 0 y el 512, siendo 256 el valor central, que equivale a una escala del 100%
¡Hola!
Pues vamos avanzando. Estos días he estado trabajando en solucionar una de las limitaciones más grandes de la DS. El tamaño de los fondos. Como sabéis, el tamaño máximo de los fondos en la DS es de 512x512 pixeles, esto son, dos pantallas. En algunos juegos esto puede pasar desapercibido y no ser un problema, pero en juegos con scroll, plataformas, mata marcianos, rpg’s, pues si es un problema (¿Os imagináis un Castlevania o un R-Type con decorados de solo 2 pantallas de largo?).
La solución, engañar a la DS. Vale si, ¿pero cómo? Fácil, le daremos el cambiazo cuando este despistada.
Si repasáis los anteriores tutoriales, sabéis que los fondos se dividen en 3 partes, los tiles, el mapa y la paleta. El problema lo tenemos con el tamaño del mapa, que es el que le dice a la DS donde tiene que colocar cada tile del fondo en la pantalla y que como mucho puede ser de 512x512 pixeles (64x64 tiles). Dado que los tiles y la paleta van a su bola, mientras no usemos más tiles de los que caben en memoria, nuestro fondo, si nos lo montamos bien, puede ser virtualmente infinito (vamos, mientras tengamos RAM libre…).
Hola!
Pues si, como os prometi, hoy tenemos animaciones.
La cosa es mas bien tonta, os cuento:
Para crear un Sprite animado debemos hacer una tira, del ancho de nuestro sprite y del alto equivalente a la altura del mismo por el numero de frames. Asi, si queremos crear un personaje animado, que mide 32x64 pixeles y que tendrá 5 frames, nuestro grafico medira 32x320. Asi es que colocaremos cada frame encima del otro, sin espacios.
La DS coloca los tiles de este grafico en fila, uno detrás del otro. Para poder crear una animación, necesitaremos saber 3 cosas,
1. El puntero donde se guarda este grafico
2. El tamaño en bytes de cada frame
3. Cuantos frames tiene la animación (para no pasarnos)
Vale, como cuando cargamos el grafico desde la VRAM, pido que metáis el alto y ancho en pixeles y sabiendo que la DS carga los graficos convertidos en tiles de 8x8 pixeles, haremos lo siguiente:
tiles_ancho = ancho / 8
tiles_alto = alto / 8
total_tiles = tiles_ancho * tiles_alto
tamaño_en_bytes_del_frame = (tiles_ancho * tiles_alto) * 64
Vale, después de esta empanada mental, os cuento el porque de estas “mates?”
Dividimos por 8 para saber el numero de tiles del frame, por que cada tile son 8 pixeles.
Hola!
Hoy tenia que ser una entrada asi como muy larga, pero como al darle al boton enviar se ha ido a tomar viento fresco, os dejo el video de muestra y el proyecto:
Bueno, como son casi las 3 y media de la madrugada, sere breve, ya funciona. Si le dais un vistazo a las anteriores entradas, sabreis que hace unos dias que me estoy peleando con las paletas extendidas. Pues bien, para variar, no era culpa mia, si no de un "define" con mala leche, que segun alguna pagina existe, pero no.
El problema ha venido de esta linea de codigo:
vramSetBankG(VRAM_G_BG_EXT_PALETTE);
Con esto le comunicavamos a la DS (en teoria) que los datos que habiamos grabado en el banco de VRAM G, los queriamos usar como paleta extendida para fondo.
Pues no, se ve que no (ole por la documentacion de los co*ones) y gracias a un alma caritativa que hizo un ejemplo (lo siento, pero ya ni recuerdo de donde lo saque, pero le estoy agradecido), me encuentro con esto:
The ndslib does not have appropriate defines for this. The first line sets VRAM_F to store slots 0 and 1, and the hex on the second line sets VRAM_G to store slots 2 and 3. */
VRAM_F_CR = VRAM_ENABLE | VRAM_F_BG_EXT_PALETTE; //slots 0 and 1
VRAM_G_CR = VRAM_ENABLE | 0xC; //slots 2 and 3
Lo que son las cosas. Tanto darme de ostias y ahora resulta que encima depende en que emulador se comporta muy diferente. La cosa es que en el NO$GBA sigue sin funcionar, en la DS va algo mejor, pero vamos, no es para tirar cohetes, pero lo que son las cosas, con el Ideas va de muerte. Aqui teneis la prueba:
Blog dedicado a los proyectos presentes y futuros desarrollados para la pequeña Nintendo DS
Aficiones: desarrollo, homebrew, nintendo ds, programación, videojuegos
