Pcgame 版 (精华区)
发信人: bell (花开时是冷冷月光), 信区: Pcgame
标 题: Allegro 中文文档(游戏杆例程)
发信站: 紫 丁 香 (Tue May 4 14:10:57 1999), 转信
游戏杆例程
install_joystick
remove_joystick
poll_joystick
num_joysticks
joy
calibrate_joystick_name
calibrate_joystick
save_joystick_data
load_joystick_data
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 按纽 和一个数字方向控制器).
一当你装载游戏杆模块, 你将能 读取按纽状态和数字(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. 所有的 1d 气管控制器都是这样.
拼写古怪的人注意: 因为你不喜欢键入 "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
文件名则从当前选定的 配置文件里读入数据. 成功则返回零: 如果失败, 游戏杆状态就没
有定义并且你必须临时重初始化.
--
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: jxjd.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.842毫秒