Si quiere detectar múltiples presiones de teclas a la vez, las rutinas de teclado de la BIOS son inútiles. Allegro puede reemplazarlas con su propio controlador de teclado, que incluye un sistema de entrada con buffer y un conjunto de biestables que almacenan el estado de cada tecla. Tenga en cuenta que no es posible detectar correctamente cualquier combinación de teclas debido al diseño del teclado del PC. Hasta dos o tres teclas a la vez funcionarán bien, pero si pulsa más de esas, las extras probablemente serán ignoradas (la combinación exacta de teclas pulsadas varía de un teclado a otro).
int install_keyboard();
Instala el controlador de interrupciones del teclado de Allegro. Debe
llamar esto antes de cualquier otra función de teclado. Una vez instalado
el controlador de Allegro, no podrá usar las llamadas del DOS/BIOS o de
la biblioteca C para acceder al teclado.
void remove_keyboard();
Desinstala el controlador de teclado devolviendo el control a la BIOS.
Normalmente no necesita llamar esta función, porque allegro_exit() lo
hará por usted.
void install_keyboard_hooks(int (*keypressed)(), int (*readkey)());
Sólo debería usar esta función si *no* va a usar el resto del controlador
de teclado. Debe ser llamada en vez de install_keyboard(), y le deja usar
rutinas callback para detectar y leer pulsaciones de teclado, que pueden
ser usadas por las funciones principales keypressed() y readkey(). Esto
puede ser útil si quiere usar el código GUI de Allegro junto con un
controlador de teclado propio, ya que permite al GUI acceder a la entrada
de teclado desde su código. Si quiere usar las rutinas de teclado de la
BIOS, la función _bios_keybrd(_KEYBRD_READ) devuelve pulsaciones de
teclado en el formato correcto.
extern volatile char key[128];
Array de biestables indicando el estado de cada tecla, ordenadas por
scancodes. Los scancodes están definidos en allegro.h como una serie de
constantes KEY_*. Por ejemplo podrías escribir:
if (key[KEY_SPACE]) printf("La barra espaciadora está siendo pulsada\n");Cada uno de estos valores es realmente un campo de bits conteniendo uno o ambos biestables KB_NORMAL y KB_EXTENDED, permitiéndole determinar qué tecla está siento pulsada incluso cuando hay dos con el mismo scancode. Por ejemplo podría escribir:
if (key[KEY_ENTER] & KB_NORMAL) printf("Enter (al lado del shift) está siendo pulsado\n");extern volatile int key_shifts;if (key[KEY_ENTER] & KB_EXTENDED) printf("Enter (del teclado numérico) está siendo pulsado\n");
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_ACCENT1_S_FLAG
KB_ACCENT2_FLAG
KB_ACCENT2_S_FLAG
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.
int readkey();
Devuelve el siguiente caracter del buffer del teclado. Si el buffer está
vacío, espera hasta que una tecla sea pulsada. El byte bajo del valor
devuelto contiene el código ASCII de la tecla, y el byte alto el
scancode. El scancode sigue siendo el mismo a pesar del estado de las
teclas shift, ctrl y alt. El código ASCII es afectado por shift y ctrl de
la forma usual (shift hace mayúsculas, ctrl+letra da la posición de la
letra en el alfabeto, ej: ctrl+A = 1, ctrl+B = 2, etc). Pulsando
alt+tecla devuelve sólo el scancode, con el código ASCII cero en el byte
bajo. Ejemplo:
if ((readkey() & 0xff) == 'd') // por código ASCII printf("Has pulsado 'd'\n");void simulate_keypress(int key);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");
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, lo que hace 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 ser fijada (locked) en memoria.
extern void (*keyboard_lowlevel_callback)(int key);
Si se activa, esta función es será llamada por el controlador del teclado
en respuesta a cualquier evento del teclado, tanto al pulsar como al
soltar una tecla. Se le pasará un byte de scancode puro, con el bit alto
activado si la tecla ha sido pulsada o desactivado si ha sido soltada.
Esta rutina se ejecuta en contexto de interrupción, por lo que debe ser
fijada (locked) en memoria.
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.
void clear_keybuf();
Vacía el buffer del teclado.
extern int three_finger_flag;
El controlador de teclado de Allegro tiene una secuencia de 'salida de
emergencia' que puede usar para salir de su programa. Si está corriendo
bajo DOS, será la combinación de tres dedos ctr+alt+del. La mayoría de
sistemas operativos multitarea capturarán esta combinación antes de que
llegue al controlador de teclado, en cuyo caso puede usar la combinación
alternativa ctrl+alt+fin. Si quiere desactivar este comportamiento en su
programa, ajuste este biestable a FALSE.
extern int key_led_flag;
Por defecto las teclas BloqMayús, BloqNum, BloqDesp activan los LEDS del
teclado cuando son presionadas. Si las quiere usar con su juego (ej.
BloqMayús para disparar) este comportamiento no es deseable, por lo que
puede limpiar este biestable para evitar que los LEDS sean actualizados.
extern int switch_standard_kb_key;
extern int switch_standard_kb_flags;
extern int switch_custom_kb_key;
extern int switch_custom_kb_flags;
Combinación de scancode y biestable shift usado para cambiar el mapa de
teclado personalizado por el estándar. Por defecto, pulsando ctrl+alt+F1
seleccionará el mapa de teclado americano, mientras que ctrl+alt+F2
selecciona el mapa de teclado personalizado. Estos valores permiten
alterar la combinación de teclas para realizar el cambio, o puede
ajustarlos a cero para evitarlo.
void set_standard_keyboard();
Fuerza a Allegro a usar el mapa de teclado estándar americano, ignorando
el mapa de teclado personalizado que está actualmente en uso.
void set_custom_keyboard();
Fuerza a Allegro a usar el mapa de teclado personalizado, invirtiéndo el
efecto de las llamadas previas a set_standard_keyboard().