收藏 分销(赏)

基于VB平台的游戏控制器端口数据通信-在VB中如何读取游.docx

上传人:xrp****65 文档编号:5995873 上传时间:2024-11-25 格式:DOCX 页数:6 大小:98.46KB 下载积分:10 金币
下载 相关 举报
基于VB平台的游戏控制器端口数据通信-在VB中如何读取游.docx_第1页
第1页 / 共6页
基于VB平台的游戏控制器端口数据通信-在VB中如何读取游.docx_第2页
第2页 / 共6页


点击查看更多>>
资源描述
基于VB平台的游戏控制器端口数据通信 李密 吕钊  (空军第一航空学院电子工程系  464000) [摘要] 本文详细分析了API函数调用的基本方法,在此基础上介绍了如何实现游戏控制器端口的数据通讯。 [关键词]API,窗体,工程 TO ACHIEVE COMMUNICATIONS OF THE GAME CONTROLLER BASED ON VB LV-ZHAO LI-MI (The first Aeronautical College of Air-Force. 464000 Xinyang, Henan Province) [Abstract]This article introduces the way that how to apply API function, and analyzes the process of achieving communications of the game controller based on VB. [keywords]API, Form, Projector    Visual Basic 是Microsoft推出的功能强大的集成式开发环境。它以其易学易用深受广大电脑爱好者的喜爱。在使用VB编程过程中,我们经常需要调用Windows API函数来实现一些特殊的功能。Windows API 是Windows中可供任何Windows应用访问的函数的集合,它包含了成千上万的函数、例程、类型和常数定义,可以定义为三个主要的动态链接库和几个较小的DLL。Visual Basic 本身便是600多个Windows API函数轴取到高层的结果,而Windows 提供的所有功能几乎都可以在API函数中找到。准确地调用API函数便是VB编程的精髓所在。在利用VB进行精确图像处理,尤其是在编写仿真、模拟应用软件时,合理正确地调用API以实现对外设接口的数据通信则显得尤为重要。笔者在利用VB开发某飞机综合训练模拟器过程中,经过反复调试,实现了通过调用API函数来即时读取游戏控制器的端口数据,并由此控制飞行姿态,以达到利用游戏控制器来模拟飞机操纵杆的目的。经调试,总结出用以完成精确读取游戏控制器端口数据的方法。 一、API函数的调用 要调用API函数,就需要一种特别的声明,这种声明比一般变量声明要复杂,它们被称为Declare语句。Declare语句一般具有两种可能的形式。对于DLL中的子程序(没有返回值),使用如下Declare语句: [Public/Private] Declare Sub name Lib “libname”[Alias_aliasname][(areglist)] 而对函数(有返回值),则使用如下语句: [Public/Private] Declare Function name Lib “libname”[Alias_aliasname][As Type] 其中Lib参数只是用于标识——它用于通知Visual Basic要调用的一个DLL,libname参数是包含的将调用过程的DLL名称,Alias关键字在需要使用与DLL中不同名称的过程时使用。 一个非常重要的问题是API函数的Declare语句必须是Windows所要求的形式,如果省略了ByVal关键字,一般会使系统发生死锁。Visual Basic专业版和企业版的一个很好的特性就是它们提供了一个Windows API函数所需要的所有Declare语句及常量的文件——以及一个处理这个文件的API Viewer程序。可以由Visual Basic项目组或直接从VB目录下的Winapi子目录或通过使用Add_In Manager(程序名称为Aplioad.exe)使其成为内部程序的方式进入API函数信息并将拷贝内容粘到应用程序中。 调用API函数具体步骤如下: 1、打开API Viewer的File菜单,选择需要查看的文件。如果第一次装载Win32api.txt 时,API Viewer会提问是否要将文本文件转换为数据库文件,这样可以使速度有所提高。(见图1所示) 图1 2、在装载了文本文件后,键入要查找的项的首字母,从API Type列表框中选择 需要查看的API部分(Delcares、常量等等)。 3、从Available Items列表框中选择所需的项。 4、点击Copy 按钮可以将选择的项放到剪切板中。(见图2所示) 5、移动代码窗中要将所选内容插入的位置,选择Edit/Paste(或Ctrl+V)以将相应的内容从剪切板拷贝下来。 图2 这里需要指出,为了慎重地使用API函数,必须建立所需文档以说明使用了哪些API函数。 二、工程的建立 首先新建一个工程,保存为“control.vbp”,窗体命名为“control.frx”,向窗体中添加两个Line控件,两个Timer控件与一个Label控件,并按下表设定它们的属性值: 对象名称 属性 属性值 对象名称 属性 属性值 Form1 BackColor &H00000000& Line1 BorderColor &H0000FFFF& Height 4695 BorderWidth 2 Width 3495 X1 1920 Timer1 Enable Ture X2 2880 Interval 100 Y1 2340 Timer2 Enable Ture Y2 2340 Interval 100 Line2 BorderColor &H0000FFFF& Label1 Autosize Ture BorderWidth 2 Backstyle 0-Transparent X1 300 Caption 基于VB平台上的游戏控制器通信 X2 1320 ForeColor &H00FF0000& Y1 2340 Font 楷体_GB2312 Y2 2340 Top 180 三、代码模块的实现 图2 新建一个代码模块,同样命名为“control.bas”,利用上述方法在模块中声明变量: Public Type JOYINFO wXpos As Long ‘游戏控制器X轴坐标 wYpos As Long ‘游戏控制器Y轴坐标 wZpos As Long ‘游戏控制器Z轴坐标 wButtons As Long ‘游戏控制器的按钮 End Type Public Declare Function joySetCapture Lib "winmm.dll" (ByVal hwnd As Long, ByVal uID As Long, ByVal uPeriod As Long, ByVal bChanged As Long) As Long ‘获得游戏控制器的控制权 Public Declare Function joySetThreshold Lib "winmm.dll" (ByVal id As Long, ByVal uThreshold As Long) As Long ‘设置游戏控制器移动范围的最值 Public Declare Function joyReleaseCapture Lib "winmm.dll" (ByVal id As Long) As Long ‘释放游戏控制器所得的数据 Public Declare Function joyGetPos Lib "winmm.dll" (ByVal uJoyID As Long, pji As JOYINFO) As Long ‘读取游戏控制器的数据 四、利用游戏控制器实现模拟飞行姿态 在窗体中加入如下代码: Public y, j, h As Single         ‘声明一些公共变量 Dim x1, y1, x2, y2 As Integer Dim ji As JOYINFO Dim r As Long Private Sub Form_Load( ) '在载入窗体时初始化各种数据 Scale (-1688, 2474)-(1688, -1816) '定义窗体中心位置 Dim ji As JOYINFO '初始化操纵杆数据 r = joySetThreshold(0, 1000) r = joySetCapture(Me.hwnd, 0, 500, 1) r = joyGetPos(0, ji) y = 0 h= 0 Line1.x1 = -350 '初始化飞机姿态线开始位置 Line1.y1 = 0 Line1.x2 = -1100 Line1.y2 = 0 Line2.x1 = 350 Line2.y1 = 0 Line2.x2 = 1100 Line2.y2 = 0 End Sub Private Sub Timer1_Timer() '定义飞机姿态线左右翻转 Dim t As Single r = joyGetPos(0, ji) r = (ji.wXpos - 32760) / 10000 t = r * -1# t = t / 100# j = j + t Call Rotate End Sub Private Sub Timer2_Timer() '定义飞机姿态线上下运动 r = joyGetPos(0, ji) y = (ji.wYpos - 32760) / 1000 Line1.y1 = Line1.y1 + y Line1.y2 = Line1.y2 + y Line2.y1 = Line2.y1 + y Line2.y2 = Line2.y2 + y h= h + y If ji.wButtons = 1 Then ‘当按下按钮时关闭该窗体(具体的按钮顺序可以在控制面板中“游戏控制器”选项中得到) Unload Me End If End Sub Sub Rotate() ‘子程序 Line1.x1 = -350 * Cos(j) Line1.x2 = -1100 * Cos(j) Line1.y1 = 350 * Sin(j) + h Line1.y2 = 1100 * Sin(j) + h Line2.x1 = -Line1.x1 Line2.x2 = -Line1.x2 Line2.y1 = -350 * Sin(j) + h Line2.y2 = -1100 * Sin(j) + h End Sub Private Sub Form_Unload(Cancel As Integer) '在关闭窗体时释放数据 Dim r As Long r = joyReleaseCapture(0) End Sub 上述程序在Windows 98、VB6.0下运行成功。 本文详细介绍了如何使用API函数实现对游戏控制器端口数据的通信方法。通过分析中可以看出,调用不同的API函数,不仅可以实现游戏控制器端口数据的采集,而且还可以实现对声卡数据的采集与即时处理,并可以通过一些数学公式来计算出相应的声卡输出频率特性曲线,用以工程人员开发大型项目。另外,本文还详细介绍了调用API函数的具体过程,掌握API函数的使用可以很方便地实现其它一些特殊任务。如:鼠标的中断事件、鼠标左右键的互换、是否设置键盘状态等等,有利于开发人员创建大型应用项目。 主要参考书目 1、《Visual Basic 6.0从入门到精通》 Gary Cornell 北京希望电子出版社(1999) 2、《Visual Basic 6.0编程实例》 张宏林 人民邮电出版社(1999) 3、《微型计算机原理及应用》(第二版)   郑学坚 清华大学出版社(1995) 作者简介 李密  毕业于郑州大学通信工程专业,现任空军第一航空学院讲师,主要研究方向为通信导航与软件开发。 吕钊  毕业于空军第一航空学院雷达工程专业,现任空军第一航空学院讲师,现从事雷达信号处理。 作者通信地址:河南信阳空军第一航空学院801# 邮编:464000 联系电话:0376-6572050或(0)13939719756
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服