JoyStick(游戏手柄)与C#
前言
这是我的第一篇技术博客,希望能为大家提供些有用信息。
概述
前段时间有一项工作是通过游戏手柄控制云台,通过google和msdn搞定了,在这吧就总结一下吧。
问题
对于手柄控制主要有以下几个问题
- 在合适的时机获取游戏手柄的输入?
- 一般游戏手柄都是有n个方向键和n个功能键控制的,要确认各个键的状态?
解决方案
- 通过windows API 中与游戏手柄相关的函数进行控制,主要是joystick系统函数,这一问题的关键点是P/Invoke调用。优点是不需要directx 支持,缺点是调用如果要想让多个窗口接受手柄输入有点麻烦(后边会详细描述)。
- 通过directx的directx input,Microsoft.DirectX.DirectInput命名空间下的类对joystick进行了很好的封装,在.net中用时很方便。优点使用方便,缺点需要directx支持不过这点应该不用担心,现在大部分系统安装完后应该都安装了directx
在本篇中将先介绍通过directxinput进行控制,这篇文章有些地方借鉴了codepoject上的文章点击这里可以看到
程序最终运行效果
1.获取系统中已经连接成功的游戏手柄列表,代码如下
public static string[] FindJoysticks(IntPtr hWnd)
{
string[] systemJoysticks = null;
try
{
// 查找连接成功的游戏设备
DeviceList gameControllerList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);
// 遍历列表并获取设备名称
if (gameControllerList.Count > 0)
{
systemJoysticks = new string[gameControllerList.Count];
int i = 0;
foreach (DeviceInstance deviceInstance in gameControllerList)
{
// 创建一个Device对像并获取
Device joystickDevice = new Device(deviceInstance.InstanceGuid);
joystickDevice.SetCooperativeLevel(hWnd,
CooperativeLevelFlags.Background |
CooperativeLevelFlags.NonExclusive);
systemJoysticks[i] = joystickDevice.DeviceInformation.InstanceName;
i++;
}
}
}
catch (Exception err)
{
Debug.WriteLine("FindJoysticks()");
Debug.WriteLine(err.Message);
Debug.WriteLine(err.StackTrace);
}
return systemJoysticks;
}
2.连接到手柄设备开始获取手柄输入
public bool AcquireJoystick(string name)
{
try
{
DeviceList gameControllerList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);
int i = 0;
bool found = false;
// 查找指定名称的设备并连接到指定的窗口
foreach (DeviceInstance deviceInstance in gameControllerList)
{
if (deviceInstance.InstanceName == name)
{
found = true;
// 创建一个Device对象用来管理一个joystick
joystickDevice = new Device(deviceInstance.InstanceGuid);
joystickDevice.SetCooperativeLevel(hWnd,
CooperativeLevelFlags.Background |
CooperativeLevelFlags.NonExclusive);
break;
}
i++;
}
if (!found)
return false;
//告诉directx要控制的是一个Joystick
joystickDevice.SetDataFormat(DeviceDataFormat.Joystick);
joystickDevice.Acquire();
DeviceCaps cps = joystickDevice.Caps;
Debug.WriteLine("Joystick Axis: " + cps.NumberAxes);
Debug.WriteLine("Joystick Buttons: " + cps.NumberButtons);
UpdateStatus();
}
catch (Exception err)
{
Debug.WriteLine("FindJoysticks()");
Debug.WriteLine(err.Message);
Debug.WriteLine(err.StackTrace);
return false;
}
return true;
}
3.获取手柄状态并管理按键的状态上放开还是按下等信息,由于从手柄获取到的信息只含方向和那个键是按下的所以要想获取某个键是否按下或弹起要进行一些处理,下面的程序逻缉大家看下应该会懂的。
public void UpdateStatus()
{
Poll();
int[] extraAxis = state.GetSlider();
//获取方向键的状态,并区分左右上下以及按键的按下与放开
if (state.X == 0)
{
m_joyMove.Direction = JoyDirection.LEFT;
m_joyMove.Event = JoyEvent.WM_DOWN;
}
else if (state.Y == 0)
{
m_joyMove.Direction = JoyDirection.UP;
m_joyMove.Event = JoyEvent.WM_DOWN;
}
else if (state.X == 65535)
{
m_joyMove.Direction = JoyDirection.RIGHT;
m_joyMove.Event = JoyEvent.WM_DOWN;
}
else if (state.Y == 65535)
{
m_joyMove.Direction = JoyDirection.DOWN;
m_joyMove.Event = JoyEvent.WM_DOWN;
}
else if (state.X == 32511 && (m_joyMove.Direction == JoyDirection.LEFT || m_joyMove.Direction == JoyDirection.RIGHT)
&& m_joyMove.Event == JoyEvent.WM_DOWN)
{
m_joyMove.Event = JoyEvent.WM_UP;
}
else if (state.Y == 32511 && (m_joyMove.Direction == JoyDirection.UP || m_joyMove.Direction == JoyDirection.DOWN)
&& m_joyMove.Event == JoyEvent.WM_DOWN)
{
m_joyMove.Event = JoyEvent.WM_UP;
}
else
{
m_joyMove.Direction = JoyDirection.NONE;
m_joyMove.Event = JoyEvent.NONE;
}
// 获取按键的状态
byte[] jsButtons = state.GetButtons();
if (jsButtons != null)
{
if (m_JoyButtons == null)
m_JoyButtons = new JoyEvent[jsButtons.Length];
for (int i = 0; i < jsButtons.Length; i++)
{
if (jsButtons[i] >= 128)
{
m_JoyButtons[i] = JoyEvent.WM_DOWN;
}
else
{
if (m_JoyButtons[i] == JoyEvent.WM_DOWN)
m_JoyButtons[i] = JoyEvent.WM_UP;
else
m_JoyButtons[i] = JoyEvent.NONE;
}
}
}
}
最后我想上传整个工程但找不到从哪儿上传的.
JoyStick(游戏手柄)与C#相关推荐
- [Android] Joystick游戏手柄开发
原创文章转载请保留出处 http://blog.csdn.net/s278777851/article/details/6956226 设备: XOOM, 系统为Android3.2, 开发Joyst ...
- 安卓 手柄 linux,Linux joystick 游戏手柄编程 (获取输入数据)
点击(此处)折叠或打开 //my_joystick.c #include #include #include #include #include #include #include #include ...
- linux 玩安卓游戏手柄,Linux joystick 游戏手柄编程 (获取输入数据)
啥也不说了,先上代码: 由于linux中的list.h不能直接用,所以单独提取了出来使用: //listop.h /*it is from linux list */ #ifndef LISTOP_H ...
- linux模拟手柄输入,Linux joystick 游戏手柄编程 (获取输入数据)
外链网址已屏蔽 点击(此处)折叠或打开 //my_joystick.c #include #include #include #include #include #include #include # ...
- JoyStick游戏杆编程实践
概述 最近突然对如何编程读取游戏手柄输入比较感兴趣.所以上网找了找相关的资料,发现没有什么简单明了的教程,所以在此将收集到跟joystick游戏杆编程相关资料整理一下,方便大家参考使用. JoySti ...
- Android4.0与2.3的差异
自从2011-10-19 google公司发布了android4.0版本,下载源码后,一直没有时间看下,正好需要看下JoyStick(游戏手柄)框架代码,所以两者代码进行对比浏览看看. Android ...
- excel文字显示图标集_创建自己的Excel图标集
excel文字显示图标集 See how to create your own Excel icon set, to overcome a limitation with the built-in o ...
- linux文件目录详解
源代码所有在目录:/usr/src/linux (大部分linux发行版本中) |--Documentation /*对于内核的文档说明*/ | |--arm /* Advanced RISC Mac ...
- JoyStick for android2.3 游戏手柄功能开发
原址:http://blog.csdn.net/andyhuabing/article/details/7099592 买了个Logitech 的游戏手柄Gamepad F310需要移植到Androi ...
最新文章
- 自己编写的excel操作过程
- Robot Perception for Indoor Navigation《室内导航中的机器人感知》
- mybatis逆向工程生成的Example类的使用
- 2.1.6 编码与调制(2)
- poj 1180 斜率优化dp
- linux c设置系统时间函数,Linux C 中获取local日期和时间 time()localtime()函数
- 脑瘫男孩17岁考上大学,毕业在家工作每月7500,成为公司骨干
- [渝粤教育] 金陵科技学院 面向对象程序设计 参考 资料
- 洞态IAST实现思路分享及讨论
- 如何设置无线网络中计算机的ip,无线网络设置方法【详细步骤】
- Unity游戏神经网络版坦克大战
- 用php表示掷骰子两次比大小,[宜配屋]听图阁
- UVA-11584:Partitioning by Palindromes(基础DP)
- ping的通百度但是浏览器打不开的解决方法
- 防止 rm -rf / 删根跑路——使用 safe-rm 替代 rm
- mysql 分销提成计算_销售人员工资计算表-2017销售人员工资提成计算表免费版-东坡下载...
- 短时间求素数 java
- 没有比心更高的山,没有比脚更远的路
- ofbiz作为企业复杂应用开发平台的要求
- 数据库封装 sql server mysql_mysql数据库封装