游戏杆例程



int install_joystick(int type);
初始化游戏杆, 校准中间位置值. 你必须 在使用任何游戏杆函数前调用这个, 并且你必须确认 这个时候游戏杆在中间位置. 成功则返回 0. type 参数必须是以下值中的一个:

JOY_TYPE_AUTODETECT
尝试自动检测游戏杆硬件. 它不可能 无误的辨认出所有可能的输入设置, 因此这个例程 只能选择基本游戏杆, Sidewider, 或 GamePad Pro 驱动程序, 但是如果有可能它将使用设置文件 中的信息 (设置文件可以由 setup 工具创建或者由 save_joystick_data() 函数保存), 因此你 可以总是在你的代码里使用 JOY_TYPE_AUTODETECT 选择 从 setup 程序里得到的准确的硬件类型.

JOY_TYPE_NONE
为没有游戏杆的机器设计的哑驱动程序.

JOY_TYPE_STANDARD
普通的两键杆.这是缺省值,可以用在任何游戏杆上.

JOY_TYPE_2PADS
双游戏杆模式 ( 两个游戏杆, 每个 2 按纽).

JOY_TYPE_4BUTTON
使能 4 按纽游戏杆上扩展的按纽.

JOY_TYPE_6BUTTON
使能 6 按纽游戏杆上扩展的按纽.

JOY_TYPE_8BUTTON
使能 8 按纽游戏杆上扩展的按纽.

JOY_TYPE_FSPRO
CH Flightstick Pro 或其兼容游戏杆, 它提供了 4 个按纽, 一个模拟节流阀(analogue throttle), 和一个 4 向 coolie hat.

JOY_TYPE_WINGEX
Logitech Wingman Extreme 游戏杆, 也可以用在任何 Thrustmaster Mk.I 兼容游戏杆上. 它支持 四个按纽和冷却帽. 如果你将 Wingman Warrior 插在 15 针插头上 (记住 拔掉 9 针插头!) 然后设置一下 "H" 位置前的小开关, 也可以工作 ( 然而你将不能使用 节流阀或者机头罩)

JOY_TYPE_SIDEWINDER
Microsoft Sidewinder 数字手柄 (支持 4 个控制器, 每个 10 按纽和一个数字方向控制).

JOY_TYPE_GAMEPAD_PRO
Gravis GamePad Pro (支持两个控制器, 每个 10 按纽 和一个数字方向控制器).

JOY_TYPE_SNESPAD_LPT1
JOY_TYPE_SNESPAD_LPT2
JOY_TYPE_SNESPAD_LPT3
SNES 游戏杆 (分别连接在 LPT1, LPT2, 和 LPT3)

JOY_TYPE_WINGWARRIOR
Wingman Warrior 游戏杆.

一当你装载游戏杆模块, 你将能 读取按纽状态和数字(on/off 状态)方向信息, 这些对一些游戏足够了. 如果你想得到全部模拟 输入, 那么, 你需要使用 calibrate_joystick() 函数来 测量准确的输入范围: 见下.

void remove_joystick();
卸载游戏杆处理程序. 你通常不必被调用它麻烦, 因为 allegro_exit() 将为你去做.

int poll_joystick();
不象鼠标和键盘, 游戏杆不是用中断驱动的, 因此 你需要每次重复的调用这个函数来更新全局坐标变量.


extern int num_joysticks;
包含激活的游戏杆驱动程序的数目的全局变量. 当前的驱动程序支持最多为 4 个控制器.

extern JOYSTICK_INFO joy[n];
游戏杆状态信息全局变量数组, 它由 poll_joystick() 函数刷新. 仅仅只有前面 num_joystick 个元素 包含有意义的信息. JOYSTICK_INFO 结构是这样定义的:

   typedef struct JOYSTICK_INFO
   {
      int flags;                       - 有个游戏杆的状态标志
      int num_sticks;                  - 多少操纵杆输入?
      int num_buttons;                 - 多少按纽?
      JOYSTICK_STICK_INFO stick[n];    - 操纵杆的状态信息
      JOYSTICK_BUTTON_INFO button[n];  - 按纽状态信息
   } JOYSTICK_INFO;

按纽状态贮存在这样的结构中:

   typedef struct JOYSTICK_BUTTON_INFO
   {
      int b;                           - 布尔 on/off 标志
      char *name;                      - 这个按纽的描述
   } JOYSTICK_BUTTON_INFO;

你可能希望将按纽的明知做为输入设置屏幕的一部分来显示 来使用户能选择每个按纽来操纵什么游戏函数, 但是更简单的情况是你可以安全的假定 按纽数组前两个元素总是作为主扳机控制器.


每个游戏杆将提供一个或更多不同类型的杆输入. 这些可以是瞬变方向的数字控制器 (比如: gamepad 控制器, Flightstick Pro 上的 coolie hat 或 Wingman Extreme, 或是一般没有被校准的游戏杆), 或他们 可以是有平滑移动范围的完全模拟输入. 操纵杆也可以 有不同数目的轴线, 例如一个一般的方向控制器有两个, 但是 Flightstick Pro 节流阀只有一个轴线, 并且有可能未来的系统能扩展到支持 全 3d 控制器. 一个操纵杆输入由如下结构描述:

   typedef struct JOYSTICK_STICK_INFO
   {
      int flags;                       - 这个输入设备的状态标志
      int num_axis;                    - 我们拥有几个轴线?
      JOYSTICK_AXIS_INFO axis[n];      - 轴线状态信息
      char *name;                      - 这个输入设备的描述
   } JOYSTICK_STICK_INFO;

单个游戏杆可能提供几个不同的操纵杆输入, 但是你可以 安全的假定杆数组中第一个元素总是 主方向控制器.

每个杆轴线信息储存在子结构中:

   typedef struct JOYSTICK_AXIS_INFO
   {
      int pos;                         - 模拟轴线位置
      int d1, d2;                      - 数值轴线位置
      char *name;                      - 这个轴线的描述
   } JOYSTICK_AXIS_INFO;

在 pos 区域它提供了两个模拟输入 (范围从 -128 到 128 或从 0 到 255, 这以来于控制器的类型), 数字值 在 d1 和 d2 区域. 例如: 当描述 X 轴位置时, pos 区域将为游戏杆的水平坐标, 如果它向左移 d1 将被设置, 如果它向右移 d2 将被设置. 无论使用数字或模拟游戏杆, Allegro 无论如何都将填写所有这些值,

数字输入将填入 pos 最小, 中间, 最大的位置值, 而模拟游戏杆则同中点比较当前坐标来填入 d1 和 d2 值.


游戏杆标志域可以包含下面位标志的任何组合:

JOYFLAG_DIGITAL
这个控制器当前提供了数字输入.

JOYFLAG_ANALOGUE
这个控制器当前提供了模拟输入.

JOYFLAG_CALIB_DIGITAL
这个控制器一但被校准就能够提供数字输入, 但是现在还不行.

JOYFLAG_CALIB_ANALOGUE
这个控制器一但被校准就能够提供模拟输入, 但是现在还不行.

JOYFLAG_CALIBRATE
表示这个控制器需要被校准. 许多设备 需要多重校准步骤, 因此你应当用一个循环调用 calibrate_joystick() 函数直到这个标志被清掉.

JOYFLAG_SIGNED
表示模拟轴线坐标是一个有符号的格式, 范围 从 -128 到 128. 所有 2d 方向控制器都是这样.

JOYFLAG_UNSIGNED
表示模拟轴线位置是无符号格式, 范围从 0 到 255. 所有的 1维节流阀控制器都是这样.

拼写古怪的人注意: 因为你不喜欢键入 "analogue", 在 allegro.h 里有一些 #define 的别名, 它们允许你 用 "analog" 替代.

char *calibrate_joystick_name(int n);
返回一个将在指定游戏杆上完成的下一个校准类型的描述, 如果没有更多的校准需要它将返回 NULL.


int calibrate_joystick(int n);
所有的游戏杆需要在它们可以提供完整的 模拟输入前校准一下. 这个函数完成对指定游戏杆的一套校准过程的 下一个步骤, 假定游戏杆已经被前一个 calibrate_joystick_name() 描述的方式定位了, 如果成功则返回零. 例如: 一个简单的对所有游戏杆完全校准的例程可能是这个样子:

      int i;

for (i=0; i<;num_joysticks; i++) { while (joy[i].flags & JOYFLAG_CALIBRATE) { char *msg = calibrate_joystick_name(i); printf("%s, and press a key\n", msg); readkey(); if (calibrate_joystick(i) != 0) { printf("oops!\n"); exit(1); } } }

int save_joystick_data(char *filename);
在所有头痛的游戏杆校准后, 你可能不想 迫使你可怜的用户在每次运行你的程序时重复这个过程. 调用这个函数来将游戏杆校准数据保存在 指定的设置文件里, 以后可以用 load_joystick_data() 来从文件里读出来. 传入 NULL 文件名则将数据写入 当前选择的设置文件. 成功则返回零.

int load_joystick_data(char *filename);
恢复以前用 save_joystick_data() 或 setuo 工具保存的校准数据. 这个设置游戏杆代码的所有方面: 如果使用这个函数,你 甚至不需要调用 initialise_joystick(). 传入 NULL 文件名则从当前选定的 配置文件里读入数据. 成功则返回零: 如果失败, 游戏杆状态就没有定义并且你必须临时重初始化.




返回