Hola gente, hacia tiempo que no pasaba por aqui.
Estoy intentando escribir "ñ" y vocales con acento, pero
[code language="bennu" options="singleline"]write(0,0,0,0,"ÑÀñá");[/code]
no funciona. He mirado el código ASCII y si que existen:
[code language="bennu"]
Global
a;
b;
c;
begin
from a=0 to 7;
x=0;
y+=20;
from b=0 to 31;
write(0,x,y,0,chr(c));
c++;
x+=20;
end
end
while(scan_code==0)
frame;
end
end
[/code]
¿Sabéis como solucionarlo?
Comprobando el ASCII de algunas he descubierto que están incompletas¿Hay alguna manera de tener una fnt completa?
Mmm... Pégale un vistazo al código del FrikiTournament xD
Me he dado cuenta de que el código
[code language="bennu" options="singleline"]write(0,0,0,0,"ÑÀñá");[/code]
Si funciona, el problema es que las fnt tienen los simbolos diferentes de la fuente por defecto a partir del 128.
Lamentablemente las fnts tampoco tienen los primeros 32, con lo que me gustaban: ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼
a mi me han salido problemas al poner acentos y Ñ al usar tipos de letra ttf pero porq la propia fuente no traia esas letras, es decir ... solo traía los caracteres para el inglés. Si encontraba el tipo de letra adecuado no daba problemas.
si mal no recuerdo usa el viejo encoding ascii
Es una cosa realmente extraña. Si recoges el texto desde un fichero externo con fopen/fgets si que funciona. Si hardcodeas el texto no aparecen los caracteres especiales.
porque el encoding que usa tu editor de textos no es el que va para bennugd.
La cosa es que ambos ficheros de texto tenían el mismo encoding, ANSI :\
Pero no el mismo set de caracteres: por lo que he podido ver, el encoding interno de Bennu con la fuente del sistema y las strings no es el mismo que el de la lectura de ficheros. De hecho, en los FNT hay un campo para determinar el tipo de encoding que usa.
De momento, para usar el ASCII extendido, la única posibilidad es con set_glyph y save_fnt... a menos que cierto desastroso coder termine cierta aplicación que andaba haciendo para el manejo de fuentes.
igual las funciones de mapeo andan medio para la mona, la set_glyph no permite setear todos los caracteres, la unica forma de crear un mapa completo (lo que no significa que se vaya a poder usar completo) son las nuevas funciones que agregue para crear fonts a partir de un mapa.
El post esta tocando temas que me vienen grandes, he decidido hacer una función que te transforme una string en otra que se escriba bien con la fnt.
Quote from: carles on July 21, 2011, 09:29:56 PM
El post esta tocando temas que me vienen grandes, he decidido hacer una función que te transforme una string en otra que se escriba bien con la fnt.
Hardcore mode xD
Hablamos esta tarde para alcohol y esas cosas.
Quote from: PiXeL on July 21, 2011, 03:59:39 PM
La cosa es que ambos ficheros de texto tenían el mismo encoding, ANSI :\
Acabo de leer esto: Bennu al compilar el dcb no estará usando el mismo charset del fichero, que será el mismo que el de tu fichero de texto externo.
Me ocurrió lo mismo con UTF8: si metes los caracteres utf8 en el código se van a ver mal (los especiales, al menos) pero si luego los lees de un fichero para pasarlos por mi librería iconv sí que los maneja bien.
Yo invoco a los sabios de este foro para que con su sabiduría pueda hallar respuesta a mis preguntas:
¿Porque el switch de mi código no funciona cuando el valor es mayor de 128?
La idea es una función que modifique una string que no se vea bien con una fnt.
[code language="bennu"]
Global
int a;
int b;
int c;
int fuente;
function string text2fnt(string text);
private
a;
string texto;
Begin
from a=0 to len(text);
switch (text[a])
case 127:
texto+=""+chr(169);
end
case 128:
texto+=""+chr(169);
end
case 129:
texto+=""+chr(169);
end
case 130:
texto+=""+chr(169);
end
case 131:
texto+=""+chr(169);
end
case 132:
texto+=""+chr(169);
end
case 133:
texto+=""+chr(169);
end
default:
texto+=""+chr(text[a]);
end
end
end
return texto;
end
Process Main();
Begin
set_mode(640,480,32);
fuente=load_fnt("fuente.fnt");
from a=0 to 7;
x=0;
y+=40;
from b=0 to 31;
write(0,x,y,0,chr(c));
write(fuente,x,y+10,0,text2fnt(chr(c)));
c++;
x+=20;
end
end
while(scan_code==0)
frame;
end
end
[/code]
¿El valor es realmente mayor de 128? No tiene ciencia, no debería fallar.
Y si realmente necesitas algo como lo que pones, quita el switch y pon un if xD
O que use comas para separar y lo pone todo en un mismo case :D
Usa say para saber si entra, es posible que no exista ese caracter en la fuente que estés usando pero que el código funcione correctamente.
Escribe también los valores de cada letra para comprobar que realmente está haciendo el cambio.
He puesto la siguientes líneas de código en el switch:
[code language="bennu"]
case 128..255:
texto+=""+chr(169);
say(texto);
end
[/code]
y ni caso, pero si el valor es menor de 128 sí.
Escribe esto:
[code language="bennu"]
case 128..255:
texto+=""+chr(169);
say("Hola: " + text[a] + " " + chr(169));
end[/code]
Deberías ver una línea "Hola" por cada letra, la letra en sí, y el caracter por el que lo quieres cambiar. Eso te dará varias pistas de dónde está el error. A la hora de depurar, no asumas que los valores que añades son correctos, que la letra que buscas es la que has leido, ni que se entra en un IF.
Sigue igual, no acepta ningún case a partir del 128. ¿A vosotros os funciona?
sera que text[a] es un char con signo? la verdad que no recuerdo como esta mapeado internamente pero podria ser, prueba castearlo o meterlo dentro de una variable unsigned antes de pasarlo por el switch
Gran SplinterGU ha sido vuestra sabiduría la que ha aportado luz en estas horas oscuras, tenéis mi gratitud y un karma.
:) ;)
Hola a todos.
Lei este post hace ya algun tiempo, y ahora que me encuentro con que necesito escribir ñ-s he vuelto a releerlo, pero dada mi ignorancia no es que haya entendido gran cosa ninguna de las dos veces :(
Tengo una fuente ttf instalada que quisiera usar en un juego, el caso es que genero la fuente con el fnt edit 2006 del bennupack y luego cuando la uso en mi programa no me salen las ñ-s al poner textos con write.
Cuando lei que keoh decia que su problema habia sido que algunos tipos de letra solo tenian caracteres ingleses pense que igual era eso lo que me pasaba a mi, pero he abierto el archivo ttf con un creador de fuentes para editarlo y añadir la ñ y veo que ya la tiene (he usado el font creator 6.0).
Splinter decia: "porque el encoding que usa tu editor de textos no es el que va para bennugd."
Imagino que cada caracter tendra correspondencia con un numero y que a eso os referis con el encoding, y que para los caracteres especiales (ñ, acentos...) tal vez la forma de codificar sea distinta dependiendo de un editor u otro. Por si sirve de algo estoy usando notepad++ y windows.
Existe alguna forma de escribir ñ-s sin tener que generar una nueva font con set glyph y save fnt?
Keoh, me podrias decir que editor de textos usas?
Gracias por adelantado.
yo para escribir textos no uso las funciones de load_font ... sino las de load_ttf del mod_ttf , siempre q la fuente tenga el carácter de la ñ
Trecek, la función que estoy haciendo es para areglar el problema que tenemos los 2, me queda poco para acabarla, en unas horas la publicare en este post.
La función está acabada, salvo por un bug muy raro que hace que sea inservible.
Por alguna extraña razón cuando escribo[code language="bennu" options="singleline"]write(fuente,320,460,0,"Ñ");[/code] Bennu escribe 2 caracteres(Ç`) en vez de 1.
¡AYUDA!
[code language="bennu"]
function string text2fnt(string text);
private
a;
string texto;
Begin
from a=0 to len(text);
switch (text[a])
case -128://Ç
texto+=""+chr(199);
end
case -127://ü
texto+=""+chr(252);
end
case -126://é
texto+=""+chr(233);
end
case -125://â
texto+=""+chr(226);
end
case -124://ä
texto+=""+chr(228);
end
case -123://à
texto+=""+chr(224);
end
case -122://å
texto+=""+chr(229);
end
case -121://ç
texto+=""+chr(231);
end
case -120://ê
texto+=""+chr(234);
end
case -119://ë
texto+=""+chr(235);
end
case -118://è
texto+=""+chr(232);
end
case -117://ï
texto+=""+chr(239);
end
case -116://î-140
texto+=""+chr(238);
end
case -115://ì
texto+=""+chr(236);
end
case -114://Ä
texto+=""+chr(196);
end
case -113://Å
texto+=""+chr(197);
end
case -112://É
texto+=""+chr(201);
end
case -111://æ
texto+=""+chr(230);
end
case -110://Æ
texto+=""+chr(198);
end
case -109://ô
texto+=""+chr(244);
end
case -108://ö
texto+=""+chr(246);
end
case -107://ò
texto+=""+chr(242);
end
case -106://û-150
texto+=""+chr(251);
end
case -105://ù
texto+=""+chr(249);
end
case -104://ÿ
texto+=""+chr(159);
end
case -103://Ö
texto+=""+chr(215);
end
case -102://Ü
texto+=""+chr(220);
end
case -101://ø
texto+=""+chr(248);
end
case -100://£
texto+=""+chr(163);
end
case -99://Ø
texto+=""+chr(216);
end
case -98://×
texto+=""+chr(214);
end
case -97://ƒ
texto+=""+chr(131);
end
case -96://á-160
texto+=""+chr(225);
end
case -95://í
texto+=""+chr(237);
end
case -94://ó
texto+=""+chr(243);
end
case -93://ú
texto+=""+chr(250);
end
case -92://ñ
texto+=""+chr(241);
end
case -91://Ñ
texto+=""+chr(209);
end
case -90://ª
texto+=""+chr(170);
end
case -89://º
texto+=""+chr(176);
end
case -88://¿
texto+=""+chr(191);
end
case -87://®
texto+=""+chr(174);
end
case -86://¬-170
texto+=""+chr(172);
end
case -85://½
texto+=""+chr(189);
end
case -84://¼
texto+=""+chr(188);
end
case -83://¡
texto+=""+chr(161);
end
case -82://«
texto+=""+chr(171);
end
case -81://»
texto+=""+chr(187);
end
case -80://░
texto+=""+chr(129);
end
case -79://▒
texto+=""+chr(129);
end
case -78://▓
texto+=""+chr(129);
end
case -77://│
texto+=""+chr(124);
end
case -76://┤-180
texto+=""+chr(129);
end
case -75://Á
texto+=""+chr(193);
end
case -74://Â
texto+=""+chr(194);
end
case -73://À
texto+=""+chr(192);
end
case -72://©
texto+=""+chr(169);
end
case -71://╣
texto+=""+chr(129);
end
case -70://║
texto+=""+chr(129);
end
case -69://╗
texto+=""+chr(129);
end
case -68://╝
texto+=""+chr(129);
end
case -67://¢
texto+=""+chr(164);
end
case -66://¥-190
texto+=""+chr(165);
end
case -65://┐
texto+=""+chr(129);
end
case -64://└
texto+=""+chr(129);
end
case -63://┴
texto+=""+chr(129);
end
case -62://┬
texto+=""+chr(129);
end
case -61://├
texto+=""+chr(129);
end
case -60://─
texto+=""+chr(151);
end
case -59://┼
texto+=""+chr(129);
end
case -58://ã
texto+=""+chr(227);
end
case -57://Ã
texto+=""+chr(195);
end
case -56://╚-200
texto+=""+chr(129);
end
case -55://╔
texto+=""+chr(129);
end
case -54://╩
texto+=""+chr(129);
end
case -53://╦
texto+=""+chr(129);
end
case -52://╠
texto+=""+chr(129);
end
case -51://═
texto+=""+chr(129);
end
case -50://╬
texto+=""+chr(129);
end
case -49://¤
texto+=""+chr(164);
end
case -48://ð
texto+=""+chr(240);
end
case -47://Ð
texto+=""+chr(208);
end
case -46://Ê-210
texto+=""+chr(202);
end
case -45://Ë
texto+=""+chr(203);
end
case -44://È
texto+=""+chr(200);
end
case -43://ı
texto+=""+chr(129);
end
case -42://Í
texto+=""+chr(205);
end
case -41://Î
texto+=""+chr(206);
end
case -40://Ï
texto+=""+chr(207);
end
case -39://┘
texto+=""+chr(129);
end
case -38://┌
texto+=""+chr(129);
end
case -37://█
texto+=""+chr(129);
end
case -36://▄-220
texto+=""+chr(129);
end
case -35://¦
texto+=""+chr(166);
end
case -34://Ì
texto+=""+chr(204);
end
case -33://▀
texto+=""+chr(129);
end
case -32://Ó
texto+=""+chr(211);
end
case -31://ß
texto+=""+chr(223);
end
case -30://Ô
texto+=""+chr(212);
end
case -29://Ò
texto+=""+chr(210);
end
case -28://õ
texto+=""+chr(245);
end
case -27://Õ
texto+=""+chr(213);
end
case -26://µ-230
texto+=""+chr(181);
end
case -25://þ
texto+=""+chr(254);
end
case -24://Þ
texto+=""+chr(222);
end
case -23://Ú
texto+=""+chr(218);
end
case -22://Û
texto+=""+chr(219);
end
case -21://Ù
texto+=""+chr(217);
end
case -20://ý
texto+=""+chr(253);
end
case -19://Ý
texto+=""+chr(221);
end
case -18://¯
texto+=""+chr(175);
end
case -17://´
texto+=""+chr(180);
end
case -16://-240
texto+=""+chr(173);
end
case -15://±
texto+=""+chr(177);
end
case -14://‗
texto+=""+chr(129);
end
case -13://¾
texto+=""+chr(191);
end
case -13://¶
texto+=""+chr(129);
end
case -12://§
texto+=""+chr(167);
end
case -11://÷
texto+=""+chr(247);
end
case -10://¸
texto+=""+chr(184);
end
case -9://°
texto+=""+chr(186);
end
case -8://¨
texto+=""+chr(168);
end
case -7://·-250
texto+=""+chr(183);
end
case -6://¹
texto+=""+chr(185);
end
case -5://³
texto+=""+chr(179);
end
case -4://²
texto+=""+chr(178);
end
case -3://■-254
texto+=""+chr(129);
end
case -1:
end
case 21://§
texto+=""+chr(167);
end
default:
texto+=""+chr(text[a]);
end
end
end
return texto;
end
[/code]
carles, eso pasa porque internamente bennugd hace un mapeo de caracteres, no siempre son los caracteres que queres imprimir, hay caracteres que nunca se pueden imprimir, es algo que se arrastra de fenix, y que quiero reveer y corregir.
Solucionado, no sabia que podia usar ttf-s en bennu, gracias keoh, karma :)
Carles, consigas o no que funcione (y espero que si), te doy un karma por el trabajo que te estas pegando :)