Conheça a iniciativa da Biblioteca dos Desenvolvedores
Índice da Biblioteca
Área dos Usuários
Fórum de Discussão
Rotinas do Teclado
O Allegro provê controles tanto para entrada de dados através do teclado quando para o status do teclado. Note que não é possível fazer todas as combinações de teclas possíveis devido o projeto do teclado.
Até duas ou três teclas pressionadas ao mesmo tempo trabalharão bem, mais que isso é provável que as próximas teclas serão ignoradas.
No DOS o allegro requer que o usuário especifique o idioma do teclado porque é impossível obter essa informação do sistema operacional.
Se não for especificado o allegro irá adotar o idioma padrão US.
Primeiramente, assim como todo o dispositivo que o allegro disponibiliza é necessário fazer a instalação. A função responsável pela a instalação do dispositivo teclado é o int install_keyboard().
install_keyboard()
Instala as interrupções allegro para o teclado.
Você deve chamar essa função antes que utilizar ou controlar qualquer entrar pelo teclado. Uma vez instalado você já pode usar as funções de controle do teclado.
Atenção: Em algumas plataformas o teclado não irá responder a menos que vc ajuste a modalidade de gráfico, mesmo se esta função retornar um valor se sucesso antes de chamar o set_gfx_mode. Isso pode ocorrer em ambientes gráficos WINDOWED.
Exemplo:
#include <allegro.h>
int main()
{
allegro_init();
set_color_depth(32);
install_keyboard();
// Nessa parte ainda está 100% garantida a leitura do teclado.
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0) != 0)
allegro_message("Problema com a configuração de video."); // Agora a leitura do teclado esta 100% garantida.
readkey();
allegro_exit();
return 0;
}
END_OF_MAIN();
void remove_keyboard();
Resumidamente o manual do Allegro diz que só devemos usar essa função no caso de utilizarmos uma biblioteca de interrupções do teclado feito por terceiros ou pelo próprio fabricante do teclado.
No caso de utilizarmos o teclado padrão do allegro essa função já está inclusa no allegro_exit(). Portanto, a declaração dessa rotina para quem usa o teclado padrão do allegro torna-se desnecessário.
Essa função retorna o valor do caractere seguido de um buffer de teclado no format ASCII.
Se o buffer estiver vazio espera até que alguma tecla seja pressionada.
Você pode verificar se alguma tecla foi pressionada com a função keypressed().
Exemplos:
Declare a rotina abaixo e siga os exemplos.
int val=0;
val = readkey();
Identifica a tecla pressionada:
if ((val & 0xff) == 'A')
allegro_message("Voce pressionou a tecla 'A'.\n");
if ((val & 0xff) == 'B')
allegro_message("Voce pressionou a tecla 'B'.\n");
...
Verifica se você pressionou algum scanmode.
if ((val >> 8) == KEY_SPACE)
allegro_message("Você pressionou a tecla ESPACO.\n");
if ((val >> 8) == KEY_ENTER)
allegro_message("Você pressionou a tecla ENTER.\n");
...
Verifica se a sequencia Ctrl+C foi pressionada.
if ((val & 0xff) == 3)
allegro_message("Você pressionou a sequencia Control+C.\n");
Verifica se você pressionou ALT+Tecla.
if (val == (KEY_A << 8))
allegro_message("Voce pressionou ALT+A.\n");
if (val == (KEY_B << 8))
allegro_message("Voce pressionou ALT+B.\n");
...
int keypressed();
Retorna verdadeiro se alguma tecla for pressionada.
Exemplo:
if (keypressed())
allegro_message("Tecla Pessionada.");
extern volatile int key_shifts;
Bitmask que contem o estado atual do shift/ctrl/alt, das chaves especiais de Windows e dos caracteres do escape e com acentos. Podemos usar essa função para identificar se a tecla pressionada é maiúscula ou minúscula apenas combinando o shift com alguma outra tecla.
Exemplo:
if (key[KEY_W]) // Tecla Pressionada
{
// Verifica se o shift foi pressionado ao mesmo tempo
if (key_shifts & KB_SHIFT_FLAG)
allegro_message("W - Maiusculo");
else
allegro_message("w - Minusculo");
}
Tabela de FLAGs
Abaixo segue uma tabela para identificação dos flags que poderão ser utilizados com a Bitmask key_shifts.
Conforme mostrados acima no exemplo com o flag KB_SHIFT_FLAG.
A função acima simula um tecla sendo pressionada. No exemplo abaixo vamo simular a seqüência ALT+ESPAÇO, em seguida vamos verificar se foi mesmo pressionada com a função readkey().
Exemplo:
Como simular uma seqüência de teclas?
simulate_keypress(KEY_SPACE << 8);
if (readkey() == (KEY_SPACE << 8))
allegro_message("Voce simulou Alt+Space\n");
Como simular apenas uma tecla?
simulate_keypress(KEY_A);
if (readkey() == (KEY_A))
allegro_message("Voce simulou a tecla A\n");
void clear_keybuf();
Esvazia o buffer do teclado. Quando você quiser se certificar que não exista nada armazenado na variável readkey() antes de uma tecla ser pressionada use essa função.
Exemplo:
int val=0;
clear_keybuf();
val = readkey();
O programa abaixo mostra os valores das variáveis x e y.
O valor muda conforme os comandos abaixo.
Seta para cima: Diminui -1 na variável y; Seta para baixo: Aumenta +1 na variável y; Seta para esquerda: Diminui -1 na variável x; Seta para direita: Aumenta +1 na variável x;
FIM DE CÓDIGO
Note que ao teclar qualquer tecla os valores dos contadores x e y crescem ou diminuem em velocidade de processamento, muito rápido. Para contornar esse problema eu criei uma variável chamada buffer_teclado que vai me ajudar a controlar melhor os contadores. Existem outras formas de solucionar esse problema, essa é apenas uma das soluções.
No exemplo acima controlamos a entrada pelo teclado pela variável buffer_teclado e Ciclo.
Dessa forma o allegro só vai conseguir ler as informações do telcado a cada 50 ciclos de CPU.
Caso você queira aumentar a velocidade dos valores diminua o valor do ciclo.
Caro leitor chegamos ao fim do entendimento das rotinas do teclado.
Se houver alguma dúvida ou dificuldade favor entrar em contato com os membros pelo Forum.