Necesito hacer una aplicación en C en la cual necesitaré scripts Bennu que escriban en pantalla, y recojan strings.
Aparte... ¿Hay alguna funcion de recogida de caracteres que se comporte como getch() de conio o similar (o alguna manera de crear el efecto, vaya)?
Saludos.
Existe la variable SCAN_CODE, que vale el valor de la tecla que se ha pulsado por última vez... Y la variable ASCII, ídem pero para el valor ascii...A partir de ahí te puedes hacer una rutinilla (por el foro hay algún ejemplo, en mi manualillo también, apartado "trabajar con teclado") que tenga un switch que mire qué tecla/letra se ha recibido para hacer lo que sea con ella (descartarla, imprimirla, etc).
¿Me pasas un link al manual? xD
Y gracias! xD
solo sirve para aplicaciones con eventos de teclado (entiendase video=SDL)
tenes que hacerte tu propio modulo, pero si vas a hacer algo embebido, eso te sera simple.
Para lectura de cadenas tengo por ahí un módulo que se encarga de ello, lo hice a partir de trocitos que había por el foro y le metí algo más, se puede escribir, borrar, vamos... Normal
Si lo necesita pide por esa boquita :-*
No sé de dónde la saqué, es de la época Div :)
[code language="bennu"]
Function string input();
Private
char prompt="_";
inputtext;
string texto;
Begin
let_me_alone();
delete_text(all_text);
Loop
If(scan_code==_backspace) scan_code=0; texto=substr(texto, 0, -1); End
If(scan_code==_enter) return texto; End
If(ascii>=32) //con esto controlo que no me metan caracteres raros
texto+=chr(ascii) ;
scan_code=0;
End
if(i<20)
inputText=write(0, x, y, 0, texto + prompt);
else
inputText=write(0, x, y, 0, texto);
end
Frame;
delete_text(inputText) ;
End
End
[/code]
que MOD necesito para manejar cosas como el SCAN_CODE, el ascii, y demas posibles funciones de input? xd
(ojo, en modo consola >_<)
[code language="bennu"]PROCESS pluginMain()
BEGIN
LOOP
IF (key(_A))
say("Hola!");
FRAME;
BREAK;
END
END
return 0;
END[/code]
No me funciona, se me queda en un continuo estado de espera xd
Seguramente no hace falta el frame ahí, pero lo puse por precaución xD
El frame te hará falta si no quieres que se te bloquee el programa.
Pruébalo así a ver
[code language="bennu"]PROCESS pluginMain()
BEGIN
LOOP
IF (key(_A))
say("Hola!");
BREAK;
END
FRAME;
END
END
[/code]
yo tenía un ejemplo, le acabo de corregir algunos bugs, te lo dejo aquí :)
puedes ponerle un gráfico a la función para que la pantalla no se vea como la consola de windows.
la función escanea_teclado esta lista para que la uses si te gusta, o para que la modifiques a tu gusto. un saludo
[code language="bennu"]import "mod_say";
import "mod_wm";
import "mod_key";
import "mod_mem";
import "mod_proc";
import "mod_dir";
import "mod_math";
import "mod_grproc";
import "mod_video";
import "mod_map";
import "mod_string";
import "mod_rand";
import "mod_file";
import "mod_regex";
import "mod_text";
import "mod_draw";
import "mod_sound";
import "mod_sys";
private
string mitexto;
begin
set_mode(800,600,32);
write(0,400,200,4,"presiona enter para terminar de recibir el texto");
escanea_teclado(0,200,300,0,&mitexto,0);
delete_text(all_text);
write(0,400,200,4,"recibimos lo que la función nos retorna y escribimos en 200,300 el texto");
write(0,200,300,4,mitexto);
while (not key (_esc))
frame;
end
end
//alin=alineación del texto en pantalla, los parámetros son los mismos de write
//mi texto es un puntero a string donde almacenar la cadena
//gr es un gráfico del file 0 que la función usará en pantalla, 0 si no se quiere gráfico alguno
function escanea_teclado(int fuente_int,x,y,alin,string * mi_texto,int gr)
private
contador=0, contador1;
car_act;
mitexto_string;
press;
string trabajo;
int pos,possel;
begin
z=-206;
graph=gr;
mitexto_string=write_var(fuente_int,x,y,alin,trabajo);
trabajo=mi_texto[0];
pos=len(mi_texto[0]);
while (not key(_enter))
if (ascii<>0 or key(_backspace) or key(_space) or key(_del))
if (press ==false)
if (key(_backspace)or key(_del))
if (pos>0)
while (key(_backspace))
if (pos<>0)
mi_texto[0]=substr(mi_texto[0],0,pos-1)+substr(mi_texto[0],pos,len(mi_texto[0]));
end
pos--;
trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
frame(300);
end
end
if (pos<len(*mi_texto))
while (key(_del))
mi_texto[0]=substr(mi_texto[0],0,pos)+substr(mi_texto[0],pos+1,len(mi_texto[0]));
trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos+1,len(mi_texto[0]));
frame(300);
end
end
elseif (ascii > 32 AND ascii < 126)
mi_texto[0]=substr(mi_texto[0],0,pos)+chr(ascii)+substr(mi_texto[0],pos,len(mi_texto[0]));
pos++;
//len(mi_texto[0])-1
elseif (key(_space))
mi_texto[0]=substr(mi_texto[0],0,pos)+" "+substr(mi_texto[0],pos,len(mi_texto[0]));
pos++;
end
press=true;
ascii=0;
end
else
press=false;
end
contador++;
trabajo=mi_texto[0];
if (contador>15)
car_act=true;
if (car_act==true)
trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
end
else
car_act=false;
end
if (contador>30)
contador=0;
end
while (key(_left)or key(_right))
trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
if (key(_left) & pos>0) pos--; frame(300); end
if (key(_right) & pos<len(mi_texto[0])) pos++; frame(300); end
frame;
end
if (key(_end) ) pos=len(mi_texto[0]); end
if (key(_home) ) pos=0; end
frame;
end
delete_text(mitexto_string);
while (key(_enter)) frame; end
end
[/code]
ya lo dije, no se pueden hacer cosas que corran en varios frames... en modo embebido, el proceso corre un solo frame... toda la logica que este codificada para 1 solo frame...
En este modo no hay ningun manejador de eventos (teclados, window, render, etc).
Por favor, lean...
Joder...
¿Y de qué manera puedo hacer una input desde C y pasarla a bennu sin parámetros? ¿Si utilizo punteros declarados en C y paso la dirección de memoria a bennu funcionará igual? ¿Bennu leerá el tipo de dato String de C++? xD
Juer, que complicado: en C tienes CIN para leer datos (al menos es lo que yo usaba).
Si no quieres usar parámetros (que son fáciles de usar, en serio, creo que tegno un ejemplo por aqui si lo quieres) puedes usar ficheros.
Y creo que sockets.
¿Bennu aun no tiene soporte para lectura de PIPEs y FIFOs, verdad? ni para lectura de ficheros de dispositivo, sería interesante leer del USB en serie o de algún HW de forma directa, sólo por curiosidad ^^U
Lo de cin ya lo sabía xd
Sé que los parámetros son faciles de usar, pero si quiero compartir datos casi prefiero punteros...
Con que C pueda acceder a las direcciones de memoria de bennu y viceversa, sobra xd
puedes usar CHAR[], o crear una string y pasarla a bennu por diferentes formas...
¿Qué tal funcionaría Bennu si fuera en un proceso y C en otro proceso? (con la función de linux fork(), por ejemplo)
no te entendi nada que quisiste escribir...
Uf, comprendo las dudas de Patonski... Aunque me prima investigar otros aspectos de Bennu yo también tengo dudas similares a las que ha preguntado:
Si se pudiese hacer un fork con código Bennu ejecutando, si se pudiese tener FRAME en Bennu embebido... De acuerdo que ya se ha hablado de algunas de esas cosas, pero el sencillo ejemplo de las DCTools de DCelso fue grandioso y mi amigo Grisendo ha construido su módulo de Visión por Computador gracias a él. Estoy seguro de que las inquietudes de Patonsky se saciarían con algún ejemplo sencillo de las posibilidades de Bennu embebido... Si de verdad podemos hacer "magia" con ese aspecto o no...
Y es que el potencial de Bennu embebido suena muy muy bien, pero lo que permite y no permite hacer es un misterio para muchos, por desgracia para nosotros :-\
no es que no se pueda ejecutar FRAME, la cosa es que al ejecutar un FRAME se sale del motor... entonces eso hay que manejarlo desde el programa en C que manejemos nosotros, como lo mismo cualquier manejador de eventos...
el bgdi no es mas que esto, un ejemplo claro del uso de bennu como embebido...
Hace falta una documentacińo, aunque sea muy simple, sobre lo que se puede, lo que no se puede hacer en bennu embebido, y algunas de las funciones C necesarias... :-/
Si lo que buscas es algo muy simple, tan simple como un par de páginas, puedes ver el apartado correspondiente de mi manualillo (p.532).
oooooooOoOoOOOOOOoOOoOOooh
Si algún día hacemos convención de programadores bennu, recuérdame que te debo un favor sexual (o dos xD)
lol, no sabía que estaba en tu manual Osk, sorprendente :o