Programming 版 (精华区)

发信人: lansh (沧海一粟), 信区: Programming
标  题: Allegro 游戏程序库 (键盘例程)
发信站: 哈工大紫丁香 (2002年09月11日20:02:07 星期三), 站内信件

发信人: cloudwu (云风), 信区: GAME_Designer
标  题: Allegro 游戏程序库 (键盘例程)
发信站: BBS 水木清华站 (Mon May 11 09:53:01 1998)

     ______   ___    ___
    /\  _  \ /\_ \  /\_ \
    \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___
     \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
      \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
       \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
        \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
                                       /\____/
                                       \_/__/        3.0 版
                    一个游戏程序库
               By Shawn Hargreaves, 1994/97
                          云风 译
                          http://www.nease.net/~cloudwu
                          E-mail:cloudwu@nease.net


===========================================
============     键盘例程      ============
===========================================
如果你想检测同时按下的多个按键, BIOS
键盘例程就没什么用了. Allegro 能加载一个键盘处理程序的替代品,
它提供了缓冲输入和标记集合两种方式来储存每个键的状态.
注意,由于 PC 键盘本身的设计,它不可能正确的检测到每种按键的组合,
同时按下两到三个键将工作的很好,
但是如果你同时按下更多的键,
多余的部分将被忽略 (准确的说得到的键的组合随着每一个键盘而不同).

int install_keyboard();
   加载 Allegro 键盘中断处理程序.你必须在使用
   任何键盘输入例程前调用它.一旦你设置了
   Allegro 处理程序,就不再需要使用 DOS/BIOS 调用或者 C 库函数
   来控制键盘了.
void remove_keyboard();
   卸载键盘处理程序,将控制权交回 BIOS. 正常的情况你不必
   自己调用它,因为 allegro_exit() 将为你做这些.

void install_keyboard_hooks(int (*keypressed)(), int (*readkey)());
   只有在你 *不需要* 使用键盘处理程序的其它部分时才使用这个函数.
   它应该在 install_keyboard() 的地方被调用,
   让你提供一个检测和读取键盘的回调例程,
   这个例程将被 keypressed() 和 readkey() 调用.
   如果你想使用 Allegro 的 GUI 代码和自己配制的键盘处理程序时这就很有用,
   因为它提供了用你自己代码为 GUI 控制键盘输入的一个方案.
   如果你想使用 BIOS 键盘例程,
   libc 函数 _bios_keybrd(_KEYBRD_READ) 将以正确形式返回键击.

extern volatile char key[128];
   以扫描码的顺序描述每个按键状态的标志数组.
   扫描码以一串 KEY_* 形式的常量定义在 allegro.h 里.
   比如,你可以这样写:
      if (key[KEY_SPACE])
         printf("Space is pressed\n");
   每个值都可以以在某些位上包含标志
   KB_NORMAL 和 KB_EXTENDED, 这使得你可以检测出具有相同扫描码的键
   中具体按下的是哪一个.例如,
   你可以这样写:
      if (key[KEY_ENTER] & KB_NORMAL)
         printf("Enter (next to the right shift key) is pressed\n");
      if (key[KEY_ENTER] & KB_EXTENDED)
         printf("Enter (on the numeric keypad) is pressed\n");
extern volatile int key_shifts;
   这个位屏蔽变量包含了当前的 shift/ctrl/alt 状态, 特别的
   Windows 键,和 accent escape 字符. 可以含有以下标志:

      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();
   如果在输入缓冲中有键击则返回 TRUE.
   相当于 libc kbhit() 函数.
int readkey();
   返回键盘缓冲里的下一个字符.如果缓冲是空的,
   则等待下一次键击.返回值的低字节
   是键的 ASCII 码,高字节为扫描码.
   扫描码无论在何种 shift, ctrl 和 alt 状态下都保持一致.
   ASCII 码以正常的方式被 shift 和 ctrl 的状态影响.
   (shift 改变大小写, ctrl+字母则给出字母在字母表中的位置,
   即 ctrl+A = 1, ctrl+B = 2, 等等). 按下 alt+key 只返回扫描码,
   而低字节为零. 比如:
      if ((readkey() & 0xff) == 'd')         // 检查 ASCII 码
         printf("You pressed 'd'\n");
      if ((readkey() >> 8) == KEY_SPACE)     // 检查扫描码
         printf("You pressed Space\n");
      if ((readkey() & 0xff) == 3)           // ctrl+字母
         printf("You pressed Control+C\n");
      if (readkey() == (KEY_X << 8))         // alt+字母
         printf("You pressed Alt+X\n");
void simulate_keypress(int key);
   向键盘缓冲塞入一个键,就象用户亲自敲过一样.
   参数和 readkey() 的返回值的格式相同.
extern int (*keyboard_callback)(int key);
   如果被设置, 键盘处理程序在反应每次键击时都调用这个函数.
   将即将加入输入缓冲的值传入这个函数,
   然后你可以不加改变的将这个值返回,也可以
   返回零使得按键被忽略,或者返回一个修改的值来改变
   readkey() 将返回的值.
void set_leds(int leds);
   设置键盘 LED 指示器的状态. 参数是一个
   可以包含 KB_SCROLOCK_FLAG, KB_NUMLOCK_FLAG, 和 KB_CAPSLOCK_FLAG 这些值
   的位掩值 (bitmask), 或者传入 -1 来恢复缺省状态.
void clear_keybuf();
   清空键盘缓冲.
extern int three_finger_flag;
   Allegro 键盘处理程序提供了一个 '紧急出口' 的序列,可以用来
   杀掉你的程序. 如果你正在 DOS 下运行, 这是
   三个手指的活, ctrl+alt+del. 所有的多任务 OS 都会
   在 Allegro 处理之前捕捉这个组合, 所以
   你可以使用改变的键组 ctrl+alt+end. 如果你想在
   你的程序的发行版中关掉这个行为, 将这个标志设为 FALSE.

extern int key_led_flag;
   缺省状态下, capslock, numlock, 和 scroll-lock 键在它们被触动时
   联系着键盘 LED 指示器. 如果你在你的游戏中使用了这些做输入键
   (比如. capslock 为开火键) 这个就不那么
   称心如意了, 因此你可以清除这个标志来阻止 LED 的状态被改变.

--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net


--
人生得意需尽欢,莫使金樽空对月。
天生我才必有用,千金散尽还复来。

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: hitsat.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:13.003毫秒