24 de Noviembre de 2017

Archivo para Abril de 2009 en NightFox & Co - Desarrollo de Homebrew para NDS, blog de KnightFox

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%
 

Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 
Los valores de escalado que usan la libnds me han parecido correctos, salvo que para ellos el 512 significava reducir la escala, la cual cosa he invertido, siendo 0 el valor mas pequeño y 512 el mayor.

Hola,
Entrada cortita. Os dejo un video sobre como va funcionando el tema de mover un fondo casi infinito en cualquier direccion. La teoria es muy similar a la que os comente en la anterior entrada. Como supongo que habra algun bug, dado que tengo que testearlo con mas fondos, de momento disfrutar de el video que os dejo
 
Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 
y la descarga del proyecto tal como lo tengo ahora.
He añadido soporte para el Pad de la DS, con el que moveremos el scroll de la pantalla de arriba.
 
Descarga del Proyecto: NightFox Lib para Libnds 20090426
 
Un cordial saludo y si podeis testearlo con vuestros fondos, me hareis un favor.
 
NightFox

¡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!
 
En la entrada de ayer os enseñe la teoria del uso de Sprites animados.
En el ejemplo de ayer teniamos un problema grave (es un decir) de cara a la conservacion de recursos.
Nuestro personaje tenia un tamaño de 32x64 pixeles, eso son 2048 bytes por frame. Dado que la animacion tenia 12 frames esto nos da 24576 bytes, vamos 24kb.
Dado que la DS tiene poca VRAM y nosotros le hemos asignado 128kb por pantalla para los Sprites, nos damos cuenta que si todos los Sprites animados ocupan esa barbaridad, lo llevamos claro. Solucion, mantener en RAM los frames no utilizados, teniendo solo en VRAM el que queramos usar (con lo que pasaremos de ocupar 24kb a 2kb). Problema, (siempre tiene que haber alguno, ¿no?) todos los sprites que usen ese Grafico, mostraran el mismo frame de animacion, asi que vosotros sobre la marcha vereis segun que Sprites que os conviene mas.
 
Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 

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.

Abr
17

Programacion en DS. Sprites(II)

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:
 

Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 
NightFox's Lib 20060416
 
Basicamente he añadido funciones para el volteado de sprites, borrado y optimizacion de la VRAM.
Si teneis dudas, a los comentarios.

Saludos

Fox

Abr
13

Programacion en DS. Sprites

Hola!
Mas cosas que he hecho con las LIBNDS. Los Sprites.
Antes que nada y en vistas de las descargas de los proyectos (casi nulas) y los (ninguno) comentarios y debido a que prefiero en ese caso invertir mi tiempo en desarrollar que en hacer tutoriales que no se mira ni dios, voy a optar por ir publicando los proyectos de la libreria que estoy haciendo para DS, que total, a los que realmente les interese, con lo que he comentado el codigo aprenderan a programar en libnds y los demas, pues seguro que usaran sin miramientos las funciones de mi libreria, con lo que todos contentos y yo mas descansado.
Eso si, cualquier duda, ruego o suplica, a los comentarios, que los respondere encantado (o no).
 
Dicho esto, hoy tocan: LOS SPRITES
 
Despues depegarme 3 dias, he conseguido hacer unas funciones minimamente decentes para la creacion y movimiento de Sprites en pantalla.
Ya puestos a liarla, la liamos gorda, eso es, un engine que permite cargar desde la FAT a RAM hasta 256 graficos para la creacion de sprites, 64 paletas para estos y la autogestion de la VRAM cuando creemos estos Sprites.
 
He estado realizando pruebas cargando 5 graficos diferentes con 5 paletas (o sea, al igual que los fondos, a tocado usar paletas extendidas) y he puesto en pantalla, repartido entre las diferentes capas de fondos, hasta 128 sprites por pantalla (el tope del hardware de la DS) sin probemas.
 
Aqui os dejo un  par de videos, con 128 y 25 sprites respectivamente.
 
Abr
6

Programacion en DS. Proyecto de la Leccion 2.

Hola!
Bueno, porfin ya he conseguido que todo lo basico referente a los fondos, funcione. En el proyecto que os dejo hoy aprenderemos a:
- Cargar un fondo desde la FAT, guardarlo en la RAM y asignarle un nombre para, mas tarde, poderlo pasar a la pantalla.
- Inicializar el motor 2D en ambas pantallas y configurar los bancos de VRAM para poder cargar estos fondos y sus paletas.
- Mover estos fondos en la pantalla (scroll)
- Eliminacion de los mismos, tanto de la pantalla como de la RAM, para ahorrar memoria una vez no sean necesarios.
- Uso de GRIT para convertir estos fondos.
- Creacion de una ROM compatible con no$gba para poder probarla en el emulador.
 
Dado que a medida que hago estos tutoriales, estoy creando una libreria, he empezado a dividir las funciones en varios archivos, para tenerlo todo mas claro. He documentado lo suficiente el codigo para que con solo daros cuatro notas aqui, podais reseguirlo y aprenderlo ha hacer vosotros (o si sois uno vagos, usar directamente mis funciones).
 
Para empezar, os dejo un video con lo que aprenderemos ha hacer hoy.
 
Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 

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:
 

Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 
n00bey, habitual del mundillo del homebrew le esta dando un vistazo al codigo, a ver si pilla algo que este mal y se me haya pasado a mi, pero sospechamos que es que algun banco de VRAM queda bloqueado contra escritura (no deberia) y por eso la cosa no va.
A ver como lo terminamos solucionando.
 
Un cordial saludo
 
NightFox