Entrada de Texto no Allegro

Não é de hoje que as pessoas buscam por métodos para fazer entrada de textos no Allegro, que por sua vez, não nos oferece nenhuma opção concreta, apenas algumas funções para entrada de teclas, e indentificação das mesmas.

Há um tempo atrás, eu também precisei disto, então vi que no site da Allegro.cc continha um exmeplo, então adaptei-o para minha necessidade. Muitas pessoas me perguntam como fazer isso, então, hoje só passo a função modificada que fiz desta, e até que ela anda servindo para bastante gente! hehehe

Por isso resolvi postar aqui. Ela ainda está primitiva, com muitos bugs, mas acredito que sirva para muitas coisas, aqui vai ela:

char *getText(int x, int y, BITMAP *buff, int cor)
{
     char    edittext[128];
     BITMAP *fundo = buff;
     BITMAP *buffer = create_bitmap(screen->w, screen->h);

     int     caret  = 0;

     int l = 0;

     memset(edittext, 0, sizeof(edittext));

     while (l == 0)
     {
           clear(buffer);
           draw_sprite(buffer, fundo, 0, 0);
           vline(buffer, ( caret * 8 ) + x, y-2, y+8, cor);
           if(keypressed())
           {
                    int  newkey   = readkey();
                    char ASCII    = newkey & 0xff;
                    char scancode = newkey >> 8;

                    /* a character key was pressed; add it to the string */
                    if(ASCII >= 32 && ASCII <= 126)
                    {
				             if(caret < 128 - 1)
				             {
				    	              edittext[caret] = ASCII;
					                  caret++;
					                  edittext[caret] = '';
                             }
                    }
                    else if(scancode == KEY_BACKSPACE)
                    {
                         if (caret > 0) caret--;
                         edittext[caret] = '';
                    }
                    else if(scancode == KEY_ENTER)
                    {
				         l = 1;
                    }
             }
             textprintf_ex(buffer, font, x, y, cor, -1, "%s", edittext);
             blit(buffer, screen, 0, 0, 0, 0, 320, 240);
      }

      /*destroy_bitmap(buffer);
      destroy_bitmap(fundo);*/

      return edittext;
}

Os parâmetros dela, são respectivamente:
x: posição na coordenada X que vai conter o texto digitado
y: posição na coordenada Y que vai conter o texto digitado
buff: Bitmap de fundo, que vai ser mostrado enquanto você digita
cor: A cor em que vai ser mostrado o texto

Para usá-la, basta criar uma string:

char string[128];
memset(string, 0, sizeof(string));

E então copiar o resultado da função getText para esta string, assim:

strcpy(string, getText(10,10,buffer,0xFFFFFF));

Está simples, mas funciona, né! hehehe

Google Buzz
Compartilhar: Share this post with the world.
  • Twitter
  • Posterous
  • Facebook
  • del.icio.us
  • Digg
  • Friendfeed
  • Google
  • LinkedIn
  • Reddit
  • StumbleUpon
  • Technorati

Posts semelhantes:

  1. Fontes TTF no Allegro
  2. Algumas Implementações de Primitivas com Allegro
  3. MotionBlur com Allegro
  4. Fade In/Out com Allegro
  5. Fade In/Out com fblend no Allegro

5 Comments

  • Rafael
    02/09/2008 - 11:21 | Permalink

    Cara… estou quebrando a cabeça com esse negócio de entrada de texto em Allegro… Estou fazendo um jogo de raciocínio, onde o usuário tem que digitar uma resposta pra uma questão… porém a funçãozinha que eu fiz utiliza o comando Readkey. Só que estou tendo problemas quando jogo essa função dentro do looping principal, pois a readkey pára a execução à espera de uma tecla…

    Mas vou ver o que consigo fazer com esse código seu… espero que dê certo, pois este projeto precisa estar pronto em 1 mês e meio…

    Até breve, por enquanto!!!

  • 02/09/2008 - 13:22 | Permalink

    Olá,

    Essa função também é “bloqueadora”, pára a execução do programa até que seja adicionado um texto, porém você pode implementar o conteúdo da função diretamente no seu Loop principal, aí funciona perfeitamente.

    Qualquer dúvida, só postar! =)

  • Rafael
    05/09/2008 - 21:50 | Permalink

    Na linha 4, o bitmap fundo recebe “buff”. O que seria isso, pois ele não foi declarado e, com isso o código não compila…

  • Rafael
    05/09/2008 - 21:57 | Permalink

    Realmente estou com dificuldades… eu retirei o mouse, coloquei um bitmap no fundo pra não ter que ficar atualizando a tela. Aí fiz uma função utilizando o comando readkey. Porém, ao teclar “Backspace”, o programa não apaga o último caracter… ou seja, as letras vão ficando sobrepostas uma à outra…

    A propósito, tenho interesse em ajudar no Allegro Brasil!!

  • Rafael
    05/09/2008 - 21:58 | Permalink

    heheh já vi de onde vem o buff…

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    *

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>