Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Patonsky1 on November 25, 2009, 01:35:24 AM

Title: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 25, 2009, 01:35:24 AM
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.
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: osk on November 25, 2009, 02:13:17 AM
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).
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 25, 2009, 04:18:55 AM
¿Me pasas un link al manual? xD

Y gracias! xD
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: SplinterGU on November 25, 2009, 11:52:52 AM
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.
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Windgate on November 25, 2009, 01:22:20 PM
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 :-*
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: panreyes on November 25, 2009, 01:40:04 PM
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]
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 25, 2009, 06:19:59 PM
que MOD necesito para manejar cosas como el SCAN_CODE, el ascii, y demas posibles funciones de input? xd

(ojo, en modo consola >_<)
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 25, 2009, 06:35:03 PM
[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
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: panreyes on November 25, 2009, 06:54:06 PM
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]
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Prg on November 25, 2009, 10:20:34 PM
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]
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: SplinterGU on November 25, 2009, 11:06:37 PM
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...
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 25, 2009, 11:59:01 PM
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
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Drumpi on November 26, 2009, 12:20:05 AM
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
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 26, 2009, 01:07:28 AM
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
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: SplinterGU on November 26, 2009, 04:57:35 AM
puedes usar CHAR[], o crear una string y pasarla a bennu por diferentes formas...
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 27, 2009, 04:26:37 PM
¿Qué tal funcionaría Bennu si fuera en un proceso y C en otro proceso? (con la función de linux fork(), por ejemplo)
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: SplinterGU on November 27, 2009, 11:43:22 PM
no te entendi nada que quisiste escribir...
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Windgate on November 28, 2009, 04:57:16 AM
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 :-\
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: SplinterGU on November 28, 2009, 05:35:46 AM
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...
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 30, 2009, 02:21:53 AM
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... :-/
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: osk on November 30, 2009, 04:00:39 PM
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).
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Patonsky1 on November 30, 2009, 05:56:12 PM
oooooooOoOoOOOOOOoOOoOOooh

Si algún día hacemos convención de programadores bennu, recuérdame que te debo un favor sexual (o dos xD)
Title: Re: I/O de consola funcionando en Bennu embebido en C
Post by: Windgate on November 30, 2009, 07:57:27 PM
lol, no sabía que estaba en tu manual Osk, sorprendente :o