Hola, llevo algun tiempo pensando un tema, (no se si existira algo que lo haga más fácil), el caso es que cuando aprendi a programar fue con un amstrad en lenguaje basic y era muy fácil dar la posibilidad de escribir con el teclado para por ejemplo responder una pregunta. Ya que bennu es un lenguaje que ahorra trabajo a la hora de manejar gráficos, igual creo que también podría facilitar escribir textos. Un ejemplo:
Para escribir los nombres de los jugadores de tu equipo de fútbol, que exista una función como:
portero=escribir_texto(fuente,x,y,centrado,y lo que sea)
defensa1=escribir_texto(fuente,x,y,centrado,y lo que sea)
...
colocaria un puntero que permitiría al usuario escribir y cuando haya acabado pulsa enter, quedando memorizado y pudiendo escribirlo al disco duro. Creo que se me entiende, que no haya que definir nada de nada, escribes lo de arriba y ya puedes introducir texto sin más complicación.
Recuerdo que en el juego de fútbol que venía con el DIV para escribir los nombres de los jugadores contenía unas cuantas lineas.
No se si lo que digo es posible pero creo que para la mayoría de los programadores sería cómodo una función de ese tipo.
En caso de no poder hacerse creo que otra posibilidad sería que todo el código necesario para hacer esto se podría ofrecer en un pequeño prg para que solo tengamos que copiar y pegar.
ummm... podria hacerse algo asi...
Y digo yo... usando un write_string (http://wiki.bennugd.org/index.php?title=Write_string) no te sirve??? solo tienes que cambiar una variable que sea de tipo string:
Program test;
Private
string nombre;
Begin
write_string(0,0,0,0,&nombre);
Repeat
If (ascii > 64 AND ascii < 91) // A-> 65. Z->90. MAYUSCULAS
nombre+=chr(ascii);
End
If (ascii > 96 AND ascii < 123) // a-> 97. z-> 122. minusculas
nombre+=chr(ascii);
End
If (ascii == 8) // Tecla de Borrado
nombre=substr(nombre,0,len(nombre)-1);
End
While (ascii <> 0) Frame; End
Frame;
Until (key(_enter))
End
Ya ves que en poco mas de dos líneas está hecho. Ahora que si no es lo que buscas, ese es otro tema y no lo entendí.
OK lo intente probar, pero me da error:unknown identifier full-screen, esto por qué puede ser?
;D Bien, ya lo hice funcionar veo que no es tan difícil; aún así mi consulta sería si se puede hacer aún más sencillo, es decir, te ahorras:
If (ascii > 64 AND ascii < 91) // A-> 65. Z->90. MAYUSCULAS
nombre+=chr(ascii);
End
If (ascii > 96 AND ascii < 123) // a-> 97. z-> 122. minusculas
nombre+=chr(ascii);
End
If (ascii == 8) // Tecla de Borrado
nombre=substr(nombre,0,len(nombre)-1);
y además ya iría incluido puntos, comas, parentesis... y todo lo necesario.
Y lo más importante no es eso, es que sería más fácil de aprender sobretodo para un novato ( y para los vaguetes como yo xD). Todo hay que decirlo, que visto como tú lo planteas tampoco se hecha tan en falta la función que yo propongo.
funciona muy bien tyco, si se pone en una función y se le añaden dos cositas más, tendremos algo muy interesante a compartir con la comunidad.
Juer, y pensar que este código parecía sencillo:
char letra;
string dato_a_devolver;
(...)
loop
letra=ascii;
switch (letra)
case 13: break; end //intro
case 9: //creo que era borrar
dato_a_devolver=substr(dato_a_devolver,0,-1);
end
case 1: end //caracter/es no válido/s, yo lo ignoro, tu puedes meter un error.
//todos los cases especiales que quieras
default: dato_a_devolver+=letra; end //una letra nueva, incluye caracteres acentuados, números, mayusculas, minúsculas...
frame;
end //loop
return(dato_a_devolver);
Yo lo he usado siempre con resultados muy satisfactorios (salvo el return, que con los "problemas" por devolver sólo ints, terminaba poniendo la string en plan global o parámetro por referencia). Otra cosa es querer poner el cursor en medio y todo eso, que ya es más dificil.
borrar es 8, 9 es tab...
gracias Drumpi por tu idea. He estado buscando la función write_string en una ayuda de div2 y veo que no está, supongo que será una función de original de fenix. He visto que la bennu wiki es una ayuda muy maja que está en internet, pero donde yo estoy programando no tengo internet, existe alguna ayuda más o menos actualizada que defina todas las funciones y que no sea a través de internet?
Si que existe... tenes que incluir el "mod_text"...
hay una utilidad llamada moddesc... que sirve para ver que tiene cada modulo...
saludos.
también existe la del flamebird, es una ayuda en español, media actualizada, pero que describe las funciones muy ampliamente. write_string es nueva, no estaba en el div, tampoco write_var :)
aquí hay otra sugerencia
function escanea_teclado(fuente,x,y,alin)
private
string mi_texto;
contador=0, contador1;
car_act;
mitexto_string;
begin
mitexto_string=write_string(fuente,x,y,alin,&mi_texto);
while (not key(_enter))
if (ascii<>0 or key(_backspace))
if (car_act==true)
substr(mi_texto,0,len(mi_texto)-1);
car_act=false;
if (key(_backspace)) //no recuerdo si así se llama, disculpen
mi_texto=substr(mi_texto,0,len(mi_texto)-1);
elseif ((ascii > 64 AND ascii < 91) or (ascii > 96 AND ascii < 123))
mi_texto+=ascii;
end
end
if (contador>15 & cont_act==true)
substr(mi_texto,0,len(mi_texto)-1);
car_act=false;
end
if (contador>30) contador=0; mi_texto+="_"; car_act=true;
end
frame;
end
end
return(mi_texto);
delete_text(mitexto_string);
end
no lo he probado si funciona, quizá algunos end o algo así, pero este es un código que escribe un texto hasta finalizar con enter. he usado un código similar para mis editores, pero este lo he escrito aquí, por lo tanto no está probado je je je
Buscando por internet he encontrado algo de información sobre el lenguaje clásico basic de commodore 64. El equivalente (salvando las diferencias xD) a los textos de arriba sería algo así:
10 INPUT "nombre del portero:"; NN$
20 end
Imprime en pantalla la pregunta, coloca un puntero para escribir y al pulsar enter memoriza la respuesta en la variable NN
Si alguien lo quiere comprobar puede bajarse el emulador de commodore de: http://www.ccs64.com/, copia el texto (importante pulsar ENTER tras escibir cada linea) y abajo escribe RUN, y pulsa ENTER para ejecutar. Que recuerdos me trae!
no es solo de comodore, en todo basic esta esa funcion.
Doy fe de que mi Amstrad CPC464 lo hacía, lo he consultado en el manual de usuario.
Es un poco raro que el "manual de usuario" sea un curso de programación, incluso en los últimos temas te enseñan a hacer un rompe-ladrillos sencillo. Si, aun conservo los libros, aunque no conserve aquel PC que tantos buenos ratos me hizo pasar (snif).
Una cosa que nunca comprendí: si en aquella época todos los PCs usaban basic ¿por qué eran incompatibles? ¿Es que los programas se guardaban en binario, y no coincidían instrucciones con los comandos? porque siempre que había un error se podía leer el código fuente tal y como fue programado. En aquella época distinguir un lenguaje de alto nivel y ensamblador no parecía fácil :P
algunos guardaban programas en texto, otros en una mezcla de texto y binarios... pero mas alla de eso los basic tenian sus particularidades, algunos mas funciones que otros, o algunas diferentes para tratar ciertas cosas...
mas alla de eso, no todo era basic, habia tambien mucho asm... los juegos comerciales eran en asm... solo la parte del arranque era en basic... pocas lineas... y los bloques en asm, eran binarios, mas bien era codigo de maquina.
y te aseguro que si se podia facilmente asm y lenguaje de alto nivel... pero seguro la ignorancia de muchos al respecto de la programacion en asm y basic les hacia dificil hacer la distincion...
yo tengo los manuales de mis tk85 y tk90 (version brasilera de zx1500 y zx2000), incluso tengo las maquinas, pero ya no funcionan.
y llamar pc a un cpc464 es demasiado generoso...
aca te dejo un regalito...
http://www.youtube.com/watch?v=OvChkOHgDIo
http://www.youtube.com/watch?v=y2EqX3rpJ6M&feature=related
Quote from: SplinterGU on April 07, 2009, 10:53:18 PM
y llamar pc a un cpc464 es demasiado generoso...
aca te dejo un regalito...
http://www.youtube.com/watch?v=OvChkOHgDIo
http://www.youtube.com/watch?v=y2EqX3rpJ6M&feature=related
Bueno, teniendo en cuenta que fue lo más parecido que había en la época a un ordenador, y que me duró hasta prácticamente el 96 (y porque me obligaron a tirarlo, porque funcionaba como el primer día).
Juer, de los 100 juegos, habré jugado a diez, pero sólo tuve dos ¿y los clásicos de Amsoft como el "oh! mummy!" o el "plaga galáctica"? ¿Y juegazos como "Indiana jones y la última cruzada", "Hydra", "Batman" en isométrica...? ....... ¿Y de dónde salen tantos juegos de kárate y ninjas? :D
Y una cosa más: yo tenía el mítico monitor de fósforo, de pantalla verde.
Bueno, lo dejo, que me aparto del hilo de la discusión y se me va a saltar la lagrimita y voy a terminar por instalar el emulador en la gp2x :P
El Amstrad si tiene esas funciones, de hecho como ya dije yo lo aprendi en un Amstrad. Recuerdo que yo jugué a ese rompe-ladrillos que comentas, sencillito pero divertido, jeje
Saludos
mi codigo anterior funcionando, :)
[code language="bennu"]private
string mitexto;
begin
set_mode(800,600,32);
escanea_teclado(0,400,300,4,&mitexto);
write(0,200,300,4,mitexto);
while (not key (_esc))
frame;
end
end
function escanea_teclado(fuente,x,y,alin,string * mi_texto)
private
contador=0, contador1;
car_act;
mitexto_string;
press;
begin
mitexto_string=write_var(fuente,x,y,alin,mi_texto[0]);
while (not key(_enter))
if (ascii<>0 or key(_backspace) or key(_space))
if (press ==false)
if (car_act==true)
mi_texto[0]=substr(mi_texto[0],0,len(mi_texto[0])-1);
car_act=false;
end
if (key(_backspace)) //no recuerdo si así se llama, disculpen
mi_texto[0]=substr(mi_texto,0,len(mi_texto[0])-1);
elseif ((ascii > 64 AND ascii < 91) or (ascii > 96 AND ascii < 123))
mi_texto[0]+=chr(ascii);
elseif (key(_space))
mi_texto[0]+=" ";
end
press=true;
end
else
press=false;
end
contador++;
if (contador>30 & car_act==true)
mi_texto[0]=substr(mi_texto[0],0,len(mi_texto[0])-1);
car_act=false;
contador=0;
end
if (contador>15 & car_act==false) mi_texto[0]+="_"; car_act=true;
end
frame;
end
if (car_act==true)
mi_texto[0]=substr(mi_texto[0],0,len(mi_texto[0])-1);
end
delete_text(mitexto_string);
end
[/code]