一直以为LINUX下SDL游戏摇杆(JoyStick)编程好象没有什么含意,没有什么合适的硬件来测试。近日去找华强北找实验模块,偶然找到USB的游戏摇杆.买来来一试,插上Linux直接支持,并且以在支持JoyStick的游戏可以直接操作。(比如SDLPAL).
这个外设解决了我一直头痛的问题--在开发板上如何方便打游戏。触摸屏太慢,不方便,USB键盘不能移动。USB鼠标就更不方便了。Joy Stick完美解决这个问题。在开发板,甚至是手机或者MID都可以用它来做外设。
一.JoyStick的硬件安装
--------------------------------------------------------------
将USB的接口的JoyStick 插RHEL 5的主机上。可以直接被识别。
用dmesg | tail 查看
usb 3-2: new low speed USB device using uhci_hcd and address 3
usb 3-2: configuration #1 chosen from 1 choice
input: DragonRise Inc. Generic USB Joystick as /class/input/input3 input: USB HID v1.10 Joystick [DragonRise Inc. Generic USB Joystick ] on usb-0000:00:1d.1-2
可以看Joy Stick已经安装到系统当中
查看系统结点 ls -l /dev/input
event0 event1 event2 event3 js0 mice mouse0
其中/dev/input/event3就是joy Stick.而js0是表示第一个游戏摇杆。它实际指向/dev/input/event3
至此硬件安装完毕。
用sdlpal(SDL版仙剑奇侠传)来测试,方向能工作正常。
二.SDL Joy Stick编程
---------------------------------------------------------------
SDL的Joy Stick编程相当简单。
2.1 首先在初始化时要初始化Joy Stick模块
用SDL_Init(SDL_INIT_JOYSTICK | ...) 或者 SDL_Init(SDL_INIT_EVERYTHING);
2.2 初始化游戏摇杆设备
定义Joy Stick 数据结构
SDL_Joystick *g_pJoy;
检测Joy Stick设备是否存在
SDL_NumJoysticks()
打开JoyStick设备
SDL_JoystickOpen(0); #0表示第一个设备
设置JoyStick事件生效
SDL_JoystickEventState(SDL_ENABLE);
if (SDL_NumJoysticks() > 0)
{
g_pJoy = SDL_JoystickOpen(0);
if (g_pJoy != NULL)
{
SDL_JoystickEventState(SDL_ENABLE);
}
}
2.3 在事件处理函数加入对游戏摇杆事件处理。
对Joy Stick事件处理主要如下几个事件.
SDL_JOYAXISMOTION : Joy移动事件
SDL_Event.jaxis.axis 表示移动方向,0 ,X方向移动,1,Y方向移动
SDL_Event.jaxis.value 表示移动位移
SDL_JOYBUTTONDOWN: Joy Stick几个标准按键事件
SDL_Event.jbutton.button 表明是按下哪一个按键
2.4 关闭Joy Stick设备
用 SDL_JoystickClose(g_pJoy);关闭
if (SDL_JoystickOpened(0))
{//assert(g_pJoy != NULL);
SDL_JoystickClose(g_pJoy);
g_pJoy = NULL;
}
三.JoyStick事件处理框架
-----------------------------------------------------------------
JoyStick的事件SDL_JOYAXISMOTION 主要是在左侧按键的响应。而SDL_JOYBUTTONDOWN主要是右侧一些按键来处理。
SDL_Event是一个联合,不同事件采用不同数据结构,其中SDL_JOYAXISMOTION是使用jaxis,而SDL_JOYBUTTONDOWN采用jbutton来处理。
typedef union{
Uint8 type;
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
SDL_MouseMotionEvent motion;
SDL_MouseButtonEvent button;
SDL_JoyAxisEvent jaxis;
SDL_JoyBallEvent jball;
SDL_JoyHatEvent jhat;
SDL_JoyButtonEvent jbutton;
SDL_ResizeEvent resize;
SDL_QuitEvent quit;
SDL_UserEvent user;
SDL_SywWMEvent syswm;
} SDL_Event;