Andrew Haung
一直以为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;
|
阅读(7118) | 评论(0) | 转发(0) |