Programming 版 (精华区)

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

发信人: cloudwu (云风), 信区: GAME_Designer
标  题: Allegro 游戏程序库 (游戏杆例程)
发信站: BBS 水木清华站 (Mon May 11 09:56:28 1998)
     ______   ___    ___
    /\  _  \ /\_ \  /\_ \
    \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___
     \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
      \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
       \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
        \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
                                       /\____/
                                       \_/__/        3.0 版
                    一个游戏程序库
               By Shawn Hargreaves, 1994/97
                          云风 译
                          http://www.nease.net/~cloudwu
                          E-mail:cloudwu@nease.net
===========================================
============    游戏杆例程     ============
===========================================
读取 PC 游戏杆的输入信息可不是一件另人快乐的任务. 不是因为它
特别的复杂, 而是因为它依赖于一个高精度的时钟循环,
它准确返回值的条件会随着游戏杆的类型,
你的机器的速度,房间的温度和月亮的圆缺而改变.
如果你想得到输入值的意思就必须
在使用之前校准游戏杆, 一件讨厌的事情.
extern int joy_type;
   这个全局变量描述了是何种游戏杆接在机器上.
   可能的值有:
   JOY_TYPE_STANDARD
      普通的两键杆.这是缺省值,可以用在任何游戏杆上.
   JOY_TYPE_FSPRO
      如果你有一个 CH Flightstick Pro, 而且想使用它提供的很酷的特性
      ( 四按纽, 一个模拟气管 (analogue throttle), 和一个 4 向冷却帽 (coolie
      hat)), 你就应该在调用其它游戏杆函数前设置这个变量.
   JOY_TYPE_4BUTTON
      设置这个变量可以使能 (enable) 4 纽游戏杆上扩展的按纽  (比如
      Gravis Gamepad).
   JOY_TYPE_6BUTTON
      设置这个变量可以使能 6 纽游戏杆上的扩展按纽.
   JOY_TYPE_2PADS
      使用双游戏杆模式.
   JOY_TYPE_WINGEX
      使用 Logitech Wingman Extreme 游戏杆时用这个,
      也可以用在任何 Thrustmaster Mk.I 兼容游戏杆上. 它支持
      四个按纽和冷却帽. 如果你将 Wingman Warrior 插在 15 针插头上 (记住
      拔掉  9 针插头!) 然后设置一下 "H" 位置前的小开关, 也可以工作 (
      然而你将不能使用
      气管或者机头罩)
int initialise_joystick();
   初始化游戏杆, 校准中心位置的值. 你
   必须在使用其它任何游戏杆函数前调用它, 而且在你做的时候你必须
   确认用户将游戏杆调到了中心.
   如果没有游戏杆则返回非零值 (不过你还是可以调用其它游戏杆函数,
   但是它们都将返回零坐标).
   如果游戏杆被其它设置工具校准了,就没有必要使用这个函数了:
   如果是这样,你可以调用
   load_joystick_data(NULL) 来恢复以前的设置.
void poll_joystick();
   不象鼠标和键盘, 游戏杆不是用中断驱动的, 因此
   你需要每次重复的调用这个函数来更新全局坐标变量.
extern int joy_left, joy_right, joy_up, joy_down;
   这些变量模拟了一个数字协约国. 它们由
   poll_joystick() 更新, 当游戏杆移到相关的方向,有关的值就会被置入非零值.
   使用这些你不必完全的校准游戏杆:
   只 initialise_joystick() 就够了 ( demo 游戏就是这样使用游戏杆的).
extern int joy2_left, joy2_right, joy2_up, joy2_down;
   第二个游戏杆的数字位置变量 (只有在
   joy_type 设置为 JOY_TYPE_2PADS 时有效).
extern int joy_b1, joy_b2;
   游戏杆按纽状态. 调用 poll_joystick() 来更新它们. 注意
   注意当按纽被按下或者放开时一些时候在 on 和 off 之间倾向于弹起,
   所以在一些情况下你可能需要在按纽改变状态后加
   一小段延时 (例子见 test.c).
extern int joy2_b1, joy2_b2;
   第二个游戏杆的按纽状态 (只在 joy_type 设置为 JOY_TYPE_2PADS 时有效).
extern int joy_b3, joy_b4;
   就象两个基本的按纽, 这些也是由 poll_joystick() 更新.
   只有在 joy_type 设置为 JOY_TYPE_FSPRO,
   JOY_TYPE_4BUTTON, JOY_TYPE_6BUTTON, 或 JOY_TYPE_WINGEX 时变量才含有有效值
.
   你也可以以别名(在 allegro.h 定义)形式控制 Flightstick Pro 的按纽:
      #define joy_FSPRO_trigger     joy_b1
      #define joy_FSPRO_butleft     joy_b2
      #define joy_FSPRO_butright    joy_b3
      #define joy_FSPRO_butmiddle   joy_b4
   Wingman Extreme 按纽同样在 allegro.h 里定义了别名:
      #define joy_WINGEX_trigger    joy_b1
      #define joy_WINGEX_buttop     joy_b2
      #define joy_WINGEX_butthumb   joy_b3
      #define joy_WINGEX_butmiddle  joy_b4
extern int joy_b5, joy_b6;
   就象基本按纽, 这些也是由 poll_joystick() 更新.
   只有在 joy_type 设置为 JOY_TYPE_6BOTTON 时值才有效.
extern int joy_hat;
   由 poll_joystick() 更新. 只有在 joy_type 等于 JOY_TYPE_FSPRO 或
   JOY_TYPE_WINGX (还有条件是只有帽子被校准时) 时才含有效的数据.
   它有以下这些可能值
   (它们是互斥的):
      JOY_HAT_CENTRE
      JOY_HAT_UP
      JOY_HAT_DOWN
      JOY_HAT_LEFT
      JOY_HAT_RIGHT
int calibrate_joystick_tl();
int calibrate_joystick_br();
   如果你想得到模拟杆的位置信息,而不是用
   joy_left, joy_right, joy_up, 和 joy_down 变量, 你需要
   单独校准游戏杆左上,右下,和中间位置.
   首先必须调用 initalise_joystick() 来校准中间位置.
   然后你可以叫用户移动游戏杆到
   最左上和最右下, 再在每个角调用相应的
   校准例程. 例子见 test.c .
   做完这些,你便可以使用位置变量了:
extern int joy_x, joy_y;
   模拟轴坐标, 范围是 -128 到 128. 你在使用这些变量前必须完全
   校准游戏杆: 见上面.
   调用 poll_joystick() 来更新它们.
extern int joy2_x, joy2_y;
   第二个游戏杆的模拟轴坐标 (只有在 joy_type 设置为
   JOY_TYPE_2PADS 值才有效).
int calibrate_joystick_throttle_min();
int calibrate_joystick_throttle_max();
   好象需要校准的东东没完没了了  :-) 要使用
   Flightstick Pro 的模拟气管, 将气管分别开到
   最小和最大然后调用这些函数.
extern int joy_throttle;
   气管位置, 范围重 0 到 255 ( 0 是全速前进还是
   全速后退取决于用户怎样校准气管: 一些
   人喜欢和大多数人的用法反着用).
   这个由 poll_joystick() 更新,
   只有 joy_type = JOY_TYPE_FSPRO 时包含有效值,而且你要先校准气管.
int calibrate_joystick_hat(int direction);
   这是个由 Wingman Extrme 需要校准冷却帽时使用的硬件供给工具
   (这个只能在 Thrustmaster 兼容游戏杆下使用,
   比如 Wingman Extreme, 而不能在 CH 兼容游戏杆下用:
   它们线路不同). 为了防止随机的行为, 如果
   没有校准 joy_hat 变量将总为
   JOY_HAT_CENTRE. calibrate_joystick_hat() 的值为以下的一个:
      JOY_HAT_CENTRE
      JOY_HAT_UP
      JOY_HAT_DOWN
      JOY_HAT_LEFT
      JOY_HAT_RIGHT
   注意,为了获得冷却帽的更好的校准效果, 在这个函数被调用时游戏杆
   应当放到中间.
int save_joystick_data(char *filename);
   在所有头痛的游戏杆校对工作以后, 你不会想
   让你可怜的用户在运行你的程序时每次都重复这个过程吧.
   调用这个函数可以将游戏杆校准数据保存在指定的
   配置文件中, 而这些可以在日后被
   load_joystick_data() 来读取.  传入一个 NULL 文件名使得数据被写入
   当前选择的配置文件. 成功则返回零.
int load_joystick_data(char *filename);
   恢复以前由 save_joystick_data() 或 设置工具保存的校准数据.
   这个将设置所有的有关游戏杆的东东: 如果你使用这个函数你就
   不需要调用 initialise_joystick() 了.
   传入 NULL 文件名则从当前选择的配置文件里读入数据.
   成功则返回零: 如果失败   游戏杆的状态就会 无定义, 而你必须重初始化和校准它
了.
--
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)
页面执行时间:5.742毫秒