05 Rutinas de teclado

El controlador de teclado de Allegro proporciona entrada con b�ffer y un conjunto de variables que guardan el estado actual de cada tecla. F�jese que no es posible detectar correctamente todas y cada una de las combinaciones de teclas, debido al dise�o del teclado del PC. Combinaciones de dos o tres teclas funcionar�n bien, pero si presiona m�s, probablemente las extras ser�n ignoradas (exactamente qu� combinaciones son posibles parecen variar de un teclado a otro).


int install_keyboard();
Instala el controlador de interrupciones de teclado de Allegro. Debe llamarla antes de usar cualquier otra funci�n de teclado. Una vez instalado el controlador no podr� usar las llamadas a sistema o las funciones de librer�a de C para acceder al teclado. Devuelve cero con �xito, o un n�mero negativo si hubo problemas (pero puede decidir si quiere verificar el valor de retorno dado que es muy poco probable que esta funci�n falle). Tenga en cuenta que en algunas plataformas el teclado no funcionar� a no ser que haya activado un modo gr�fico, incluso si esta funci�n devuelve cero antes de haber llamado a set_gfx_mode.

Relacionado con: keyboard_callback, keyboard_ucallback, keyboard_lowlevel_callback, remove_keyboard, poll_keyboard, key, keypressed, readkey, ureadkey, set_gfx_mode, Variables de configuraci�n est�ndar, three_finger_flag, key_led_flag, set_leds, set_keyboard_rate.
void remove_keyboard();
Desintala el controlador de teclado, devolviendo el control al sistema operativo. Normalmente no necesita llamar a esta funci�n, porque allegro_exit() lo har� por usted.
Relacionado con: install_keyboard, allegro_exit.
void install_keyboard_hooks(int (*keypressed)(), int (*readkey)());
S�lo deber�a usar esta funcion si *no* va a usar el resto del controlador de teclado. Debe ser llamada en vez de install_keyboar(), y le deja proporcionar rutinas de atenci�n para detectar y leer pulsaciones de teclado, que ser�n usadas por las funciones principales keypressed() y readkey(). Esto puede ser �til si quiere usar el c�digo GUI de Allegro con un controlador de teclado propio, ya que permite al GUI acceder a la entrada de teclado desde su c�digo, salt�ndose el sistema de entrada normal de Allegro.
Relacionado con: install_keyboard, keypressed, readkey.
int poll_keyboard();
Siempre que sea posible Allegro intentar� leer del teclado as�ncronamente (por ejemplo deste un controlador de interrupci�n), pero en algunas plataformas puede que no sea posible, en cuyo caso deber� llamar a esta rutina a intervalos regulares para actualizar las variables de estado del teclado. Para ayudarle a comprobar su c�digo que muestrea el teclado incluso si est� programando en una plataforma que no lo necesita, despu�s de la primera llamada Allegro cambiar� a modo encuesta, as�, en adelante, tendr� que llamar a esta rutina para obtener la entrada de teclado, sin importar si el driver actual necesita ser le�do o no. La funciones keypressed(), readkey() y ureadkey() llaman a poll_keyboard() autom�ticamente, as� que s�lo tendra que usar esta funci�n cuando acceda al array key[] y a la variable key_shifts. Devuelve cero con �xito, o un n�mero negativo si hubo alg�n problema (ej: no hay driver de teclado instalado).
Relacionado con: keyboard_needs_poll, install_keyboard, key, key_shifts.
int keyboard_needs_poll();
Devuelve TRUE si el controlador actual de teclado est� trabajando en modo muestreo.
Relacionado con: poll_keyboard, install_keyboard, key.
extern volatile char key[KEY_MAX];
Array de enteros que indica el estado de cada tecla, ordenado por scancode. Siempre que sea posible se actualizar�n estos valores de forma as�ncrona, pero si keyboard_needs_poll() devuelve TRUE, deber� llamar manualmente a poll_keyboard() para actualizarlos con el estado actual. Los scancodes est�n definidos en allegro/keyboard.h como una serie de constantes KEY_* (abajo tiene un listado). Por ejemplo, podr�a escribir:
      if (key[KEY_SPACE])
         printf("La barra espaciadora est� siendo pulsada\n");

Tenga en cuenta que se supone que el array representa qu� teclas est�n f�sicamente apretadas y cuales n�, por lo que sem�nticamente s�lo es de lectura.

Estos son los scancodes del teclado:

      KEY_A ... KEY_Z,
      KEY_0 ... KEY_9,
      KEY_0_PAD ... KEY_9_PAD,
      KEY_F1 ... KEY_F12,

      KEY_ESC, KEY_TILDE, KEY_MINUS, KEY_EQUALS,
      KEY_BACKSPACE, KEY_TAB, KEY_OPENBRACE, KEY_CLOSEBRACE,
      KEY_ENTER, KEY_COLON, KEY_QUOTE, KEY_BACKSLASH,
      KEY_BACKSLASH2, KEY_COMMA, KEY_STOP, KEY_SLASH,
      KEY_SPACE,

      KEY_INSERT, KEY_DEL, KEY_HOME, KEY_END, KEY_PGUP,
      KEY_PGDN, KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN,

      KEY_SLASH_PAD, KEY_ASTERISK, KEY_MINUS_PAD,
      KEY_PLUS_PAD, KEY_DEL_PAD, KEY_ENTER_PAD,

      KEY_PRTSCR, KEY_PAUSE,

      KEY_ABNT_C1, KEY_YEN, KEY_KANA, KEY_CONVERT, KEY_NOCONVERT,
      KEY_AT, KEY_CIRCUMFLEX, KEY_COLON2, KEY_KANJI,

      KEY_LSHIFT, KEY_RSHIFT,
      KEY_LCONTROL, KEY_RCONTROL,
      KEY_ALT, KEY_ALTGR,
      KEY_LWIN, KEY_RWIN, KEY_MENU,
      KEY_SCRLOCK, KEY_NUMLOCK, KEY_CAPSLOCK
Relacionado con: install_keyboard, poll_keyboard, key_shifts.
extern volatile int key_shifts;
M�scara de bits que contienen el estado actual de shift/ctrl/alt, de las teclas especiales de Windows y los car�cteres de escape de los acentos. Siempre que sea posible se actualizar�n estos valores de forma as�ncrona, pero si keyboard_needs_poll() devuelve TRUE, deber� llamar manualmente a poll_keyboard() para actualizarlos con el estado actual. Puede contener cualquiera de los bits:
      KB_SHIFT_FLAG
      KB_CTRL_FLAG
      KB_ALT_FLAG
      KB_LWIN_FLAG
      KB_RWIN_FLAG
      KB_MENU_FLAG
      KB_SCROLOCK_FLAG
      KB_NUMLOCK_FLAG
      KB_CAPSLOCK_FLAG
      KB_INALTSEQ_FLAG
      KB_ACCENT1_FLAG
      KB_ACCENT2_FLAG
      KB_ACCENT3_FLAG
      KB_ACCENT4_FLAG
Relacionado con: install_keyboard, poll_keyboard, key.
int keypressed();
Devuelve TRUE si hay teclas esperando en el buffer de entrada. Esto es equivalente a la funci�n kbhit() de la biblioteca libc.
Relacionado con: install_keyboard, readkey, clear_keybuf, simulate_keypress.
int readkey();
Devuelve el siguiente caracter del b�ffer de teclado en formato ASCII. Si el b�ffer est� vac�o espera hasta que se apriete una tecla. El byte de menos peso del valor de retorno contiene el c�digo ASCII de la tecla, y el byte de mayor peso el scancode. El scancode sigue siendo el mismo a pesar del estado de las teclas shift, ctrl y alt, mientras que al c�digo ASCII s� que le afecta la pulsaci�n de shift y ctrl de la manera normal (shift cambia a may�sculas, ctrl+letra da la posici�n de la tecla en el alfabeto, ej: ctrl+A = 1, ctrl+B = 2, etc). Apretando alt+key se devuelve s�lo el scancode, con el c�digo ASCII cero en el byte de menor peso. Por ejemplo:
      if ((readkey() & 0xff) == 'd')            // por c�digo ASCII
         printf("Has pulsado 'd'\n");

      if ((readkey() >> 8) == KEY_SPACE)    // por c�digo scancode
         printf("Has pulsado Espacio\n");

      if ((readkey() & 0xff) == 3)              // ctrl+letter
         printf("Has pulsado Control+C\n");

      if (readkey() == (KEY_X << 8))        // alt+letter
         printf("Has pulsado Alt+X\n");
Esta funci�n no puede devolver car�cteres mayores que 255. Si necesita leer entradas Unicode use ureadkey() en vez de readkey()
Relacionado con: install_keyboard, ureadkey, keypressed, clear_keybuf, simulate_keypress.
int ureadkey(int *scancode);
Devuelve el siguiente caracter del b�ffer de teclado en formato Unicode. Si el b�ffer est� vac�o se espera hasta que se presione una tecla. El valor de retorno contiene el valor Unicode de la tecla, y si no es NULL, en el argumento se iniciar� con el scancode. Al contrario que readkey() esta funci�n es capaz de devolver car�cteres mayores que 255.
Relacionado con: install_keyboard, readkey, keypressed, clear_keybuf, simulate_ukeypress.
int scancode_to_ascii(int scancode);
Convierte el scancode dado a un caracter ASCII para esa tecla, devolviendo el resultado de apretar esa tecla sin shift ni capslock, o cero si la tecla no es un caracter generable o no se puede ser traducido.


void simulate_keypress(int key);
Introduce una tecla en el buffer del teclado, como si el usuario la hubiese pulsado. El par�metro est� el mismo formato que el devuelto por readkey().

Relacionado con: install_keyboard, simulate_ukeypress, keypressed, readkey.
void simulate_ukeypress(int key, int scancode);
Introduce una tecla en el b�ffer de teclado, como si el usuario la hubiese pulsado. El par�metro est� en el mismo formato devuelto por ureadkey()
Relacionado con: install_keyboard, simulate_keypress, keypressed, ureadkey.
extern int (*keyboard_callback)(int key);
Si se activa, esta funci�n es ser� llamada por el controlador del teclado en respuesta a cualquier tecla. Se le pasar� una copia del valor que se va a a�adir al buffer de entrada, y la funci�n puede devolver este valor sin modificar, devolver cero para que la tecla sea ignorada, o devolver un valor modificado que cambiar� lo que readkey() va a devolver despu�s. Esta rutina se ejecuta en contexto de interrupci�n, por lo que debe estar bloqueada (locked) en memoria.
Relacionado con: install_keyboard, readkey, ureadkey, keyboard_ucallback, keyboard_lowlevel_callback.
extern int (*keyboard_ucallback)(int key, int *scancode);
Versi�n Unicode de keyboard_callback(). Si se activa, esta funci�n es llamada por el controlador de teclado en respuesta a cualquier pulsaci�n de tecla. Se le pasa el valor del caracter y el scancode que ser�n a�adidos al b�ffer de entrada, puede modificar el valor del scancode, y devuelve un c�digo de tecla nuevo o modificado. Si cambia el scancode a cero y devuelve un cero la tecla ser� ignorada. Esta rutina se ejecuta en un contexto de interrupci�n, por lo que debe ser bloqueada (locked) en memoria.
Relacionado con: install_keyboard, readkey, ureadkey, keyboard_callback, keyboard_lowlevel_callback.
extern void (*keyboard_lowlevel_callback)(int scancode);
Si se, activa esta funci�n es llamada por el controlador de teclado en respuesta a cada evento de teclado, tanto cuando se pulsa como cuando se suelta. Se le pasar� un byte de scancode puro, con el bit de m�s peso desactivado si la tecla ha sido pulsada o activado si ha sido soltada. Esta rutina se ejecuta en un contexto de interrupci�n, as� que debe estar bloqueada (locked) en memoria.
Relacionado con: install_keyboard, keyboard_callback, keyboard_ucallback.
void set_leds(int leds);
Modifica el estado de los indicadores LED del teclado. El par�metro es una m�scara de bits conteniendo cualquiera de los valores KB_SCROLOCK_FLAG, KB_NUMLOCK_FLAG, y KB_CAPSLOCK_FLAG, o -1 para recuperar el comportamiento normal.
Relacionado con: install_keyboard, key_led_flag.
void set_keyboard_rate(int delay, int repeat);
Inicializa la frecuendia de repetici�n del teclado. Los tiempos se dan en milisegundos. Pasar cero desactivar� la repetici�n de teclas.
Relacionado con: install_keyboard, readkey, ureadkey.
void clear_keybuf();
Limpia el b�ffer de teclado.
Relacionado con: install_keyboard, keypressed, readkey, ureadkey.
extern int three_finger_flag;
El controlador de teclado de djgpp proporciona una secuencia de 'salida de emergencia' que puede usar para salir de su programa. Si est� ejecutando bajo DOS ser� la combinaci�n ctrl+alt+del. La mayor�a de SSOO multitarea capturar�n esta combinaci�n antes de que llegue al controlador de Allegro, en cuyo caso puede usar la combinaci�n alternativa ctrl+alt+fin. Si quiere desactivar este comportamiento en su programa ajuste esta variable a FALSE.
Relacionado con: install_keyboard.
extern int key_led_flag;
Por defecto las teclas BloqMay�s, BloqNum y BloqDesp activan los LEDS del teclado cuando son presionadas. Si las quiere utilizar en su juego (Ej. BloqMay�s para disparar) este comportamiento no es deseable, por lo que puede poner a cero esta variable para evitar que los LEDS sean actualizados.
Relacionado con: install_keyboard, set_leds.

Volver al Indice