} } }
return S_OK; }
请注意,上面的这段代码只是一个示例,重在使你明白其原理,但并不能满足游戏的需求,因为这其中只查询了一次键盘的全部信息,做了一次轮循,而在游戏中要周期性地查询,并轮循,这就需要你自己用Win32 API函数 SetTimer和 KillTimer 设置初始化 DirectInput 对象函数中在相应的地方设置计计时器,让windows定时向程序发送 WM_TIMER消息,你要通过此消息进行周期性地键盘查询,并在相应的地方解除计时器。
最后一个函数是用于释放指针或DirectInput对象的
void ReleaseDInput(void) {
if (lpDirectInput) {
if(lpKeyboard) {
// Always unacquire the device before calling Release(). lpKeyboard->Unacquire(); lpKeyboard->Release(); lpKeyboard = NULL; }
lpDirectInput->Release(); lpDirectInput = NULL; } }
在这些函数中的注释很明确,关键在于理解其原理,而怎样将他们融入到 Win32 API 程序的基本框架中的,在<<动画程序编写——DirectDraw之旅>> 1-3中的示例代码中已经解释得很明确了,在此不再赘述。不过我们提供其中的代码示例下载。同时你也可以去仔细阅读DirectX 8.0 SDK 包中的 samples\\ multimedia\\ directdraw\\ fullscreenmode 或 \\ samples\\ multimedia\\ directdraw\\
windowedmode 这两个工程中的文件,因为为了我们的示例也是照这两个工程改编过来的,读者可以通过仔细阅读代码和对比我们的更改,而更加了解
DirectDraw的运行运行原理。(请注意:是 DirectX 8.0 SDK 包中的示例,而在 9.0 中 DirectX SDK 已经不提供 DirectDraw的示例代码了) 我们就用这七个函数就已经可以创造出一个小游戏了。
我们下面就要利用<<动画程序编写——DirectDraw之旅>> 1-3 中所用的代码进行进一部的游戏开发。
我们先展示一下 DirectX中\\ samples\\ multimedia\\ directdraw\\ windowedmode 工程中的截图
在这个动画中有黑色背景,并有很多 DirectX 精灵在漂浮。
这是一个全屏的动画程序,而我们在<<动画程序编写——DirectDraw之旅>> 1-3其中做的改动就是为其加了一个背景,改屏幕分辨率 640×480 为 1024×768.注意,因为我们应用的是全屏模式,即可以独占显存资源,所以我们可以更改屏幕的分辨率。这只是做的小小的改动,而我们的目的只在于让大家更加深入了解。且看下面的这副截图:
而我们还要继续深入编程,我们的思路是,先将程序由先前的全屏程序改编成一个windows的窗口程序,然后将其所有的界面翻新,并改编 DirectX精灵为许多小蘑菇在漂浮,还要加入DirectInput 的组建,用键盘控制一个小娃娃。可以上下左右,并可以斜向飞行。 我们先将此动画的截图展现给大家
怎么样,你有什么想法,是想说:“唉,这还不好办,就是又多加了一个!”,但不要光看截图,不要忘记,我们一定让她动起来,并且是可以控制的,这就不是那么简单的事了!
什么?若有人看到这里感到有些迷茫和泄气,不禁想问:“你说了这么多,那么源代码在那里呢!,光给我们几个函数,又能做什么呢?”,如果你这么想,你也不要太急迫。我们还是先分析一下程序框架吧。
不过,还有一件重要的事情,我还是要重申一边。一定要将 DirectX 的头文件价,和lib文件夹加入到 Visual C++.NET 的默认目录中去,这样编译器就可以正确地找到它们了。
如果你不会加入,就请通过工具栏上的 Tool -> Option? 打开Option 对话框,设置如图:
好了,这样我们的准备工作就算已经做好了。 来看看我们的工程文件结构吧,还有工程中的资源。
在工程资源中我们的 ID 号是都用的字符串表示的,笔者认为这样更加方便。 我想对于工程文件中的 ddutil.cpp 和 dxutil.cpp 文件,读者如果了解有些 DirectDraw编程是不会感到陌生的,我们只是将其引入到我们的工程中了。而我们自己实际编程的文件是 outfly.cpp 文件。
我们的程序叙述如下:
首先进行宏定义,结构设置,和全局变量的声明。
后在 WinMain (windows程序的入口点)中首先初始化一切需要初始化的物件(有windows窗口,DirectDraw对象,和 DirectInput对象),在此我们就调用前文讲过的函数,但要有写改动,读者在会在后面看到的。然后进入消息循环,在其中没有消息时,程序会自动更新画面,在有消息时处理消息。 当遇到 WM_QUIT 消息后,结束整个程序。
我们在一些地方有一些小小的改动,我们来看看吧。 1 我们在 HRESULT InitDirectInput( HWND hWnd ) 函数中的开始加入了
KillTimer( hWnd, 0 ); FreeDirectInput();
关掉上一次使用的计时器,并释放 DirectInput 设备。 而在最后加入了
SetTimer( hWnd, 0, 1000 / 100, NULL );
用来重新设置计时器。
2 我们在主窗口的消息处理函数中加入了
case WM_ACTIVATE: //当程序先失去焦点,而现在有重新得到焦点时,要重新锁定键盘资源
if( WA_INACTIVE != wParam && g_pKeyboard ) {
// Make sure the device is acquired, if we are gaining focus. g_pKeyboard->Acquire(); }
break;
case WM_TIMER: //因为设置了计时器所以要处理此消息 if( FAILED( ReadImmediateData( hWnd ) ) ) {
KillTimer( hWnd, 0 );
MessageBox( NULL, _T(\ _T(\
_T(\ }
break;
case WM_DESTROY:// Cleanup and close the app
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库游戏编程文章搜集资料(3)在线全文阅读。
相关推荐: