修改Javriphone游戏存档修改之祥细教程

&&PSP游戏存档放哪?
PSP游戏存档放哪?
PSP游戏存档放哪?
具体的文件存放请参照此分级目录 zeK}X)EI ┏ MP_ROOT ━ 101MNV01 ┳ M4V00001.MP4(动画) ^!M8Q9T ┃ ┗ M4V00001.THM y*MyppO+O [root]┫ ┏ GAME )4`bL . ┣ PSP ━━╋ MUSIC ━━ ○○.MP3(音乐) ^KsHEd#J9 ┃ ┣ PHOTO ━━ ○○.JPG(图片) 9iW{7a|oD ┃ ┗ SAVEDATA ?eYz S ┗ DCIM ━━ nnn***** ━ ****nnnn.JPG(画像)※n任意半角数字、*任意半角字符 84*]D]% 动画认识可能的文件名 2=R&5'4?~ 可以 m4v00001.MP4 m4v00001.mp4 M4V00001.mp4 M4V00001.MP4 A\ot5mhk 不可以m4V00001.mp4 M4v00001.MP4 m4v00001.Mp4 M4V00001.mP4 ^eo(~Nea H[$&QX 下面就说明一下如何把我们PC中的音乐和视频资源传入PSP的Memory Stick Duo中,直接COPY进去可是看不了的。 $`f_sDK #?~r) m|U 刚新的MSD卡,必须要在PSP里格式化后才可以用,否则复制进去的影音文件是无法播放的。 d@#OS;&} 操作过程 {`u\sS# 打开PSP后,在左面的项目中选择本体设定,接着选择メモリースティックのフォーマット,然后出现确认提示,稍微玩过日文游戏的朋友都应该认识はい(是)吧。确认后,MS卡就被格式化完毕了,格式化后的MS卡会出现4个新的文件夹GAME MUSIC PHOTO SAVEDATA 听MP3的话就直接把音乐文件拖进MUSIC里就可以,SAVEDATA是保存游戏存档的。 1;s9*M?hf EpiL.J3? 而视频文件则稍微复杂一点。 ?=. {;n5 操作过程 H= 3@ wok S&V3/MMY ^&~AYMv2 1把PSP与你的PC相连接,PC会识别PSP为可移动设备。(当然你的PC和PSP都是开着的,汗) MMB\97@M&& 2在PSP的同级目录里建立名为MP_ROOT的文件夹 /wta?&7 3在此文件夹里再建立一个名为101MNV01的文件夹 0]JaVIe 4最后,将视频文件(MP4格式H.264)放入此文件夹里。然后在PSP的ビデオ选项中就有你刚才放入的视频文件了。 ,a*ak^Wl y^$g%0]c = t i8m  a|hd^p3 在第一次开机后机器会提示输入时间和用户姓名,进入PSP系统后会出现五大菜单。 ;TW`DuH_- $ F-Z 从左往右菜单如下: v3ptW}Y `%u&dk 系统设定 setting )4)(ViA 其中包括(从上至下): GeKPYM&Y, 1、网络升级 network update 详细操作见本论坛中... X],Y'TU 2、USB数据系统连接 USB connection 与电脑连接后电脑并不会开始认取,需要按此功能,然后PSP才能开始与电脑连接。 GcW)l 3、VEDIO设定 video settings 其中分为一、菜单语种menu language 二、声音语种 audio language 三、字幕语种subtitle lan.. 0 |_Rp8*n 四、UMD 影片音量 UMD video volume %zRJIK&K 4、照片设定 photo setting 其中分为 1、滑边滚动清晰速度 slideshow speed z@Mt~RO/ 5、系统设定 system setting 其中分为 一、用户名 nickname 二、系统语种 system language 三、电池信息 battery information #! fWxFot 四、格式化内存 format memory stick 五、恢复到初始设置 restore default settings NY]3Fye\ 六、系统信息 system information 七、关于PSP about PSP c&&&H3&Fl 6、日期设定 date&time settings 其中包括 一、年月日设定 date and time 二、日期格式(年月日,日月年设置) yyyy/mm/dd u?7&!I:gQ^ 三、时间格式(12小时或者24小时制) time format 四、 所在地时区 time zone MFYP3J 五、节省设置(白天下面节省设置)daylights saving 1&cY w&hs 7、电源点亮节省设置 power saver settings 其中包括 一、自动屏暗时间 backlight auto-off 二、自动待机时间 auto sleep eO3aJ\l?U 三、WLAN电源节省开关 WLAN power save gOEE&kA 8、声音设定 sound settings 其中包括 一、 AVLS开关(就是限定音量大小) avls 二、键盘音效 key tone i)@UGL. 9、密码保护 security settings 其中包括 一、更改密码 change password 初始密码是0000 二、家长限定年龄开关(可设定游戏适用年龄) Vgs :7 10、上网设置 network settings 详细请看本论坛... ~GT p  n?Lr\B 照片 photo =H*QMO ? 如果你没有照片在里面 系统将显示 there are no photo in it 表示你没有任何文件在此识别。 W zD) vF bV,-&Q~ 如有照片后打开,然后按三角建,出现上中下三排菜单,功能分别为 eib8,&w& 第一排: 观看模式转换 信息显示 帮助 &8OKax 第二排: 实际大小 缩小 放大 左旋转 右旋转 上移 下移 左移 右移 xRlV!80 第三排: 回放播放(就是一张张自动的看) 前进播放 开始播放 i_p~o_ 音乐 music 4kRHQH9 如果你没有MP3在里面 系统将显示 there are no track in it 表示你没有任何文件在此识别。 g&?X.''X 如果有MP3 的话,进入后按三角就会出现一个菜单,这个和家中的DVD,VCD等播放图片相同用法,这里不作解释。 3CX ;JW v{N&#2g n 影片 video e1Z,ljZ 如果你没有MPEG4在里面 系统将显示 there are no video in it 表示你没有任何文件在此识别。 ig^!]AkC 注意: 此文件中的MPEG4具体通过USB放入PSP内存中的路径和MP3照片是不一样的 D{D@1d]b: 具体请看本论坛资源中的设置方法。 RT$hw$ c 如果有MPEG4的话,进入按三角就会出现一个菜单,这个和家中的DVD,VCD等播放图片相同用法,这里不作解释。 Jf|eoV |Asn&c@) 游戏 game j c&VPa? 1、游戏存档交换互动 game sharing 可以通过无限交换任何内存中的文件 /za4I-H T 2、存档管理 saved data utility 进入后可以看到自己内存中所有的游戏纪录,选择一个后按三角建会在右边出现一个菜单: 10Z~169= 其中包括 : 一、复制 copy )^!A:6 F 二、删除 delete  O~?liYx 三、存档信息 information `GwX(op 3、如果此时你有放游戏光盘进入碟仓的话,这里会出现一个UMD的菜单,按此功能就可以进入游戏。 K]] + 注: 如果在未开机前就放入游戏光盘的话,系统会默认开机后就直接进入游戏。 ^~?M! N.r 4、内存内置游戏 memory stick 现在市面上还没有出任何PSP识别的内存小游戏,相信以后类似模拟器的东西会陆续出来... mOawn|/m @u f@w78 一共五大菜单,基本比较详细。 pSLo'%XQ J/~)vW PSP个键的用途介绍。 }sk)o| 方向十字键,应该不用介绍了。 P&7~&| % 遥感,可以和方向键一个功能,但是在不同的游戏中有不同的作用。 Q@05.Oh 三角键,打开可以浏览文件的小菜单。 Ez S` %H 圆圈键,确认。 ]m![eRk 大差键,取消。 Y1fy;p 方块键,暂时没有起作用与系统功能。 Ie;9& n L键,上一个文件,在看照片,听MP3,看影片时候。 ]W{,XRxq R键,下一个文件,在看照片,听MP3,看影片时候。 AiTzin  下面也有一排小键,功能如下。 ~GaM-w8 HOME键,回到系统的功能,在游戏中退出游戏就靠这个了。 Vvvm4 减号加号键 -+,音量大小键,菜单中按可以看到音量的
提问者的感言:谢谢您的解答!
其他回答31条
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
本回答正在审核中...
问答为您推荐
指导价:¥12000
市场价:¥8400-¥8400
网友正在问
||||||||||
Copyright (C) 1999-, All Rights Reserved 版权所有 天极网络&当前位置: >
【Visual C++】游戏开辟笔记四十二 浅墨DirectX教程之十 游戏输入把握利器:DirectInput专场
发布时间:
发布来源:
p所谓天才,就是尽力的力量&人不克不及绝灭恋情,亦不成沉醉恋情。&本系列文章由zhmxy555(毛星云)编写,转载请注明出处。&&文章链接:&http://blog.csdn.net/zhmxy555/article/details/8547531作者:毛星云(浅墨)&&&&邮箱:&happylifemxy@&&&&在本篇文章中,我们一路具体摸索了DirectInput这套在PC游戏即时把握方面一手遮天的API。下面先来看一下这篇一万多字文章的大体脉络。起首我们对DirectInput接口进行了整体上的讲解,然后深切DirectInput的应用步调进行具体的摸索,最后浅出,归纳出DirectInput应用五步曲,便利大师的快速把握。文章最后,我们配了一个斗劲好玩的demo来让大师对本篇文章所学的DirectInput的应用融合贯通,最后供给了这个demo具体注释的源代码。先放一个demo的截图吊吊大师胃口,哈哈:&&一、引言&众所周知,在通俗的Windows法度中,用户经由过程键盘或者鼠标输入的消息并不是应用法度直接处理惩罚的,而是经由过程Windows的消息机制转发给Windows操纵体系的。Windows操纵体系对这些消息进行响应后,在经由过程回调应用法度的窗口过程函数进行响应的消息处理惩罚。这显然满足不了对于机能请求斗劲尖刻的游戏法度的。在DirectX中,微软为我们供给了名为DirectInput接口对象来实现用户输入的。DirectInput直接和硬件驱动打交道,是以处理惩罚起用户的输入来说很是敏捷。起首须要给大师申明的是,DirectInput这套API自DirectX8更新以来,功能已经足够完美了。所以尽管当前DirectX的最新版本上升到了DirectX 11,DirectInput还是DirectX 8那个版本时代的老样子,API的内容和功能跟着比来几个版本的更迭却原封不动,名称上也保存了8这个版本号,依然叫DirectInput 8,可谓以不变应万变。即今朝最新版本的DirectInput ,依旧是DirectInput 8。&&&二、DirectInput接口概述DirectInput作为DirectX的组件之一,天然依然是一些COM对象的凑集。DirectInput由IDirectInput8、IDirectInputDevice8,IDirectInputEffect这三个接口构成,这三个接口中又分别含有各自的办法。总的来说,当前版本的DirectInputAPI中,三个接口,四十七个办法,构成了这个在电脑游戏开辟中不成或缺的组件。因为IDirectInput8 API整体来说范围不大,说白了也就是三个接口,四十七个办法,不妨我们在文章中将他们一一列举出来,也让大师窥一窥DirectInput API的全貌。&1.IDirectInput8接口 函数一览IDirectInput8::ConfigureDevices MethodIDirectInput8::CreateDevice MethodIDirectInput8::EnumDevices MethodIDirectInput8::EnumDevicesBySemantics MethodIDirectInput8::FindDevice MethodIDirectInput8::GetDeviceStatus MethodIDirectInput8::Initialize MethodIDirectInput8::RunControlPanel Method2.IDirectInputDevice8接口 函数一览IDirectInputDevice8::Acquire MethodIDirectInputDevice8::BuildActionMap MethodIDirectInputDevice8::CreateEffect MethodIDirectInputDevice8::EnumCreatedEffectObjects MethodIDirectInputDevice8::EnumEffects MethodIDirectInputDevice8::EnumEffectsInFile MethodIDirectInputDevice8::EnumObjects MethodIDirectInputDevice8::Escape MethodIDirectInputDevice8::GetCapabilities MethodIDirectInputDevice8::GetDeviceData MethodIDirectInputDevice8::GetDeviceInfo MethodIDirectInputDevice8::GetDeviceState MethodIDirectInputDevice8::GetEffectInfo MethodIDirectInputDevice8::GetForceFeedbackState MethodIDirectInputDevice8::GetImageInfo MethodIDirectInputDevice8::GetObjectInfo MethodIDirectInputDevice8::GetProperty MethodIDirectInputDevice8::Initialize MethodIDirectInputDevice8::Poll MethodIDirectInputDevice8::RunControlPanel MethodIDirectInputDevice8::SendDeviceData MethodIDirectInputDevice8::SendForceFeedbackCommand MethodIDirectInputDevice8::SetActionMap MethodIDirectInputDevice8::SetCooperativeLevel MethodIDirectInputDevice8::SetDataFormat MethodIDirectInputDevice8::SetEventNotification MethodIDirectInputDevice8::SetProperty MethodIDirectInputDevice8::Unacquire MethodIDirectInputDevice8::WriteEffectToFile Method&3.IDirectInputEffect接口 函数一览IDirectInputEffect::Download MethodIDirectInputEffect::Escape MethodIDirectInputEffect::GetEffectGuid MethodIDirectInputEffect::GetEffectStatus MethodIDirectInputEffect::GetParameters MethodIDirectInputEffect::Initialize MethodIDirectInputEffect::SetParameters MethodIDirectInputEffect::Start MethodIDirectInputEffect::Stop MethodIDirectInputEffect::Unload Method&此中,IDirectInput8作为DirectInput API中最首要的接口,用于初始化体系以及创建输入设备接口,DirectInput中其他的所有的接口都须要依附于我们的IDirectInput8之上,都是经由过程这个接口进行查询的。而DirectInputDevice8接口用于默示各类输入设备(如键盘、鼠标和游戏杆),并供给了雷同的接见和把握办法。对于某些输入设备(如游戏杆和鼠标),都能经由过程查询各自的IDirectInputDevice8接口对象,获得另一个接口IDirectInputEffect8。而IDirectInputEffect8接口则用于把握设备的力反馈结果。&&三、DirectInput应用步调详解&1.头文件和库文件的包含&我们起首须要重视的是,在应用DirectInput时,须要包管我们包含了DInput.h头文件,并且在项目中已经链接了DInput8.lib库文件。当然,库文件我们也可以动态添加:#pragma comment(lib, &dinput8.lib&)
// 应用DirectInput必须包含的头文件,重视这里有82.创建DirectInput接口和设备&在DirectInput中我经由过程们调用DirectInputCreate函数创建并初始化IDirectInput接口,我们可以在MSDN中查到该函数的声明如下:&HRESULT DirectInput8Create(
HINSTANCE hinst,
DWORD dwVersion,
REFIID riidltf,
LPVOID * ppvOut,
LPUNKNOWN punkOuter
)■ 第一个参数,HINSTANCE类型的hinst,默示我们当前创建的DirectInput的Windows法度句柄,这个值填我们在WinMain函数的参数中的实例句柄就可以了。■ 第二个参数,DWORD类型的dwVersion,默示我们当前应用的DirectInput版本号,凡是可以取DIRECTINPUT_VERSION或者DIRECTINPUT_HEADER_VERSION,这两个值对应的是同一个值,为0 x0800。所以我们在这里还可以直接填0 x0800。&归根揭底的话,可以经由过程【转到定义】在dinput.h中查到有如下代码:&#define DIRECTINPUT_HEADER_VERSION 0 x0800
#ifndef DIRECTINPUT_VERSION
#define DIRECTINPUT_VERSION
DIRECTINPUT_HEADER_VERSION大体意思很清楚了吧,先定义一下DIRECTINPUT_HEADER_VERSION=0 x0800,然后再说若是没有定义DIRECTINPUT_VERSION的话,就定义一个DIRECTINPUT_VERSION= DIRECTINPUT_HEADER_VERSION。&■ 第三个参数,REFIID类型的riidltf,默示接口的标记,凡是取IID_IDirectInput8就可以了。■ 第四个参数,LPVOID 类型的* ppvOut,用于返回我们新创建的IDirectInput8接口对象的指针。■ 第五个参数,LPUNKNOWN类型的punkOuter,一个和COM对象接口相干的参数,凡是我们设为NULL就可以了。&这个函数履行成功的话TINPUTVER会返回HRESULT类型的DI_OK,而失败的话按照不合的调用失败原因,会返回DIERR_BETADIRECSION,DIERR_INVALIDPARAM,DIERR_OLDDIRECTINPUTVERSION, DIERR_OUTOFMEMORY中的一个。所以我们可以按照FAILED宏来断定我们IDirectInput8接口对象是否创建成功了。下面是一个调用的例子:// 创建DirectInput设备
LPDIRECTINPUT8
g_pDirectInput
if(FAILED(DirectInput8Create(hInstance,0 x0800, IID_IDirectInput8,(void**)&g_pDirectInput, NULL)))
return E_FAIL;这步完成之后,咱们的定义的DIRECTINPUT8接口对象g_pDirectInput就有了权力,新官上任了。在IDirectInput8接口中包含了很多用于初始化输入设备及获得设备接口的办法。此中,常用的办法为EnumDevices和CreateDevices。前者EnumDevices用于获得输入设备的类型,而后者CreateDevices用于为输入设备创建IDirectInputDevice8接口对象。&体系中每一个已安装的设备都有一个体系分派的全局独一标示符(GUID,Global Unique Identification),从英文单词意义上就可以知道,体系中的每个设备都有着独一无二的GUID,这个GUID又独一的标记了体系中的某某设备。就像我们每小我都有着独一无二的的身份证号码。要应用某个设备的话,起首我们就须要知道他的GUID。鼠标和键盘作为我们电脑中最为首要的外设,DirectInput对他们做了特别对待,给了后门,定义了他们的GUID分别为GUID_Keyboard和GUID_SysMouse。而对于其他的输入设备,我们就用上方提到过的EnumDevices办法列举出这些设备,以获得他们的GUID,我们可以在MSDN中查到这个办法有如下声明:&HRESULTEnumDevices(
DWORD dwDevType,
LPDIENUMDEVICESCALLBACKlpCallback,
LPVOID pvRef,
DWORD dwFlags
)■ 第一个参数,DWORD类型的dwDevType,指定我们须要列举的设备类型。可取的值为DI8DEVCLASS_ALL,DI8DEVCLASS_DEVICE,DI8DEVCLASS_GAMECTRL,DI8DEVCLASS_KEYBOARD,DI8DEVCLASS_POINTER中的一个。■ 第二个参数,LPDIENUMDEVICESCALLBACK类型的lpCallback,用于指定一个回调函数的地址,当体系中每找到一个匹配的设备时,就会主动调用这个回调函数。■ 第三个参数,LPVOID类型的pvRef,返回我们当前匹配设备的GUID值。■ 第四个参数,DWORD类型的dwFlags,指定我们列举设备的体式格式。取值可以下面的一个或者多个值:DIEDFL_ALLDEVICES,DIEDFL_ATTACHEDONLY,DIEDFL_FORCEFEEDBACK,DIEDFL_INCLUDEALIASES,DIEDFL_INCLUDEHIDDEN,DIEDFL_INCLUDEPHANTOMS。&取得我们须要应用的设备的GUID后,就可以按照这个GUID来调用IDirectInput8接口的CreateDevice办法,进而来创扶植备的IDirectInputDevice8接口对象了。我们可以在MSDN中查到IDirectInput8::CreateDevice办法的声明如下:&HRESULTCreateDevice(
REFGUID rguid,
LPDIRECTINPUTDEVICE*lplpDirectInputDevice,
LPUNKNOWN pUnkOuter
)& & &&■ 第一个参数,REFGUID类型的rguid,就是填我们上方讲到的输出设备的GUID。体系中当前应用的键盘对应GUID_SysKeyboard,当前应用的鼠标对应GUID_SysMouse。其他设备的话,就用我们方才讲过的EnumDevices获取一下就行了。■ 第二个参数,LPDIRECTINPUTDEVICE类型的*lplpDirectInputDevice,默示我们所创建的输入设备对象的指针地址,可以说调用这个CreateDevice参数就是在初始化这个参数。■ 第三个参数,LPUNKNOWN类型的pUnkOuter,、和COM对象的IUnknown接口相干的一个参数,一般我们不去管它,设为NULL就可以了。&讲解完了,当然得看一个调用实例。下面的代码中CreateDevice办法的第二个参数我们填的是GUID_SysMouse,所以我们在为体系鼠标创建一个DirectInput设备接口对象:LPDIRECTINPUTDEVICE8
g_pMouseDevice
if(FAILED (g_pDirectInput-&CreateDevice(GUID_SysKeyboard,&g_pKeyboardDevice,NULL)))
return E_FAIL;&&3.设置数据格局&数据格局用于默示设备状况信息的存储体式格式,每种设备都有一种用于读取对应数据的特定命据格局,所以对每种设备都要差别对待。所以要使法度从设备读入数据的话,起首我们须要告诉DirectInput读取这种数据所采取的格局。设置数据格局凡是我们都是经由过程IDirectInputDevice8接口的SetDataFormat办法来做到的,这个办法可以把设备的数据格局填充到一个DIDATAFORMAT接口类型的对象。该办法的声明如下:HRESULT SetDataFormat(
LPCDIDATAFORMAT lpdf
)SetDataFormat办法独一的变量就是LPCDIDATAFORMAT类型的lpdf,DirectInput已经为我们筹办好了一些备选的参数,下面是一个列表:
c_dfDIkeyboard
标准键盘布局,包含256个字符,每个字符对应着每个键
c_dfDIMouse
标准鼠标布局,带有3个轴和4个按钮
c_dfDIMouse2
扩大鼠标布局,带有3个轴和8个按钮
c_dfDIJoystick
标准游戏杆,带有三个定位轴,3个扭转轴,两个滑块,1个POV hat和32个按钮
c_dfDIJoystick2
扩大的游戏杆 依然是一个调用实例,设置鼠标的数据格局:g_pMouseDevice-&SetDataFormat(&c_dfDIMouse);4.设置协作级别&在Windows操纵体系中,体系中的每个应用法度都凡是会应用多个输入设备,并且同一输入设备也可能被多个应用法度同时应用。是以,须要一种体式格式来共享和调和应用法度对设备的接见。在DirectInput中,祭出的是协作级别(Cooperative Level)这套处理惩罚体式格式。协作级别定义了过程与其他应用法度和操纵体系共享设备的体式格式。设备一旦创建就须要设置它的协作级别,协作级别默示了应用法度对设备的把握权。DirectInput的协作级别可以以两套规划来分类:前台、后台模式和共享、独有模式。Ⅰ.前台模式与后台模式&此中,前台模式默示只有当窗口处于激活状况时,才干获得设备的把握权。而当处于非激活状况时,会主动落空设备的把握权;后台模式默示可以在任何状况下获取设备,即使是在窗口处于非激活状况时。后天模式可以被任何应用法度在任何时辰应用并获取设备数据。Ⅱ.共享模式与独有模式共享模式默示多个应用法度可以共同应用该设备,而独有模式默示应用法度是独一应用该设备的应用法度。这里须要重视一下,独有模式并非意味着其他应用法度不克不及获取输入设备状况,若是过程同时应用了后台模式与独有模式的话,当其他过程申请了独有模式的话,这个过程就会落空设备的把握权。我们通俗都是经由过程IDirectInputDevice8接口的SetCooperativeLevel办法来设置设备的协作级此外,我们可以在MSDN中查到SetCooperativeLevel的声明如下:HRESULT SetCooperativeLevel(
HWND hwnd,
DWORD dwFlags
)■ 第一个参数,HWND类型的hwnd,显然就是填想要与当前设备相接洽关系的窗口句柄了,且这个窗口须要属于当前过程的窗口。■ 第二个参数,DWORD类型的dwFlags,描述了当前设备的协作级别类型,也就是填我们上方讲到的前台、后台模式和共享、独有模式等一些模式的标识符,可取一个值到多个值,浅墨把取值鄙人表中出来了:
协作级别类型
DISCL_BACKGROUND
后台模式,一般我们让他与DISCL_NONEXCLUSIVE(非独有模式)共同应用
DISCL_FOREGROUND
前台模式,一般我们让他与DISCL_EXCLUSIVE(独有模式)共同应用
DISCL_EXCLUSIVE
DISCL_NONEXCLUSIVE
非独有(共享)模式
DISCL_NOWINKEY
让键盘上烦人的Windows键失效&&&&&&&&&& 重视,后台模式和独有模式不克不及同时选择,用脚丫子来想都知道他们两个组合起来不合适逻辑,既然都是在后台了,还谈什么独有呢?下面依旧是一个调用实例,将鼠标设备的协作级别设为前台、独有模式: g_pMouseDevice-&SetCooperativeLevel(hwnd,DISCL_FOREGROUND |DISCL_EXCLUSIVE);&&5.设置特别属性&设备的特别属性包含设备的数据模式、缓冲区大小、以及设备的最小最大局限等等。DirectInput为我们供给了SetProperty办法来设置设备的特别属性,我们可以在MSDN中查到这个办法有如下原型:HRESULT SetProperty(&&&&&&& REFGUID rguidProp,&&&&&&& LPCDIPROPHEADER pdiph)这个办法通俗用得不算多,因为篇幅原因暂且先不具体讲了,须要用的时辰大师去查一下文档就可以了。6.获取和轮询设备起首是一个常识,在接见和应用任何输入设备之前,起首必须获得该输入设备的把握权。权力这器材,人人都喜好,对其趋附者众,在我们的策画机中也不例外。其他的法度随时都可能勾心斗角,争夺并抢走对输入设备的把握权。所以我们在应用之前,往往都要从头获取一下设备的把握权,以确保权力在我们手中。在DirectInput中,权力的敲门砖为IDirectInput8接口的Acquire办法,我们可以在MSDN中查到这个“权力权杖”有如下的原型:HRESULT Acquire()我们可以发明他简简单单清清白白,没有参数,返回值为HRESULT。调用起来当然是很是简单:g_pMouseDevice-&Acquire();为了大师看起来简明扼要,咱们这里没有效if和FAILD宏给他括起来,进行错误处理惩罚。别的须要重视的是,在获得输入设备的把握权之前,必须先调用IDirectInputDevice8接口的SetDataFormat或者SetActionMap办法来设置一下数据格局,不然我们调用Acquire办法的话,将直接给我们返回DIERR_INVALIDPARAM错误的。别的须要讲到的是轮询。轮询可以筹办在合适的景象下读取设备数据。因为数据可能具有临界时候的。这个轮询的原型也是很是很是的简单:HRESULT Poll()轮询用起来当然也是很是简单的:g_pMouseDevice -&Poll();&7.读取设备信息&在Direct3D应用法度中,拿到对输入设备的把握权之后,就可调用IDirectInputDevice8接口的GetDeviceState办法来读取设备的数据。而为了存储设备的数据信息,在调用该办法时,须传递一个数据缓冲区给GetDeviceState办法,这个GetDeviceState办法的原型我们可以在MSDN中查到是如下:&HRESULT GetDeviceState(
DWORD cbData,
LPVOID lpvData
)■ 第一个参数,DWORD类型的cbData,指定了我们缓冲区的大小(具体是哪个缓冲区在第二个参数中)。■ 第二个参数,LPVOID类型的lpvData,默示一个获取当前设备状况的布局体的地址值。他的数据格局和我们之前调用的IDirectInputDevice8::SetDataFormat办法有着前后呼应的亲近接洽。下面我们经由过程一个表格来看看是如何接洽的:
SetDataFormat中指定的数据格局
GetDeviceState中对应的缓冲区布局体
c_dfDIMouse
DIMOUSESTATE布局体
c_dfDIMouse2
DIMOUSESTATE2布局体
c_dfDIKeyboard
大小为256个字节的数组
c_dfDIJoystick
DIJOYSTATE布局体
c_dfDIJoystick2
DIJOYSTATE2布局体 &比如,我们先调用了SetDataFormat设置了设备的数据格局为c_dfDIMouse:&g_pMouseDevice-&SetDataFormat(&c_dfDIMouse);&那么我们在读取设备信息的时辰调用GetDeviceState就须要把第二个参数填与dfDIMouse对应的DIMOUSESTATE布局体的一个实例:DIMOUSESTATE dimouse
g_pMouseDevice-& GetDeviceState(sizeof(dimouse),(LPVOID)&dimouse);&对此,我们可以抽象出一个函数,专门对于疑难杂症,应对各类类型的设备的数据读取,并且还推敲到了设备若是丧失掉了,在合适的时候主动从头获取该设备:&//*****************************************************************************************
// Name: Device_Read();
// Desc: 智能读取设备的输入数据
//*****************************************************************************************
BOOL Device_Read(IDirectInputDevice8*pDIDevice, void* pBuffer, longlSize)
while(true)
pDIDevice-&Poll();
// 轮询设备
pDIDevice-&Acquire();
// 获取设备的把握权
if(SUCCEEDED(hr = pDIDevice-&GetDeviceState(lSize, pBuffer)))
if(hr !=DIERR_INPUTLOST || hr != DIERR_NOTACQUIRED) return FALSE;
if(FAILED(pDIDevice-&Acquire())) return FALSE;
returnTRUE;
}&&到这一步之后,就是调用一下Device_Read来读取数据了。调用之后,我们的键位数据其实就存在了g_pKeyStateBuffer之中,我们接下来要做的就是用if语句对g_pKeyStateBuffer数组中对应的键位进行摸索,看看这个键是否被按下了。若是按下,就进行相干的处理惩罚就可以了,比如:Device_Read(g_pKeyboardDevice,(LPVOID)g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer));
if (g_pKeyStateBuffer[DIK_A] & 0 x80)
fPosX -= 0.005f;当然,在最后,应用完输入设备后,必须调用IDirectInputDevice8接口的Unacquire办法开释设备的把握权,所谓的杯酒释兵权,且须要接着调用Release办法开释掉设备接口对象。g_pMouseDevice-&Unacquire();
g_pMouseDevice-&Release();&四、精华精辟:DirectInput应用五步曲&上方讲解了洋洋洒洒七千字,信息量有些大,为了凸起下重点,落实到一个字“用”上,让大师有的放矢,快速把握DirectInput的应用办法。浅墨在这里依旧是来一个应用几步曲的归纳,首要以代码为载体,把上方讲得常识归纳一下。这回的DirectInput同样是五步曲。须要申明下的是,下面的代码是关于处理惩罚键盘消息的,而对于鼠标设备,须要改的处所很是少,也就是在第一步调用CreateDevice办法时GUID填GUID_SysKeyboard,然后在第二步SetDataFormat中填c_dfDIKeyboard就可以了(相干常识上方我们有具体讲到)。对于其他设备。依然是改这两个处所,其他设备的GUID用EnumDevices列举一下就知道了,空话也不久不多说,下面就开端DirectInput应用五步曲的讲解:&这五步曲分别是:&一、创键DirectInput接口和设备,简称创设备二、设置数据格局和协作级别,简称设格局三、获取设备把握权,简称拿权力四、获取按键景象并做响应,简称取按键五、开释把握权和接口对象,简称释对象&&&DirectInput应用五步曲载体代码:&//起首是全局变量的定义
LPDIRECTINPUTDEVICE8
g_pKeyboardDevice
g_pKeyStateBuffer[256] ={0};
//--------------------------------------------------------------------------------------―----------------
//【DirectInput应用五步曲之一】,创键DirectInput接口和设备,简称创设备
//--------------------------------------------------------------------------------------―----------------
//创建DirectInput设备
DirectInput8Create(hInstance,0 x0800, IID_IDirectInput8,(void**)&g_pDirectInput, NULL);
g_pDirectInput-&CreateDevice(GUID_SysKeyboard,&g_pKeyboardDevice,NULL);
//--------------------------------------------------------------------------------------―----------------
//【DirectInput应用五步曲之二】,设置数据格局和协作级别,简称设格局
//--------------------------------------------------------------------------------------―----------------
//设置数据格局和协作级别
g_pKeyboardDevice-&SetDataFormat(&c_dfDIKeyboard);
g_pKeyboardDevice-&SetCooperativeLevel(hwnd,DISCL_FOREGROUND |DISCL_NONEXCLUSIVE);
//--------------------------------------------------------------------------------------―----------------
//【DirectInput应用五步曲之三】,.获取设备把握权,简称拿权力
//--------------------------------------------------------------------------------------―----------------
g_pKeyboardDevice-&Acquire();
//--------------------------------------------------------------------------------------―----------------
//【DirectInput应用五步曲之四】,.获取按键景象并做响应,简称取按键
//--------------------------------------------------------------------------------------―----------------
// 读取键盘输入
::ZeroMemory(g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer));
Device_Read(g_pKeyboardDevice,(LPVOID)g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer));
//定义的全局函数
BOOL Device_Read(IDirectInputDevice8*pDIDevice, void* pBuffer, longlSize)
while(true)
pDIDevice-&Poll();
// 轮询设备
pDIDevice-&Acquire();
// 获取设备的把握权
if(SUCCEEDED(hr = pDIDevice-&GetDeviceState(lSize, pBuffer)))
if(hr !=DIERR_INPUTLOST || hr != DIERR_NOTACQUIRED) return FALSE;
if(FAILED(pDIDevice-&Acquire())) return FALSE;
returnTRUE;
//然后就是用if断定并做响应了,如下面一句代码
if (g_pKeyStateBuffer[DIK_A] & 0 x80)fPosX -= 0.005f;
//--------------------------------------------------------------------------------------―----------------
//【DirectInput应用五步曲之五】,.开释把握权和接口对象,简称释对象
//--------------------------------------------------------------------------------------―----------------
g_pKeyboardDevice-&Unacquire();
SAFE_RELEASE(g_pKeyboardDevice)所以,上述DirectInput应用五步曲精华精辟总结起来就十五个字:&创设备,设格局,拿权力,取按键,释对象&五、DirectInput键盘按键键值总结&与一般的Windows应用法度比拟,DirectInput处理惩罚键盘事务的体式格式是有很多独特之处的。起首,在我们写的游戏法度中,键盘首要并不是用于文字输入的,而是用于把握3D世界中人物,对象的活动,或者视角的变换等等。且在游戏法度中我们经常只须要知道具体是哪个键被按下,而忽视了该键所对应的字符。所以我们只需读取已按下键的扫描码就可以了。别的,为了进步法度运行的效力,DirectInput并非应用Windows中的消息机制来读取键盘的状况,而是直接读取硬件的状况获取按键的扫描码的。我们在遵守流程创建好和打理好DirectInput之后,就能在法度中络续获取从键盘输入的那些键盘数据。而在法度中,我们须要定义一个大小为256字节的数组,此中的每一个字节都存储一个按键的状况,如许就可以保存256个按键的状况信息了。微软在DirectInput中为每个键都设置了一个对应的宏,这些宏都是以DIK_为前缀的。例如C键就定义为DIK_C,主键盘数字键8就对应DIK_8等等,下面就是浅墨对DirectInput键码做的一个总结表格,查起来很是便利:
DirectInput键码
DIK_0~ DIK_9
主键盘上数字键0~9
DIK_A~ DIK_Z
DIK_F1~ DIK_F15
功能键F1~F15
DIK_NUMPAD0~ DIK_NUMPAD9
DIK_ESCAPE,DIK_TAB, DIK_BACK
Esc键,Tab键,退格键
DIK_RETURN,DIK_SPACE,DIK_NUMBERENTER
回车键、空格键、小键盘回车键,
DIK_LSHIFT, DIK_RSHIFT
阁下Shift键
DIK_LMENU, DIK_RMENU
阁下菜单键
DIK_LALT, DIK_RALT
DIK_LCONTROL, DIK_RCONTROL
阁下Ctrl键
DIK_UPARROW, DIK_DOWNARROW
DIK_LEFTARROW, DIK_RIGHTARROW
高低阁下标的目标键
DIK_HOME, DIK_DELETE, DIK_INSERT
Home键,Delete键,Insert键
DIK_PRIOR, DIK_NEXT, DIK_END
PageUp键,PageDown键,End键 &比如我们要检测左Alt键是否按下,按下的话就做出响应,就可以在上表中找到左Alt键的键码为DIK_LALT,然后就是一句if(& ){ }语句:if (g_pKeyStateBuffer[DIK_A] & 0 x80)
fPosX -= 0.005f;&六、DirectInput鼠标按键键值总结&在凡是的Windows应用法度中,体系检测鼠标的移动并经由过程消息处理惩罚函数将鼠标的移动作为消息呈报给用户,然而如许做的效力很是低下,因为传递给消息处理惩罚函数的每个消息起首都要走消息队列这条“官道”,须要慢悠悠地在消息队列中列队,列队完全满足不了我们对游戏即时处理惩罚消息的请求。而在Direct3D中,咱们就可以潘磕嫦吆竺帕耍颐强梢灾苯油蟊甑那ǘ冉薪换ィ幌呦⒍恿姓馓趼朴频摹肮俚馈薄别的,我们有两种体式格式来跟踪鼠标的移动为:绝对模式和相对模式。在绝对模式下,鼠标是基于某个固定点的,这个点凡是是屏幕左上角,而此时返回的鼠标坐标是鼠标指针所处地位在屏幕坐标系中的坐标。而别的一种模式,也就是相对模式下,鼠标坐标则是按照上一个已知地位到当前地位所产生的移动量来获得鼠标的坐标值的。在相对模式下获得的鼠标坐标是一个相对地位,而非绝对地位,大师须要重视。好了,回到正题上来。在DirectInput中,鼠标的移动信息我们凡是都是经由过程一个名叫DIMOUSESTATE布局体来记录的,我们可以在MSDN中查到这个布局体定义如下:&typedef struct DIMOUSESTATE {
BYTE rgbButtons[4];
} DIMOUSESTATE, *LPDIMOUSESTATE;&这个布局体中,lX,lY,lZ分别记录了X轴,Y轴和Z轴(鼠标滚轮的相对移动量,鼠标没移动的话,他们的值就是0.)。而布局体中的第四个参数rgbButtons[4]记录了四个按钮的状况信息,此中rgbButtons[0]代表鼠标左键,rgbButtons[1]对应鼠标右键。若是须要处理惩罚支撑更多按钮的鼠标的话,就去用DIMOUSESTATE2布局体吧。下面我们来看看实例:&DIMOUSESTATE
g_diMouseState
::ZeroMemory(&g_diMouseState,sizeof(g_diMouseState));
Device_Read(g_pMouseDevice,(LPVOID)&g_diMouseState,sizeof(g_diMouseState));
//按住鼠标左键并拖动,为平移操纵
staticFLOAT fPosX =0.0f, fPosY = 30.0f, fPosZ = 0.0f;
if(g_diMouseState.rgbButtons[0] & 0 x80)
fPosX+=g_diMouseState.lX *
fPosY+=g_diMouseState.lY * -0.08f;
}&&&&七、具体注释的源代码观赏&起首须要申明的是,本篇文章配套的源代码顶用到了我们今朝还未讲到的一点技巧,就是X模型的载入。源代码中X模型的载入相干的代码大师若是看不懂没紧要,请锁定浅墨的博客,后面必然会有相干技巧出色的讲解的。& &然后这篇文章中的demo我们对细节项目组做了进级,新加了三个功能,他们分别是:1.在窗口左上角智能读取运行的机械应用的显卡名称。2.在窗口左下角给出了帮助信息。3. 在窗口左上角给出了模型当前的三维坐标。下面我们分别来对这三个新功能进行讲解:1.在窗口左上角智能读取运行的机械应用的显卡名称。这个其实很简单,借助一个GetAdapterIdentifier办法就可以了。这个办法可以获取获取显卡的厂商类型等信息。原型如下:HRESULT GetAdapterIdentifier(
UINT Adapter,
DWORD Flags,
D3DADAPTER_IDENTIFIER9*pIdentifier
);重视到第三个参数类型是一个D3DADAPTER_IDENTIFIER9布局体,这个布局体的第三个参数Description就保存着显卡的名称的char类型的字符串。思路也就是环绕着这个GetAdapterIdentifier办法来的,用GetAdapterIdentifier办法取得显卡的名称的char类型的字符串,然后转换成wchar_t类型并在显卡名称之前拼接上“当前显卡型号:”字样,然后把成果存在全局的字符串数组g_strAdapterName中,最后在Render函数顶用TextOut写出来就可以了。别的重视一点,因为IDirect3D9::GetAdapterIdentifier是IDirect3D9中的办法,而在我们的代码中IDirect3D9接口对象仅局部存在于Direct3D_Init( )办法中,所以我们绝大项目组实现代码是在这个Direct3D_Init( )办法中完成的。具体做法咱们直接看代码,这可是每行都具体注释的代码:&&&&&& 起首是一个全局变量:wchar_t
g_strAdapterName[60]={0};
//包含显卡名称的字符数组&然后就是Direct3D_Init( )办法中的功能实现代码://获取显卡信息到g_strAdapterName中,并在显卡名称之前加上“当前显卡型号:”字符串
wchar_tTempName[60]=L&当前显卡型号:&;
//定义一个姑且字符串,且便利了把&当前显卡型号:&字符串引入我们的目标字符串中
D3DADAPTER_IDENTIFIER9A
//定义一个D3DADAPTER_IDENTIFIER9布局体,用于存储显卡信息
pD3D-&GetAdapterIdentifier(0,0,&Adapter);//调用GetAdapterIdentifier,获取显卡信息
int len =MultiByteToWideChar(CP_ACP,0,Adapter.Description, -1, NULL, 0);//显卡名称如今已经在Adapter.Description中了,然则其为char类型,我们要将其转为wchar_t类型
MultiByteToWideChar(CP_ACP, 0,Adapter.Description, -1, g_strAdapterName,len);//这步操纵完成后,g_strAdapterName中就为当前我们的显卡类型名的wchar_t型字符串了
wcscat_s(TempName,g_strAdapterName);//把当前我们的显卡名加到“当前显卡型号:”字符串后面,成果存在TempName中
wcscpy_s(g_strAdapterName,TempName);//把TempName中的成果拷贝到全局变量g_strAdapterName中,大功成功~最后就是在Direct3D_Render函数中调用一下DrawText显示出来了:&//显示显卡类型名
g_pTextAdaperName-&DrawText(NULL,g_strAdapterName,-1,&formatRect,
DT_TOP| DT_LEFT, D3DXCOLOR(1.0f, 0.5f, 0.0f, 1.0f));& & & & &&&2.在窗口左下角给出帮助信息。其实很是简单,就是定义一些LPD3DXFONT接口对象,然后在Objects_Init()函数顶用D3DXCreateFont创建不合的字体,最后在Direct3D_Render全DrawText出来就行了。&&3.&在窗口左上角给出了模型当前的三维坐标。其实也很是简单,就是用swprintf_s把世界矩阵g_matWorld的几个分量格局化到一个静态的wchar_t类型的字符串中,然后DrawText出来就可以了。&实现代码如下:& & & && staticwchar_tstrInfo[256] = {0};
swprintf_s(strInfo,-1,L&模型坐标: (%.2f,%.2f, %.2f)&,g_matWorld._41, g_matWorld._42, g_matWorld._43);
g_pTextHelper-&DrawText(NULL,strInfo, -1, &formatRect, DT_SINGLELINE| DT_NOCLIP | DT_LEFT,D3DCOLOR_RGBA(135,239,136,255));还有一点,因为推敲到咱们的Direct3D_Render()函数中的代码跟着讲解的络续深切,代码越来越多,越来越杂,越来越乱。所以我们给他配了一个错误Direct3D_Update(),跟即时绘制没有直接接洽然则须要即时调用的,如按键后的坐标的更改,按键后填充模式的更改等等相干的代码,都放在Direct3D_Update()中了,如许就给Direct3D_Render()绘制函数减了负,看起来加倍清楚。因为也是即时调用,所以Direct3D_Update()在消息轮回中与Direct3D_Render()平起平坐了:& //消息轮回过程
MSGmsg = { 0 };
//初始化msg
while(msg.message !=WM_QUIT )
//应用while轮回
if(PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
//查看应用法度消息队列,有消息时将队列中的消息派发出去。
TranslateMessage(&msg );
//将虚拟键消息转换为字符消息
DispatchMessage(&msg );
//该函数分发一个消息给窗口法度。
Direct3D_Update(hwnd);
//调用更新函数,进行画面的更新
Direct3D_Render(hwnd);
//调用衬着函数,进行画面的衬着
}最后一点,DirectInput应用五步曲的第四步,即获取按键状况并进行响应就是在Direct3D_Update中实现的:void
Direct3D_Update( HWND hwnd)
// 获取键盘消息并赐与设置响应的填充模式
if (g_pKeyStateBuffer[DIK_1]
// 若数字键1被按下,进行实体填充
g_pd3dDevice-&SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
if (g_pKeyStateBuffer[DIK_2]
// 若数字键2被按下,进行线框填充
g_pd3dDevice-&SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
// 读取鼠标输入
::ZeroMemory(&g_diMouseState, sizeof(g_diMouseState));
Device_Read(g_pMouseDevice, (LPVOID)&g_diMouseState, sizeof(g_diMouseState));
// 读取键盘输入
::ZeroMemory(g_pKeyStateBuffer, sizeof(g_pKeyStateBuffer));
Device_Read(g_pKeyboardDevice, (LPVOID)g_pKeyStateBuffer, sizeof(g_pKeyStateBuffer));
// 按住鼠标左键并拖动,为平移操纵
static FLOAT fPosX = 0.0f, fPosY = 30.0f, fPosZ = 0.0f;
if (g_diMouseState.rgbButtons[0] & 0 x80)
fPosX += g_diMouseState.lX *
fPosY += g_diMouseState.lY * -0.08f;
//鼠标滚轮,为调查点紧缩操纵
fPosZ += g_diMouseState.lZ * 0.02f;
// 平移物体
if (g_pKeyStateBuffer[DIK_A] & 0 x80) fPosX -= 0.005f;
if (g_pKeyStateBuffer[DIK_D] & 0 x80) fPosX += 0.005f;
if (g_pKeyStateBuffer[DIK_W] & 0 x80) fPosY += 0.005f;
if (g_pKeyStateBuffer[DIK_S] & 0 x80) fPosY -= 0.005f;
D3DXMatrixTranslation(&g_matWorld, fPosX, fPosY, fPosZ);
// 按住鼠标右键并拖动,为扭转操纵
static float fAngleX = 0.15f, fAngleY = -(float)D3DX_PI ;
if (g_diMouseState.rgbButtons[1] & 0 x80)
fAngleX += g_diMouseState.lY * -0.01f;
fAngleY += g_diMouseState.lX * -0.01f;
// 扭转物体
if (g_pKeyStateBuffer[DIK_UP]
& 0 x80) fAngleX += 0.005f;
if (g_pKeyStateBuffer[DIK_DOWN]
& 0 x80) fAngleX -= 0.005f;
if (g_pKeyStateBuffer[DIK_LEFT]
& 0 x80) fAngleY -= 0.005f;
if (g_pKeyStateBuffer[DIK_RIGHT] & 0 x80) fAngleY += 0.005f;
D3DXMATRIX Rx, Ry;
D3DXMatrixRotationX(&Rx, fAngleX);
D3DXMatrixRotationY(&Ry, fAngleY);
g_matWorld = Rx * Ry * g_matW
g_pd3dDevice-&SetTransform(D3DTS_WORLD, &g_matWorld);
Matrix_Set();
}& & & &&&嗯,讲解完成,下面我们就贴出完全的具体注释的demo的源代码:&//*****************************************************************************************
//【Visual C++】游戏开辟笔记系列配套源码 四十二 浅墨DirectX教程之十 游戏输入把握利器 : DirectInput专场
// 2012年 1月27日
Create by 浅墨
//图标及素材: 《仙剑奇侠传五前传》 瑕
//此刻表情:既然选择了远方,便只顾风雨兼程
//*****************************************************************************************
//*****************************************************************************************
// Desc: 宏定义项目组
//*****************************************************************************************
#define SCREEN_WIDTH 800
//为窗口宽度定义的宏,以便利在此处批改窗口宽度
#define SCREEN_HEIGHT 600
//为窗口高度定义的宏,以便利在此处批改窗口高度
#define WINDOW_TITLE _T(&【Visual C++游戏开辟笔记】博文配套demo之四十二 浅墨DirectX教程之十 游戏输入把握利器 : DirectInput专场&) //为窗口题目定义的宏
#define DIRECTINPUT_VERSION 0 x0800
//指定DirectInput版本,防止DIRECTINPUT_VERSION undefined警告
#define SAFE_RELEASE(p) { if(p) { (p)-&Release(); (p)=NULL; } }
//自定义一个SAFE_RELEASE()宏,便于COM资料的开释
#define SAFE_DELETE(p)
{ if(p) {
(p); (p)=NULL; } }
//*****************************************************************************************
// Desc: 头文件定义项目组
//*****************************************************************************************
#include &d3d9.h&
#include &d3dx9.h&
#include &tchar.h&
#include &time.h&
#include &dinput.h&
// 应用DirectInput必须包含的头文件,重视这里没有8
//*****************************************************************************************
// Desc: 库文件定义项目组
//*****************************************************************************************
#pragma comment(lib,&d3d9.lib&)
#pragma comment(lib,&d3dx9.lib&)
#pragma comment(lib, &dinput8.lib&)
// 应用DirectInput必须包含的头文件,重视这里有8
#pragma comment(lib,&dxguid.lib&)
#pragma comment(lib, &winmm.lib&)
//*****************************************************************************************
// Desc: 全局变量声明项目组
//*****************************************************************************************
LPDIRECT3DDEVICE9
g_pd3dDevice = NULL; //Direct3D设备对象
LPD3DXFONT
g_pTextFPS
//字体COM接口
LPD3DXFONT
g_pTextAdaperName
// 显卡信息的2D文本
LPD3DXFONT
g_pTextHelper
// 帮助信息的2D文本
LPD3DXFONT
g_pTextInfor
// 绘制信息的2D文本
//一个浮点型的变量,代表帧速度
g_strFPS[50]={0};
//包含帧速度的字符数组
g_strAdapterName[60]={0};
//包含显卡名称的字符数组
LPDIRECTINPUT8
g_pDirectInput
= NULL; //
LPDIRECTINPUTDEVICE8
g_pMouseDevice
DIMOUSESTATE
g_diMouseState
LPDIRECTINPUTDEVICE8
g_pKeyboardDevice
g_pKeyStateBuffer[256] = {0};
D3DXMATRIX
//世界矩阵
LPD3DXMESH
= NULL; // 网格的对象
D3DMATERIAL9*
g_pMaterials
= NULL; // 网格的材质信息
LPDIRECT3DTEXTURE9* g_pTextures
= NULL; // 网格的纹理信息
g_dwNumMtrls
// 材质的数量
//*****************************************************************************************
// Desc: 全局函数声明项目组
//*****************************************************************************************
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
Direct3D_Init(HWND hwnd,HINSTANCE hInstance);
Objects_Init();
Direct3D_Render( HWND hwnd);
Direct3D_Update( HWND hwnd);
Direct3D_CleanUp( );
Get_FPS();
Matrix_Set();
BOOL Device_Read(IDirectInputDevice8 *pDIDevice, void* pBuffer, long lSize) ;
//*****************************************************************************************
// Name: WinMain( )
// Desc: Windows应用法度进口函数
//*****************************************************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
//开端设计一个完全的窗口类
WNDCLASSEX wndClass = { 0 };
//用WINDCLASSEX定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化
wndClass.cbSize = sizeof( WNDCLASSEX ) ; //设置布局体的字节数大小
wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口的样式
wndClass.lpfnWndProc = WndP
//设置指向窗口过程函数的指针
wndClass.cbClsExtra
wndClass.cbWndExtra
wndClass.hInstance = hI
//指定包含窗口过程的法度的实例句柄。
wndClass.hIcon=(HICON)::LoadImage(NULL,_T(&icon.ico&),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //从全局的::LoadImage函数从本地加载自定义ico图标
wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
//指定窗口类的光标句柄。
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
//为hbrBackground成员指定一个灰色画刷句柄
wndClass.lpszMenuName = NULL;
//用一个以空终止的字符串,指定菜单资料的名字。
wndClass.lpszClassName = _T(&ForTheDreamOfGameDevelop&);
//用一个以空终止的字符串,指定窗口类的名字。
if( !RegisterClassEx( &wndClass ) )
//设计完窗口后,须要对窗口类进行注册,如许才干创建该类型的窗口
return -1;
HWND hwnd = CreateWindow( _T(&ForTheDreamOfGameDevelop&),WINDOW_TITLE,
//喜闻乐见的创建窗口函数CreateWindow
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, SCREEN_WIDTH,
SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );
//Direct3D资料的初始化,调用失败用messagebox予以显示
if (!(S_OK==Direct3D_Init (hwnd,hInstance)))
MessageBox(hwnd, _T(&Direct3D初始化失败~!&), _T(&浅墨的消息窗口&), 0); //应用MessageBox函数,创建一个消息窗口
MoveWindow(hwnd,200,50,SCREEN_WIDTH,SCREEN_HEIGHT,true);
//调剂窗口显示时的地位,窗口左上角位于屏幕坐标(200,50)处
ShowWindow( hwnd, nShowCmd );
//调用Win32函数ShowWindow来显示窗口
UpdateWindow(hwnd);
//对窗口进行更新,就像我们买了新房子要装修一样
//消息轮回过程
MSG msg = { 0 };
//初始化msg
while( msg.message != WM_QUIT )
//应用while轮回
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
//查看应用法度消息队列,有消息时将队列中的消息派发出去。
TranslateMessage( &msg );
//将虚拟键消息转换为字符消息
DispatchMessage( &msg );
//该函数分发一个消息给窗口法度。
Direct3D_Update(hwnd);
//调用更新函数,进行画面的更新
Direct3D_Render(hwnd);
//调用衬着函数,进行画面的衬着
UnregisterClass(_T(&ForTheDreamOfGameDevelop&), wndClass.hInstance);
//*****************************************************************************************
// Name: WndProc()
// Desc: 对窗口消息进行处理惩罚
//*****************************************************************************************
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
//窗口过程函数WndProc
switch( message )
//switch语句开端
case WM_PAINT:
// 客户区重绘消息
Direct3D_Render(hwnd);
//调用Direct3D_Render函数,进行画面的绘制
ValidateRect(hwnd, NULL);
// 更新客户区的显示
//跳出该switch语句
case WM_KEYDOWN:
// 键盘按下消息
if (wParam == VK_ESCAPE)
DestroyWindow(hwnd);
// 烧毁窗口, 并发送一条WM_DESTROY消息
case WM_DESTROY:
//窗口烧毁消息
Direct3D_CleanUp();
//调用Direct3D_CleanUp函数,清理COM接口对象
PostQuitMessage( 0 );
//向体系注解有个线程有终止恳求。用来响应WM_DESTROY消息
//跳出该switch语句
//若上述case前提都不合适,则履行该default语句
return DefWindowProc( hwnd, message, wParam, lParam );
//调用缺省的窗口过程来为应用法度没有处理惩罚的窗口消息供给缺省的处理惩罚。
//正常退出
//*****************************************************************************************
// Name: Direct3D_Init( )
// Desc: 初始化Direct3D
// Point:【Direct3D初始化四步曲】
1.初始化四步曲之一,创建Direct3D接口对象
2.初始化四步曲之二,获取硬件设备信息
3.初始化四步曲之三,填充布局体
4.初始化四步曲之四,创建Direct3D设备接口
//*****************************************************************************************
HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance)
//--------------------------------------------------------------------------------------
// 【Direct3D初始化四步曲之一,创接口】:创建Direct3D接口对象, 以便用该Direct3D对象创建Direct3D设备对象
//--------------------------------------------------------------------------------------
LPDIRECT3D9
pD3D = NULL; //Direct3D接口对象的创建
if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口对象,并进行DirectX版本协商
return E_FAIL;
//--------------------------------------------------------------------------------------
// 【Direct3D初始化四步曲之二,取信息】:获取硬件设备信息
//--------------------------------------------------------------------------------------
D3DCAPS9 int vp = 0;
if( FAILED( pD3D-&GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) )
return E_FAIL;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
//支撑硬件顶点运算,我们就采取硬件顶点运算,妥妥的
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支撑硬件顶点运算,无奈只好采取软件顶点运算
//--------------------------------------------------------------------------------------
// 【Direct3D初始化四步曲之三,填内容】:填充D3DPRESENT_PARAMETERS布局体
//--------------------------------------------------------------------------------------
D3DPRESENT_PARAMETERS d3
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth
= SCREEN_WIDTH;
d3dpp.BackBufferHeight
= SCREEN_HEIGHT;
d3dpp.BackBufferFormat
= D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount
d3dpp.MultiSampleType
= D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality
d3dpp.SwapEffect
= D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow
d3dpp.Windowed
d3dpp.EnableAutoDepthStencil
d3dpp.AutoDepthStencilFormat
= D3DFMT_D24S8;
d3dpp.Flags
d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.PresentationInterval
= D3DPRESENT_INTERVAL_IMMEDIATE;
//--------------------------------------------------------------------------------------
// 【Direct3D初始化四步曲之四,创设备】:创建Direct3D设备接口
//--------------------------------------------------------------------------------------
if(FAILED(pD3D-&CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
hwnd, vp, &d3dpp, &g_pd3dDevice)))
return E_FAIL;
//获取显卡信息到g_strAdapterName中,并在显卡名称之前加上“当前显卡型号:”字符串
wchar_t TempName[60]=L&当前显卡型号:&;
//定义一个姑且字符串,且便利了把&当前显卡型号:&字符串引入我们的目标字符串中
D3DADAPTER_IDENTIFIER9 A
//定义一个D3DADAPTER_IDENTIFIER9布局体,用于存储显卡信息
pD3D-&GetAdapterIdentifier(0,0,&Adapter);//调用GetAdapterIdentifier,获取显卡信息
int len = MultiByteToWideChar(CP_ACP,0, Adapter.Description, -1, NULL, 0);//显卡名称如今已经在Adapter.Description中了,然则其为char类型,我们要将其转为wchar_t类型
MultiByteToWideChar(CP_ACP, 0, Adapter.Description, -1, g_strAdapterName, len);//这步操纵完成后,g_strAdapterName中就为当前我们的显卡类型名的wchar_t型字符串了
wcscat_s(TempName,g_strAdapterName);//把当前我们的显卡名加到“当前显卡型号:”字符串后面,成果存在TempName中
wcscpy_s(g_strAdapterName,TempName);//把TempName中的成果拷贝到全局变量g_strAdapterName中,大功成功~
//--------------------------------------------------------------------------------------
// 【DirectInput应用五步曲的前三步】:创设备,设格局,拿权力。在为鼠标设备初始化
//--------------------------------------------------------------------------------------
// 创建DirectInput接口和设备
DirectInput8Create(hInstance, 0 x0800, IID_IDirectInput8, (void**)&g_pDirectInput, NULL);
g_pDirectInput-&CreateDevice(GUID_SysKeyboard, &g_pMouseDevice, NULL);
// 设置数据格局和协作级别
g_pDirectInput-&CreateDevice(GUID_SysMouse, &g_pMouseDevice, NULL);
g_pMouseDevice-&SetDataFormat(&c_dfDIMouse);
//获取设备把握权
g_pMouseDevice-&Acquire();
//--------------------------------------------------------------------------------------
// 【DirectInput应用五步曲的前三步】:创设备,设格局,拿权力。在为键盘设备初始化
//--------------------------------------------------------------------------------------
// 创建DirectInput接口和设备
DirectInput8Create(hInstance, 0 x0800, IID_IDirectInput8, (void**)&g_pDirectInput, NULL);
g_pDirectInput-&CreateDevice(GUID_SysKeyboard, &g_pKeyboardDevice, NULL);
// 设置数据格局和协作级别
g_pKeyboardDevice-&SetDataFormat(&c_dfDIKeyboard);
g_pKeyboardDevice-&SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
//获取设备把握权
g_pKeyboardDevice-&Acquire();
if(!(S_OK==Objects_Init())) return E_FAIL;
SAFE_RELEASE(pD3D) //LPDIRECT3D9接口对象的任务完成,我们将其开释掉
return S_OK;
HRESULT Objects_Init()
//创建字体
D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1000, false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T(&Calibri&), &g_pTextFPS);
D3DXCreateFont(g_pd3dDevice, 20, 0, 1000, 0, false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L&汉文中宋&, &g_pTextAdaperName);
D3DXCreateFont(g_pd3dDevice, 23, 0, 1000, 0, false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L&微软雅黑&, &g_pTextHelper);
D3DXCreateFont(g_pd3dDevice, 26, 0, 1000, 0, false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L&黑体&, &g_pTextInfor);
// 从X文件中加载网格数据
LPD3DXBUFFER pAdjBuffer
LPD3DXBUFFER pMtrlBuffer = NULL;
D3DXLoadMeshFromX(L&loli.x&, D3DXMESH_MANAGED, g_pd3dDevice,
&pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh);
// 读取材质和纹理数据
D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer-&GetBufferPointer();
g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls];
g_pTextures
= new LPDIRECT3DTEXTURE9[g_dwNumMtrls];
for (DWORD i=0; i&g_dwNumM i++)
g_pMaterials[i] = pMtrls[i].MatD3D;
g_pMaterials[i].Ambient = g_pMaterials[i].D
g_pTextures[i]
D3DXCreateTextureFromFileA(g_pd3dDevice, pMtrls[i].pTextureFilename, &g_pTextures[i]);
pAdjBuffer-&Release();
pMtrlBuffer-&Release();
// 设置衬着状况
g_pd3dDevice-&SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
//开启后头消隐
g_pd3dDevice-&SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f)); //设置景象光
g_pd3dDevice-&SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);//设置为线性纹理过滤
g_pd3dDevice-&SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
return S_OK;
//*****************************************************************************************
// Name:Matrix_Set()
// Desc: 设置世界矩阵
// Point:【Direct3D四大变换】
1.【四大变换之一】:世界变换矩阵的设置
2.【四大变换之二】:取景变换矩阵的设置
3.【四大变换之三】:投影变换矩阵的设置
4.【四大变换之四】:视口变换的设置
//*****************************************************************************************
void Matrix_Set()
//--------------------------------------------------------------------------------------
//【四大变换之一】:世界变换矩阵的设置
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
//【四大变换之二】:取景变换矩阵的设置
//--------------------------------------------------------------------------------------
D3DXMATRIX matV //定义一个矩阵
D3DXVECTOR3 vEye(0.0f, 0.0f, -250.0f);
//摄像机的地位
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); //调查点的地位
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);//向上的向量
D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //策画出取景变换矩阵
g_pd3dDevice-&SetTransform(D3DTS_VIEW, &matView); //应用取景变换矩阵
//--------------------------------------------------------------------------------------
//【四大变换之三】:投影变换矩阵的设置
//--------------------------------------------------------------------------------------
D3DXMATRIX matP //定义一个矩阵
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f,(float)((double)SCREEN_WIDTH/SCREEN_HEIGHT),1.0f, 1000.0f); //策画投影变换矩阵
g_pd3dDevice-&SetTransform(D3DTS_PROJECTION, &matProj);
//设置投影变换矩阵
//--------------------------------------------------------------------------------------
//【四大变换之四】:视口变换的设置
//--------------------------------------------------------------------------------------
D3DVIEWPORT9 //实例化一个D3DVIEWPORT9布局体,然后做填空题给各个参数赋值就可以了
//默示视口相对于窗口的X坐标
//视口相对对窗口的Y坐标
= SCREEN_WIDTH; //视口的宽度
vp.Height = SCREEN_HEIGHT; //视口的高度
= 0.0f; //视口在深度缓存中的最小深度值
= 1.0f; //视口在深度缓存中的最大深度值
g_pd3dDevice-&SetViewport(&vp); //视口的设置
Direct3D_Update( HWND hwnd)
// 获取键盘消息并赐与设置响应的填充模式
if (g_pKeyStateBuffer[DIK_1]
// 若数字键1被按下,进行实体填充
g_pd3dDevice-&SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
if (g_pKeyStateBuffer[DIK_2]
// 若数字键2被按下,进行线框填充
g_pd3dDevice-&SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
// 读取鼠标输入
::ZeroMemory(&g_diMouseState, sizeof(g_diMouseState));
Device_Read(g_pMouseDevice, (LPVOID)&g_diMouseState, sizeof(g_diMouseState));
// 读取键盘输入
::ZeroMemory(g_pKeyStateBuffer, sizeof(g_pKeyStateBuffer));
Device_Read(g_pKeyboardDevice, (LPVOID)g_pKeyStateBuffer, sizeof(g_pKeyStateBuffer));
// 按住鼠标左键并拖动,为平移操纵
static FLOAT fPosX = 0.0f, fPosY = 30.0f, fPosZ = 0.0f;
if (g_diMouseState.rgbButtons[0] & 0 x80)
fPosX += g_diMouseState.lX *
fPosY += g_diMouseState.lY * -0.08f;
//鼠标滚轮,为调查点紧缩操纵
fPosZ += g_diMouseState.lZ * 0.02f;
// 平移物体
if (g_pKeyStateBuffer[DIK_A] & 0 x80) fPosX -= 0.005f;
if (g_pKeyStateBuffer[DIK_D] & 0 x80) fPosX += 0.005f;
if (g_pKeyStateBuffer[DIK_W] & 0 x80) fPosY += 0.005f;
if (g_pKeyStateBuffer[DIK_S] & 0 x80) fPosY -= 0.005f;
D3DXMatrixTranslation(&g_matWorld, fPosX, fPosY, fPosZ);
// 按住鼠标右键并拖动,为扭转操纵
static float fAngleX = 0.15f, fAngleY = -(float)D3DX_PI ;
if (g_diMouseState.rgbButtons[1] & 0 x80)
fAngleX += g_diMouseState.lY * -0.01f;
fAngleY += g_diMouseState.lX * -0.01f;
// 扭转物体
if (g_pKeyStateBuffer[DIK_UP]
& 0 x80) fAngleX += 0.005f;
if (g_pKeyStateBuffer[DIK_DOWN]
& 0 x80) fAngleX -= 0.005f;
if (g_pKeyStateBuffer[DIK_LEFT]
& 0 x80) fAngleY -= 0.005f;
if (g_pKeyStateBuffer[DIK_RIGHT] & 0 x80) fAngleY += 0.005f;
D3DXMATRIX Rx, Ry;
D3DXMatrixRotationX(&Rx, fAngleX);
D3DXMatrixRotationY(&Ry, fAngleY);
g_matWorld = Rx * Ry * g_matW
g_pd3dDevice-&SetTransform(D3DTS_WORLD, &g_matWorld);
Matrix_Set();
//*****************************************************************************************
// Name: Direct3D_Render()
// Desc: 进行图形的衬着操纵
// Point:【Direct3D衬着五步曲】
1.衬着五步曲之一,清屏操纵
2.衬着五步曲之二,开端绘制
3.衬着五步曲之三,正式绘制
4.衬着五步曲之四,停止绘制
5.衬着五步曲之五,翻转显示
//*****************************************************************************************
void Direct3D_Render(HWND hwnd)
//--------------------------------------------------------------------------------------
// 【Direct3D衬着五步曲之一】:清屏操纵
//--------------------------------------------------------------------------------------
g_pd3dDevice-&Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//定义一个矩形,用于获取主窗口矩形
RECT formatR
GetClientRect(hwnd, &formatRect);
//--------------------------------------------------------------------------------------
// 【Direct3D衬着五步曲之二】:开端绘制
//--------------------------------------------------------------------------------------
g_pd3dDevice-&BeginScene();
// 开端绘制
//--------------------------------------------------------------------------------------
// 【Direct3D衬着五步曲之三】:正式绘制,哄骗顶点缓存绘制图形
//--------------------------------------------------------------------------------------
// 绘制网格
for (DWORD i = 0; i & g_dwNumM i++)
g_pd3dDevice-&SetMaterial(&g_pMaterials[i]);
g_pd3dDevice-&SetTexture(0, g_pTextures[i]);
g_pMesh-&DrawSubset(i);
//在窗口右上角处,显示每秒帧数
int charCount = swprintf_s(g_strFPS, 20, _T(&FPS:%0.3f&), Get_FPS() );
g_pTextFPS-&DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_RGBA(0,239,136,255));
//显示显卡类型名
g_pTextAdaperName-&DrawText(NULL,g_strAdapterName, -1, &formatRect,
DT_TOP | DT_LEFT, D3DXCOLOR(1.0f, 0.5f, 0.0f, 1.0f));
// 输出绘制信息
formatRect.top = 30;
static wchar_t strInfo[256] = {0};
swprintf_s(strInfo,-1, L&模型坐标: (%.2f, %.2f, %.2f)&, g_matWorld._41, g_matWorld._42, g_matWorld._43);
g_pTextHelper-&DrawText(NULL, strInfo, -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(135,239,136,255));
// 输出帮助信息
formatRect.left = 0,formatRect.top = 380;
g_pTextInfor-&DrawText(NULL, L&把握申明:&, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(235,123,230,255));
formatRect.top += 35;
g_pTextHelper-&DrawText(NULL, L&
按住鼠标左键并拖动:平移模型&, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
formatRect.top += 25;
g_pTextHelper-&DrawText(NULL, L&
按住鼠标右键并拖动:扭转模型&, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
formatRect.top += 25;
g_pTextHelper-&DrawText(NULL, L&
滑动鼠标滚轮:拉伸模型&, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
formatRect.top += 25;
g_pTextHelper-&DrawText(NULL, L&
W、S、A、D键:平移模型 &, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
formatRect.top += 25;
g_pTextHelper-&DrawText(NULL, L&
上、下、左、右标的目标键:扭转模型 &, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
formatRect.top += 25;
g_pTextHelper-&DrawText(NULL, L&
数字键1和2:在实体填充与线框填充之间切换&, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
formatRect.top += 25;
g_pTextHelper-&DrawText(NULL, L&
ESC键 : 退出法度&, -1, &formatRect,
DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255));
//--------------------------------------------------------------------------------------
// 【Direct3D衬着五步曲之四】:停止绘制
//--------------------------------------------------------------------------------------
g_pd3dDevice-&EndScene();
// 停止绘制
//--------------------------------------------------------------------------------------
// 【Direct3D衬着五步曲之五】:显示翻转
//--------------------------------------------------------------------------------------
g_pd3dDevice-&Present(NULL, NULL, NULL, NULL);
// 翻转与显示
//*****************************************************************************************
// Name:Get_FPS()函数
// Desc: 用于策画帧速度
//*****************************************************************************************
float Get_FPS()
//定义四个静态变量
static float
fps = 0; //我们须要策画的FPS值
static int
frameCount = 0;//帧数
static float
currentTime =0.0f;//当前时候
static float
lastTime = 0.0f;//连气儿时候
frameCount++;//每调用一次Get_FPS()函数,帧数自增1
currentTime = timeGetTime()*0.001f;//获取体系时候,此中timeGetTime函数返回的是以毫秒为单位的体系时候,所以须要乘以0.001,获得单位为秒的时候
//若是当前时候减去连气儿时候大于了1秒钟,就进行一次FPS的策画和连气儿时候的更新,并将帧数值清零
if(currentTime - lastTime & 1.0f) //将时候把握在1秒钟
fps = (float)frameCount /(currentTime - lastTime);//策画这1秒钟的FPS值
lastTime = currentT //将当前时候currentTime赋给连气儿时候lastTime,作为下一秒的基准时候
frameCount
= 0;//将本次帧数frameCount值清零
//*****************************************************************************************
// Name: Device_Read();
// Desc: 智能读取设备的输入数据
//*****************************************************************************************
BOOL Device_Read(IDirectInputDevice8 *pDIDevice, void* pBuffer, long lSize)
while (true)
pDIDevice-&Poll();
// 轮询设备
pDIDevice-&Acquire();
// 获取设备的把握权
if (SUCCEEDED(hr = pDIDevice-&GetDeviceState(lSize, pBuffer)))
if (hr != DIERR_INPUTLOST || hr != DIERR_NOTACQUIRED) return FALSE;
if (FAILED(pDIDevice-&Acquire())) return FALSE;
return TRUE;
//*****************************************************************************************
// Name: Direct3D_CleanUp()
// Desc: 对Direct3D的资料进行清理,开释COM接口对象
//*****************************************************************************************
void Direct3D_CleanUp()
//开释COM接口对象
g_pMouseDevice-&Unacquire();
g_pKeyboardDevice-&Unacquire();
for (DWORD i = 0; i&g_dwNumM i++)
SAFE_RELEASE(g_pTextures[i]);
SAFE_DELETE(g_pTextures)
SAFE_DELETE(g_pMaterials)
SAFE_RELEASE(g_pMesh)
SAFE_RELEASE(g_pTextFPS)
SAFE_RELEASE(g_pd3dDevice)
SAFE_RELEASE(g_pMouseDevice)
SAFE_RELEASE(g_pKeyboardDevice)
}编译并运行上方的代码,我们可以获得如下截图,浅墨的电脑为联想Y560,显卡确切为ATI HD 5730无误,和我们智能读取的一致。大师可以这个demo归去运行下,看看是否是正确地读出了各位的显卡型号。我们可以经由过程按住鼠标左键或者右键并拖动鼠标或者按键盘上的WASD以及高低阁下标的目标键,来以各个方位调查这个可爱loli的模型(如同有点险恶啊.......-O-):&&文章最后,依旧是放出本篇文章配套源代码的:&本节笔记配套源代码请点击这里:&&【浅墨DirectX进步班】配套源代码之十&&此中图标素材是仙五前传中的瑕以上就是本节笔记的全部内容,更多出色内容,且听下回分化。&浅墨在这里,喜好游戏开辟系列文章的伴侣们能留下你们的评论,每次浅墨登岸博客看到大师的留言的时辰都邑很是高兴,感触感染本身正在传递一种崇奉,一种精力。然则有时辰你们的评论太多了,浅墨一一答复不过来,在这里给大师说声抱愧~~&&文章最后,依然是【每文一语】栏目,今天是汪国真的诗《酷爱生命》:&我不去想,是否可以或许成功。既然选择了远方,便只顾风雨兼程。我不去想可否博得恋情,既然钟情于玫瑰,就大胆的透露竭诚。我不去想身后会不会袭来北风冷雨,既然目标是地平线,留给世界的只能是背影。我不去想,将来是平坦还是泥泞,只要酷爱生命,一切,都在料想之中。&&下周一,让我们离游戏开辟的胡想更近一步。下周一,游戏开辟笔记,我们,不见不散。&德怀特}

我要回帖

更多关于 iphone游戏存档修改 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信