Problemas con "é"

Started by Arcontus, November 25, 2017, 08:21:06 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Para solventar el problema de los acentos ñ's y demás simbolos de nuestro teclado al utilizar los FNT, he hecho una funcion que recibiendo un array de chars revisa caracter a caracter y sustituye los simbolos no standards encontrados por su correspondiente simbolo para el FNT. Este es el código y ejecutable de ejemplo:
import "mod_key"
import "mod_map"
import "mod_video"
import "mod_text"
import "mod_screen"
import "mod_string"

PROCESS normalize_special_chars(char *myNonStandardChar,int size)
PRIVATE
    int index;
END
BEGIN
    for (index = 0; index < size; index++)
        if (myNonStandardChar[index] == "ñ")
            myNonStandardChar[index] = chr(241);
        END
        if (myNonStandardChar[index] == "Ñ")
            myNonStandardChar[index] = chr(209);
        END
        if (myNonStandardChar[index] == "á")
            myNonStandardChar[index] = chr(225);
        END
        if (myNonStandardChar[index] == "Á")
            myNonStandardChar[index] = chr(193);
        END
        /* // Char 101 corresponde al simbolo é del sistema. en este caso devuelve un caracter extraño
        if (myNonStandardChar[index] == 101)
            myNonStandardChar[index] = chr(233);
        END
        */
        // el if anterior y este corresponden al mismo simbolo pero devuelven diferente comporsizeiento. En este caso devuelve ú
        if (myNonStandardChar[index] == "é")
            myNonStandardChar[index] = chr(233);
        END
        if (myNonStandardChar[index] == "É")
            myNonStandardChar[index] = chr(201);
        END
        if (myNonStandardChar[index] == "í")
            myNonStandardChar[index] = chr(237);
        END
        if (myNonStandardChar[index] == "Í")
            myNonStandardChar[index] = chr(205);
        END
        if (myNonStandardChar[index] == "ó")
            myNonStandardChar[index] = chr(243);
        END
        if (myNonStandardChar[index] == "Ó")
            myNonStandardChar[index] = chr(211);
        END
        if (myNonStandardChar[index] == "ú")
            myNonStandardChar[index] = chr(250);
        END
        if (myNonStandardChar[index] == "Ú")
            myNonStandardChar[index] = chr(218);
        END
        if (myNonStandardChar[index] == "ç")
            myNonStandardChar[index] = chr(231);
        END
        if (myNonStandardChar[index] == "Ç")
            myNonStandardChar[index] = chr(199);
        END
        if (myNonStandardChar[index] == "¡")
            myNonStandardChar[index] = chr(161);
        END
        if (myNonStandardChar[index] == "¿")
            myNonStandardChar[index] = chr(191);
        END
    END
END

Process Main()
PRIVATE
    char myNonStandardChar[30];
    string mySTR, txt;
    int myFont;
    int index;
    char asc[1];
END
Begin
    myNonStandardChar = "áéíóú, ÁÉÍÓÚ, ñÑ, Çç, ¿¡!?"; //El segundo simbolo no se pinta correctamente
    set_mode(1024,768,32);
    myFont = load_fnt("fuente.fnt");  //<---- cambiad aquí por vuestra fuente .FNT
    normalize_special_chars(&myNonStandardChar,len(myNonStandardChar));
    mySTR = myNonStandardChar;
    write_string(myFont,200,200,0,&mySTR);
    asc[0] = chr(233);  // Test del simbolo 233, que es el que está dando problemas.
    txt = asc;
    write_string(myFont,200,230,0,&txt); //Aqui se pinta perfectamente el simbolo "é"
    while(!(key(_esc)))
        frame;
    END
END

Pues bien, por algún extraño motivo que no alcanzo a comprender, é no se traduce correctamente. Además, hay un if comentado en la funcion normalize_special_chars(), si se descomenta ese if y se comenta el del simbolo "é", el resultado sigue siendo incorrecto pero cambia.
Por último, en la función main justo antes de la instruccion while imprimo una string con el contenido que debería tener la cadena anterior y en este caso funciona.


¿Teneis alguna idea de que está sucediendo?¿Os pasa tambien a vosotros el problema al traducir la "é"?
Un ultimo apunte, la librería ttf de la wiki no funciona. No pinta ningún tipo de texto, por ello me he visto forzado a traducir los chars para utilizar FNT.
Cualquier ayuda será bien recibida.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Drumpi

Te lo tendría que mirar, pero creo que en lugar de usar "é" deberías usar 'é', con comillas simples, porque si no recuerdo mal, Bennu toma los datos entre comillas dobles como strings, y entre comillas simples como char.
No obstante, estás usando un pointer a un array de chars. Recomendaría que, si sigue fallando, intentases usar constantes, o funciones tipo ATOI, CHR o no recuerdo cuáles eran los que convertían a CHAR (lo siento, uso demasiados lenguajes recientemente y tengo un pequeño cacao mental).

Respecto a la ttf, la wiki está desactualizada desde... no lo sé ^^U Busca las descargas oficiales, a ver si anda por ahí, y si no, L1nk3rn3l seguro que tiene un enlace al BennuPack, donde estará la librería actualizada y compilada a la última versión disponible ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Arcontus

Hola Drumpi, gracias por tu rápida respuesta. Lo curioso del tema es que solo falla en la representación de un carácter concreto (siempre el mismo, "é"), por lo que me decanto  a pensar que Bennu está haciendo algo más con ese char que se me escapa.

Respecto a " " en vez de ' ', tiene sentido lo que dices, pero al realizar una comparación entiendo que lo que cuenta es el código ascii. De todas maneras, como podéis ver hay un IF comentado que en vez de comparar con "é" compara con su valor ascii (el 101). Si se descomenta este caso y se comenta el caso de la comparación con la "é", que debería dar el mismo resultado en una comparación y la otra, pues no, ninguna de las dos funciona correctamente y ademas dan resultados erroneos distintos.

Agradecería que algún experto corriera este programa con una fuente que tenga disponible y diga si se le representa bien el carácter 'é'.
Gracias de antemano,Un saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

panreyes


Arcontus

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

panreyes

Prueba también a hacer un say, a ver si te salen las tildes correctas.

También, ¿con qué programa generas los FNT?
Me suena que hace tiempo tenían una opción para guardarlos en CP850 o en UTF8, o algo parecido.

¿Has probado a reordenar los bitmaps del FNT? Yo los tengo ordenados así para que me funcionen correctamente con la solución que di en el otro hilo:
https://www.dropbox.com/s/uh390ezh2twce3e/h4.zip?dl=0

Arcontus

Gracias Panreyes,

no pude hacer las pruebas a fondo hasta ahora. El problema estaba en la codificación de la fuente, fue ponerle CP850 y todo a funcionar como la seda.
Karma++
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

panreyes

Me alegro, un problema menos :)

Luego te contesto el hilo de Steam, que no he tenido momento aún.