10 de Febrero de 2012
Ene
29

NightFox's Lib - Funciones de texto para fuentes de 8x16

Hola!
 
Ahora que ya las tengo mas que probadas, os dejo la version actualizada de mi libreria, a la que he añadido soporte para fuentes de 8x16 pixeles, permitiendo la escritura de textos mas legibles en pantalla. Las funciones añadidas y cambios en la libreria son los siguientes:
 
- Añadido soporte para texto de 8x16 sin rotacion.
- Añadida la funcion NF_LoadTextFont16();
- Añadida la funcion NF_CreateTextLayer16();
- Añadida la funcion NF_WriteText16();
- Añadida la funcion NF_ClearTextLayer16();
- Añadido el ejemplo para textos de 8x16.
 
De momento, no soportan rotacion de texto, dependiendo a mis necesidades es posible que se la añada en un futuro.
En esta entrada (NCASS) podeis ver un ejemplo practico del uso de estas fuentes.
 
La descarga de la libreria, aqui: NightFox's Lib para Libnds Ver. 20100129
 
Un cordial saludo y a disfrutarla
 
NightFox
 
0

11 Comentarios:

Buenas, comentarte que ya

Buenas, comentarte que ya termine de modifcar las funciones y ahora tengo en el mismo fichero de fuente, tanto las letras de 8x8 como las de 8x16 escribiendo estas ultimas si pongo [grande]texto[/grande]

En mi caso si he pueso que soporte los giros, pero de forma ligeramente distinta a como lo haces tu, en mi fichero no incluyo las imagenes rotadas sino que al cargar el fondo las roto es una cosa como la que sigue:

if (rotation == 0){
fread ((NF_BUFFER_BGTILES[slot] + 64), 1, (NF_TILEDBG[slot].tilesize - 64), file_id);
}else{
char caracter[64];
for (int i = 1;i < TOTAL_CHAR;i++){
fseek(file_id, i*64, SEEK_SET);
fread (caracter, 1, 64, file_id);
GirarFont( caracter, rotation);
memcpy( NF_BUFFER_BGTILES[slot] + i * 64, caracter, 64);
}
}

De este modo en la fuente solo tengo que escribir las fuentes en un sentido, la funcion GirarFont cambia la informacion de los bytes para que esten giradas.

PD: Para meter los saltos de linea tube que escribir manualmente los < br > :S

Pues si, esa es la otra

Pues si, esa es la otra manera. Seguramente terminare haciendo algo parecido, por que es un poco coñazo tener que escribir la fuente 3 veces, es mas rapido a nivel de codigo, pero mas labrioso a nivel de diseño. El dia que tenga ganas ya si eso... XD

Editando fuentes

Buenas noches, queria poner una captura de pantalla de lo obtenido. Si le introduzco esto intrucciones: escribeDepurando("Este texto es tamaño por defecto[grande]este otro va en grande[/grande] y volvemos a por defecto",0);
escribeDepurando("Este texto es color por defecto[c=003100] verde[c=310000] rojo[/c]verde[/c] y volvemos a por defecto",4);
escribeDepurando("Y se pueden mezclar [grande]esto[c=000031] esta[c=052310] en grande con colores[/c] distintos ^_^[/grande] y esto[c=202020] otra vez chico [/c]y cambiando[/c] colores",7);

(escribeDepurando es para no compliccarme son llamadas que me ahorren alguna tonteria, no es vinculante ya que esta lo que hace es una llamada a la verdadera funcion que escribe)

Lo que obtenemos de esa entrada seria una cosa tal que asi:


Si es cierto que lo escrito en grande parece "mas abajo" de lo que esta escrito en "normal" pero eso no es para usarlo en la misma linea, sino para resaltar algo como un Nombre al principio o cualquier texto contiguo (o para escribir siempre asi)

Muchas gracias por todo esto ^_^ solo espero que la gente que lea esto se motive para investigar tb por su cuenta.

Acabo de leer lo quie

Acabo de leer lo quie pusiste, si quieres te paso el codigo por aqui, es una chorrada en realidad... lo mas lioso es el tema de saber que coordenadas X e Y rotadas se convierten en cuales, pero una vez calculado eso como lo que haces es girarlas en la misma posicion no tienes ni que cambiar el codigo de la parte de escribir, ya que en la posicion 1 estara siempre "!" ya sea girado o sin girar. Es mas te la paso por aqui y tu ya decides si la coges o no xD.

void PJ_GirarFont(char *caracter, u8 rotation){
int i,j;
char copia[64];
memcpy(copia,caracter,64);
if (rotation == 1){ // Rotacion 90º a la derecha
for(i=0;i<8;i++){
for(j=0;j<8;j++){
caracter[j*8+7-i] = copia[i*8+j];
}
}
}else{// Rotacion 90º a la izquierda (rotation = 2)
for(i=0;i<8;i++){
for(j=0;j<8;j++){
caracter[(7-j)*8+i] = copia[i*8+j];
}
}
}
}

Esta funcion devuelve en el mismo parametro de entrada caracter ese mismo caracter pero girado. Nunca me cansare de repetirlo pero muchas gracias ^^

Mientras pubicavas esto

Mientras pubicavas esto (que es una pasada) yo he estado añadiendo esto
http://nightfox.pastebin.com/f57598161
a mi libreria. Ya se me habia pasado por la cabeza, pero el ser vago es lo que tiene XD
Es similar a lo que has hecho tu, pero asi se puede rotar cualquier tile de cualquier fondo cargado, con lo que nos podemos divertir ^^

Wo wo genial

Wo wo genial, es una pasada xD vengo de cenar y me encuentro semejante sorpresita :p como se nota que tu has tocado mas el bajo nivel que yo, porque a mi me cuesta mas ver las posiciones de memoria que ocupan las cosas, pero vamos que termino viendolas :p, es genial esa funcion sobre todo para hacer algunos efectos curiosos sobre el escenario, aunque llegados a este punto incluso hacer un reflejo de los tiles seria ya una modificacion minima, aunque estas cosas y son las tipicas funciones "menos necesitadas" y mas si las puedes simular con otras (la de sustituir un tile por otro).

Ahora mismo no se me ocurre nada en que usar esa funcion a parte de para rotar el texto (que si me das alguna idea mejor que mejor) y me he dado cuenta que has usado 1 y 2 para las rotaciones de 90º derecha e izquierda respectivamente para que mantenga compativilidad con las rotaciones de las fuentes :p estas en todo ^^

Yo ahora dejare un poco pausado el tema del texto de salida y mañana quizas me ponga con algo sobre teclado tactil (que hay funciones por internet pero prefiero customizarmelo aunque aun no lo he decidido. Luego una vez mas o menos "crea" que esta bien lo de meter datos con teclado tactil creo que mirare si es posible "guardar" datos (partida) dentro de la ROM mediante EFS o si tengo que hacerlo por FAT necesariamente, tu sabes ahora mas que el juego me estoy centrando en hacerme las funciones y estructuras de datos que me faciliten hacer el juego (aunque algunas estructuras mias son repetitivas mirando las tuyas, pero prefiero tener todos los datos juntos, eso y que me conozco mejor como acceder a los datos de un sprite si solo miro mi "buffer" de estructura sprnte que si tengo que mirar varios "buffer" distintos, ademas quizas me haga funciones que me autocreen los sprites sin decirle yo donde de la RAM o VRAM e incluso ID darle que los asigne solos y me los devuelva).

Pues esta y otras funciones

Pues esta y otras funciones que estoy preparando van para la siguiente version de la libreria. A medida que necesito cosas para el NCASS y veo que son utiles, las voy añadiendo.

Esto se parece mas a un conversacion que a otra cosa

Genial ^^ yo la verdad no sabia ni como empezar, decidi usar tus librerias porque en los tutotiales de PAlib no venia nada sobre Background transparentes (almenos no encontre nada) y en las tuyas si, y la verdad me alegro un monton de haber cambiado, me resultan mas comodas en muchos aspectos.

Una cosa que te iba a decir, sobre la funcion de rotar TILES, el unico "inconveniente" que le veo por asi decirlo es si la usa a nivel "dinamico" es decir, si lo usas para el tema de las fuentes y al cargarlas y ver que las quieres giradas las cargas todas giradas y de escandalo, pero por ejemplo si quieres girar un TILE en uns direccion aleatoria por ejemplo por alguna razon y en funcion de otras razones restaurar su posicion original o girarlo realmente "perdemos" el saber cual es la posicion real a no ser que mantengamos una "historia"(vamos una rotacion opuesta, o suma de rotaciones opuestas) de los giros (cosa pocoviable , muchos tiles... muchos datos a guardar, aunque solo sea un dato (byte) para cada tile).
Ahora si al usarlo tienes en cuenta ese hecho, de no controlar la posicion original pues ningun problema, no se, ¿que opinas tu respecto a eso de "saber" la posicion original de cada TILE?

Buenas noches me despido por hoy (si, llego de estar con los colegas y entro aqui xD)

Ojo que el rotar los tiles

Ojo que el rotar los tiles consume MUCHOS recursos y deberia usarse solo para manipular un fondo cargado antes de mostrarlo (como las fuentes).
Comentar tambien que he correguido un bug y ya esta añadido el soporte para rotacion al modo de texto 8x16.
Aqui teneis la lista de cambio que he incluido hoy a la libreria y estaran disponibles en la proxima revision:
 
- Añadida la funcion void NF_RotateTileGfx(); la cual rota el grafico de un tile en la direccion indicada.
- Dado a la funcion anterior, las fuentes para texto no necesitan mas las partes rotadas de derecha e izquierda, pero se mantiene la compatibilidad con las que ya tubieras hechas.
- Modificada la funcion NF_LoadTextFont16(); para poder cargar fuentes rotadas.
- Modificada la funcion NF_CreateTextLayer16(); para poder crear capas con el texto rotado.
- Corregido Bug en la funcion NF_WriteText(); que calculava mal la corrdenada Y en modo rotado 90º a la derecha.

 
Saludos a todos ^^

Posible problema de las fuentes

NightFox, te lo puse en otro "entrada" anterior, pero te lo repito aqui por si no lo viste, probando el escribir texto no me reconocia los caracteres "¡" y "¿", para que me los reconociera lostube que añadir como caracteres especiales (igual que Ñ y Ç) puesto que el 94 (+32) a mi me salia que era "~" no "¡".

La verdad, como dije en el otro no se si puede ser por configuraciones de teclado o lo que sea, aunque no creo porque ira por codigo UNICODE o ASCII.

Muchas gracias

Yo es que los caracteres

Yo es que los caracteres tipicos de aqui  ( ¿ ¡ Ñ )  evito tener que usarlos, dado que no usan un ASCII standar. Añadir la Ñ y la Ç aun aun por que en depende que idiomas son imprescindibles, pero los ¿¡ si puedo evitarlo...
Mas que nada por que si alguien fuera de españa los intenta usar, posiblemente esten con otro codigo y tampoco los encuentre. Asi que para evitar problemas...