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