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毫秒