Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1643044
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2010-08-21 20:39:07

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;

 


 

阅读(6818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~