您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于VB平台的游戏控制器端口数据通信-在VB中如何读取游
1基于VB平台的游戏控制器端口数据通信李密吕钊(空军第一航空学院电子工程系464000)[摘要]本文详细分析了API函数调用的基本方法,在此基础上介绍了如何实现游戏控制器端口的数据通讯。[关键词]API,窗体,工程TOACHIEVECOMMUNICATIONSOFTHEGAMECONTROLLERBASEDONVBLV-ZHAOLI-MI(ThefirstAeronauticalCollegeofAir-Force.464000Xinyang,HenanProvince)[Abstract]ThisarticleintroducesthewaythathowtoapplyAPIfunction,andanalyzestheprocessofachievingcommunicationsofthegamecontrollerbasedonVB.[keywords]API,Form,ProjectorVisualBasic是Microsoft推出的功能强大的集成式开发环境。它以其易学易用深受广大电脑爱好者的喜爱。在使用VB编程过程中,我们经常需要调用WindowsAPI函数来实现一些特殊的功能。WindowsAPI是Windows中可供任何Windows应用访问的函数的集合,它包含了成千上万的函数、例程、类型和常数定义,可以定义为三个主要的动态链接库和几个较小的DLL。VisualBasic本身便是600多个WindowsAPI函数轴取到高层的结果,而Windows提供的所有功能几乎都可以在API函数中找到。准确地调用API函数便是VB编程的精髓所在。在利用VB进行精确图像处理,尤其是在编写仿真、模拟应用软件时,合理正确地调用API以实现对外设接口的数据通信则显得尤为重要。笔者在利用VB开发某飞机综合训练模拟器过程中,经过反复调试,实现了通过调用API函数来即时读取游戏控制器的端口数据,并由此控制飞行姿态,以达到利用游戏控制器来模拟飞机操纵杆的目的。经调试,总结出用以完成精确读取游戏控制器端口数据的方法。一、API函数的调用要调用API函数,就需要一种特别的声明,这种声明比一般变量声明要复2杂,它们被称为Declare语句。Declare语句一般具有两种可能的形式。对于DLL中的子程序(没有返回值),使用如下Declare语句:[Public/Private]DeclareSubnameLib“libname”[Alias_aliasname][(areglist)]而对函数(有返回值),则使用如下语句:[Public/Private]DeclareFunctionnameLib“libname”[Alias_aliasname][AsType]其中Lib参数只是用于标识——它用于通知VisualBasic要调用的一个DLL,libname参数是包含的将调用过程的DLL名称,Alias关键字在需要使用与DLL中不同名称的过程时使用。一个非常重要的问题是API函数的Declare语句必须是Windows所要求的形式,如果省略了ByVal关键字,一般会使系统发生死锁。VisualBasic专业版和企业版的一个很好的特性就是它们提供了一个WindowsAPI函数所需要的所有Declare语句及常量的文件——以及一个处理这个文件的APIViewer程序。可以由VisualBasic项目组或直接从VB目录下的Winapi子目录或通过使用Add_InManager(程序名称为Aplioad.exe)使其成为内部程序的方式进入API函数信息并将拷贝内容粘到应用程序中。调用API函数具体步骤如下:1、打开APIViewer的File菜单,选择需要查看的文件。如果第一次装载Win32api.txt时,APIViewer会提问是否要将文本文件转换为数据库文件,这样可以使速度有所提高。(见图1所示)2、在装载了文本文件后,键入要查找的项的首字母,从APIType列表框中选择需要查看的API部分(Delcares、常量等等)。3、从AvailableItems列表框中选择所需的项。4、点击Copy按钮可以将选择的项放到剪切板中。(见图2所示)5、移动代码窗中要将所选内容插入的位置,选择Edit/Paste(或Ctrl+V)以将相应的内容从剪切板拷贝下来。这里需要指出,为了慎重地使用API函数,必须建立所需文档以说明使用了哪些API函数。图1图23二、工程的建立首先新建一个工程,保存为“control.vbp”,窗体命名为“control.frx”,向窗体中添加两个Line控件,两个Timer控件与一个Label控件,并按下表设定它们的属性值:对象名称属性属性值对象名称属性属性值Form1BackColor&H00000000&Line1BorderColor&H0000FFFF&Height4695BorderWidth2Width3495X11920Timer1EnableTureX22880Interval100Y12340Timer2EnableTureY22340Interval100Line2BorderColor&H0000FFFF&Label1AutosizeTureBorderWidth2Backstyle0-TransparentX1300Caption基于VB平台上的游戏控制器通信X21320ForeColor&H00FF0000&Y12340Font楷体_GB2312Y22340Top180三、代码模块的实现新建一个代码模块,同样命名为“control.bas”,利用上述方法在模块中声明变量:PublicTypeJOYINFOwXposAsLong‘游戏控制器X轴坐标wYposAsLong‘游戏控制器Y轴坐标wZposAsLong‘游戏控制器Z轴坐标wButtonsAsLong‘游戏控制器的按钮EndTypePublicDeclareFunctionjoySetCaptureLibwinmm.dll(ByValhwndAsLong,ByValuIDAsLong,ByValuPeriodAsLong,ByValbChangedAsLong)AsLong‘获得游戏控制器的控制权PublicDeclareFunctionjoySetThresholdLibwinmm.dll(ByValidAsLong,ByValuThresholdAsLong)AsLong‘设置游戏控制器移动范围的最值PublicDeclareFunctionjoyReleaseCaptureLibwinmm.dll(ByValidAsLong)AsLong‘释放游戏控制器所得的数据图24PublicDeclareFunctionjoyGetPosLibwinmm.dll(ByValuJoyIDAsLong,pjiAsJOYINFO)AsLong‘读取游戏控制器的数据四、利用游戏控制器实现模拟飞行姿态在窗体中加入如下代码:Publicy,j,hAsSingle‘声明一些公共变量Dimx1,y1,x2,y2AsIntegerDimjiAsJOYINFODimrAsLongPrivateSubForm_Load()'在载入窗体时初始化各种数据Scale(-1688,2474)-(1688,-1816)'定义窗体中心位置DimjiAsJOYINFO'初始化操纵杆数据r=joySetThreshold(0,1000)r=joySetCapture(Me.hwnd,0,500,1)r=joyGetPos(0,ji)y=0h=0Line1.x1=-350'初始化飞机姿态线开始位置Line1.y1=0Line1.x2=-1100Line1.y2=0Line2.x1=350Line2.y1=0Line2.x2=1100Line2.y2=0EndSubPrivateSubTimer1_Timer()'定义飞机姿态线左右翻转DimtAsSingler=joyGetPos(0,ji)r=(ji.wXpos-32760)/10000t=r*-1#5t=t/100#j=j+tCallRotateEndSubPrivateSubTimer2_Timer()'定义飞机姿态线上下运动r=joyGetPos(0,ji)y=(ji.wYpos-32760)/1000Line1.y1=Line1.y1+yLine1.y2=Line1.y2+yLine2.y1=Line2.y1+yLine2.y2=Line2.y2+yh=h+yIfji.wButtons=1Then‘当按下按钮时关闭该窗体(具体的按钮顺序可以在控制面板中“游戏控制器”选项中得到)UnloadMeEndIfEndSubSubRotate()‘子程序Line1.x1=-350*Cos(j)Line1.x2=-1100*Cos(j)Line1.y1=350*Sin(j)+hLine1.y2=1100*Sin(j)+hLine2.x1=-Line1.x1Line2.x2=-Line1.x2Line2.y1=-350*Sin(j)+hLine2.y2=-1100*Sin(j)+hEndSubPrivateSubForm_Unload(CancelAsInteger)'在关闭窗体时释放数据DimrAsLongr=joyReleaseCapture(0)EndSub6上述程序在Windows98、VB6.0下运行成功。本文详细介绍了如何使用API函数实现对游戏控制器端口数据的通信方法。通过分析中可以看出,调用不同的API函数,不仅可以实现游戏控制器端口数据的采集,而且还可以实现对声卡数据的采集与即时处理,并可以通过一些数学公式来计算出相应的声卡输出频率特性曲线,用以工程人员开发大型项目。另外,本文还详细介绍了调用API函数的具体过程,掌握API函数的使用可以很方便地实现其它一些特殊任务。如:鼠标的中断事件、鼠标左右键的互换、是否设置键盘状态等等,有利于开发人员创建大型应用项目。主要参考书目1、《VisualBasic6.0从入门到精通》GaryCornell北京希望电子出版社(1999)2、《VisualBasic6.0编程实例》张宏林人民邮电出版社(1999)3、《微型计算机原理及应用》(第二版)郑学坚清华大学出版社(1995)作者简介李密毕业于郑州大学通信工程专业,现任空军第一航空学院讲师,主要研究方向为通信导航与软件开发。吕钊毕业于空军第一航空学院雷达工程专业,现任空军第一航空学院讲师,现从事雷达信号处理。作者通信地址:河南信阳空军第一航空学院801#邮编:464000联系电话:0376-6572050或(0)13939719756
本文标题:基于VB平台的游戏控制器端口数据通信-在VB中如何读取游
链接地址:https://www.777doc.com/doc-315467 .html