?? 游戲開發(fā)中心----游戲?qū)嶒?yàn)室 - 博客園.htm
字號(hào):
size=2> GDI+的C++接口中包括大約40個(gè)類、50個(gè)枚舉和6個(gè)結(jié)構(gòu)。聽起來雖然不多,但是這也足夠勝任大多數(shù)應(yīng)用了。<BR> GDI編寫程序的優(yōu)點(diǎn)是他基本上兼容所有的顯示設(shè)備,但是這是以損失效率為代價(jià)的。通常,編寫應(yīng)用程序時(shí),大多數(shù)桌面應(yīng)用程序用到的只是相對(duì)穩(wěn)定的圖形圖像顯示,所以在這種情況下,使用GDI是很實(shí)用的。<BR>可是,在開發(fā)對(duì)圖形圖像顯示速度要求非常高的游戲程序時(shí),GDI就顯得不夠強(qiáng)勁了。所以,我們把開發(fā)游戲的圖形圖像顯示部分的重?fù)?dān)交給了下面就要介紹的DirectX。<BR><BR>GDI學(xué)習(xí)參考:《Windows
Program With
MFC》中的GDI部分。<BR><BR><B>2.DirectX</B><BR> 談到DirectX或許你不會(huì)陌生,因?yàn)橄窈芏啻竺ΧΦ腇PS游戲都是用它來開發(fā)的。這其中有Valve小組的Half
Life及其衍生作品--CS。所以,DirectX已經(jīng)成為了游戲開發(fā)所不可或缺的重要組成部分。<BR><BR>還是先讓我們看一個(gè)小程序。<BR><BR><B>[program
MovePicture v0.3]</B></FONT></P>
<TABLE id=AutoNumber5 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><IMG height=212
src="游戲開發(fā)中心----游戲?qū)嶒?yàn)室 - 博客園.files/GD-txtx_3.jpg" width=282
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT
size=2> 這個(gè)程序是用DirectDraw開發(fā)的,看到它的威力了吧,滾動(dòng)的平滑,絲毫沒有跳幀的感覺。要是使用GDI編寫一個(gè)需要重繪直線的程序,其重繪的圖形將慘不忍睹。<BR><BR><B>[program
Line Star]</B></FONT></P>
<TABLE id=AutoNumber6 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><IMG height=270
src="游戲開發(fā)中心----游戲?qū)嶒?yàn)室 - 博客園.files/GD-txtx_4.jpg" width=270
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT
size=2> 在演示這個(gè)程序之前,需要調(diào)整一下Windows窗口顯示設(shè)置。首先鼠標(biāo)右鍵點(diǎn)擊桌面->屬性->外觀->效果,將"托動(dòng)時(shí)現(xiàn)實(shí)窗口內(nèi)容"選項(xiàng)選中。這樣可以保證在托動(dòng)窗口的時(shí)候,屏幕使用GDI不斷刷新。<BR><BR> 由于程序窗體中所繪制的五角星是隨著窗體大小而改變的,這樣隨著窗體的增大或縮小,圖形也隨之改變。我們都知道,動(dòng)畫的產(chǎn)生原理是,不斷以較小幅度改變?cè)瓉淼膱D像,這樣形成的圖形序列便產(chǎn)生了動(dòng)畫。所以,在拓東窗體的同時(shí),GDI在不斷的繪制新的圖形,其繪圖性能便可以被我們所看到了。無論多快的硬件設(shè)備,只要你拖動(dòng)的速度快一點(diǎn),你所見到的一定是五角星在一閃一閃的變化。<BR><BR><A
href="http://tack.smice.net/download/file/game/game.rar">點(diǎn)擊這里下載本文章相關(guān)程序</A><BR><BR>通過比較,我們可以看出DirectX的優(yōu)勢(shì)所在了。<BR><BR>DirectX
學(xué)習(xí)參考:DirectX SDK</FONT></P></TD></TR></TBODY></TABLE></DIV>
<DIV class=postFoot>posted @ <A title=permalink
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371781.html">2006-04-10
23:48</A> 3vgame 閱讀(951) | <A title="comments, pingbacks, trackbacks"
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371781.html#FeedBack">評(píng)論
(1)</A> | <A
href="http://www.cnblogs.com/3vgame/admin/EditPosts.aspx?postid=371781">編輯</A>
</DIV></DIV><BR>
<DIV class=post>
<DIV class=postTitle><A
id=homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371780.html">《游戲編程》第一部
基礎(chǔ)篇</A> </DIV>
<DIV class=postText>
<TABLE id=AutoNumber2 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="85%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><B><FONT color=#ffffee>《游戲編程》第一部 </FONT><FONT
color=#339933>基礎(chǔ)篇</FONT></B></P></TD></TR>
<TR>
<TD width="100%"> </TD></TR>
<TR>
<TD width="100%"><FONT size=2>目錄:<BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#零、基礎(chǔ)篇的目的"
target=_self>零、基礎(chǔ)篇的目的</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#一、游戲的動(dòng)畫原理"
target=_self>一、游戲的動(dòng)畫原理</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#二、基于動(dòng)畫原理的提高"
target=_self>二、基于動(dòng)畫原理的提高</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#三、游戲的基石: 窗口 的建立"
target=_self>三、游戲的基石: 窗口 的建立</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#四、游戲制作利器: 引擎 的選擇"
target=_self>四、游戲制作利器: 引擎 的選擇</A><BR><BR>文章內(nèi)容:<BR></FONT><B><BR><A
name=零、基礎(chǔ)篇的目的>零、基礎(chǔ)篇的目的</A></B><FONT
size=2><BR><BR> 有了一個(gè)目標(biāo)之后,往往人們比較有信心和動(dòng)力。所以,我重新修改了一下教程的安排,在這兒插入了“零”篇。<BR><BR> </FONT><FONT
face="Verdana, Tahoma, Arial"
size=2>在基礎(chǔ)篇里,我們將逐步學(xué)習(xí)關(guān)于游戲制作的基本知識(shí),為后續(xù)的開發(fā)工作奠定基礎(chǔ)。那么,在基礎(chǔ)篇結(jié)束的時(shí)候,我們可以弄出個(gè)什么東西呢?我們看圖:<BR> </FONT>
<TABLE id=AutoNumber3 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><IMG height=502
src="游戲開發(fā)中心----游戲?qū)嶒?yàn)室 - 博客園.files/gpBase_1.jpg" width=670
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT
size=2> 這是我寫的一個(gè)演示程序的截圖,暫時(shí)定為我們基礎(chǔ)篇教程的目標(biāo)。<BR><BR> 該演示程序包含了一些基本要素,如: Windows
程序的基本框架、DirectDraw 的基本使用方法、精靈的使用和 一些簡(jiǎn)單的關(guān)于 DirectInput
的東西。但是,這個(gè)程序沒有對(duì)障礙和遮擋進(jìn)行處理,也就是說,人物會(huì)走到任何地方去。因?yàn)橐恍╆P(guān)于地圖方面的知識(shí),我將會(huì)放到提高篇里。<BR><BR>注:<BR> 本范例在以下環(huán)境中通過:VC6.0、DirectX
7.0/8.1 SDK、Win2000/WinXP <BR><BR>附件:<BR> 說明 [<A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase_sample.zip">本范例演示程序下載</A>]<BR><BR><BR><BR></FONT><B><A
name=一、游戲的動(dòng)畫原理>一、游戲的動(dòng)畫原理</A></B><FONT
size=2><BR><BR> 其實(shí)現(xiàn)在網(wǎng)上關(guān)于游戲編程的技術(shù)文章越來越多了,但是我發(fā)現(xiàn)關(guān)于最基本的了解游戲的文章還是比較少的。大多數(shù)文章是以
DirectX
作為開始教學(xué)起始的,因此,我覺得花點(diǎn)時(shí)間寫下這篇文章還是值得的。今天,我就開始介紹一些關(guān)于游戲編程的基礎(chǔ)東西,以便大家能夠真正的開始了解游戲,從而能夠很快的轉(zhuǎn)入游戲開發(fā)。由于是針對(duì)新手的,如果您已經(jīng)轉(zhuǎn)入程序編寫階段,您完全可以拋開了。我將采用一種不同于網(wǎng)絡(luò)上現(xiàn)有的教學(xué)方法,來講一下游戲程序開發(fā)的奧秘:)<BR><BR> 大家可以看到游戲中主角連貫的出招動(dòng)作、華麗的場(chǎng)景、震撼的戰(zhàn)斗效果,這一切似乎很難讓人想象程序是怎么實(shí)現(xiàn)的。也許您在上課無聊的時(shí)候嘗試過在課本的角上畫上幾個(gè)人物動(dòng)作的分解圖,然后一遍又一遍地翻著它,覺得很好玩。其實(shí)您已經(jīng)在無形之中接觸了游戲動(dòng)畫的基本原理。其實(shí)游戲動(dòng)畫的步驟可以想象成這樣:<BR><BR> 手中拿著兩張紙,把一張放在后面。其實(shí)這個(gè)就是
DirectDraw
的兩個(gè)成員。我們先把一個(gè)分解動(dòng)作畫在背后的那張紙上。那么,我們當(dāng)前看到的就是一個(gè)“白屏”而已。然后,我們“快速地”將后面的那張紙拿到前面來。呵呵,你現(xiàn)在看到的是第一個(gè)分解動(dòng)作了吧!那么,怎么“快速地”呢?不要緊張,這些問題都被
DirectDraw
完美的解決了,別急,今后會(huì)詳細(xì)的講解的。現(xiàn)在,當(dāng)前的兩張紙已經(jīng)交換了,而且也看到了動(dòng)作(一個(gè)靜態(tài)的而已),那么后面的“白紙”怎么辦呢?我們先拿“橡皮”將紙擦一遍,然后,將第二個(gè)分解圖畫上,接下來?呵呵,自己干吧,應(yīng)該明白了吧。經(jīng)過再次的交換,我們已經(jīng)在屏幕上看到第二個(gè)動(dòng)作了。我們繼續(xù)把后面的紙擦干凈,再畫第三個(gè)動(dòng)作,再交換,繼續(xù)下去......由于我們的“快速地”動(dòng)作相當(dāng)快,所以感覺不到有任何問題。<BR><BR> 或許有人會(huì)問:為什么不直接在第一張紙上進(jìn)行“擦->畫->擦->畫”的動(dòng)作呢?這個(gè)就是為了我們平常所說的“閃屏”問題而進(jìn)行的解決方案。由于直接進(jìn)行動(dòng)作,速度相對(duì)較慢,有時(shí)用戶會(huì)在屏幕上看到一閃一閃的現(xiàn)象。我們用“兩張紙”的話,就完美的解決了這個(gè)問題。(啊?還閃屏?呵呵,你小子把顯示器壞了的問題都怪我啊·#¥%……*)<BR><BR><BR><BR></FONT><B><FONT
face=Arial><A name=二、基于動(dòng)畫原理的提高>二、基于動(dòng)畫原理的提高</A></FONT></B><FONT face=Arial
size=2><BR><BR> 既然上面的游戲的“內(nèi)幕”已經(jīng)掌握,那么我們來看看在上一節(jié)中涉及的“武器”和基本知識(shí)。或許本篇所涉及的東西是基于理論的多數(shù),但是,這將為理解在后面即將寫的程序部分會(huì)打下很好的基礎(chǔ)的。所以咬咬牙,看完吧!(啊?沒有牙了啊?大家應(yīng)該鼓掌吧!連牙都沒有長(zhǎng)齊的“3、4點(diǎn)種的太陽”都開始學(xué)習(xí)了,你們還有理由嗎?恩?是大娘啊?那更應(yīng)該值得學(xué)習(xí)了!跑題:)<BR> </FONT>
<TABLE id=AutoNumber4 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="72%"><FONT face=Arial
size=2><BR> 首先要介紹的第一位主角是 Windows 編程中的必要元素: RECT 。是英語 rectangle
的簡(jiǎn)寫,意思是矩形。它有什么用呢?我們?cè)谏厦娌皇侵v到了動(dòng)作的分解動(dòng)作嗎?我們看右圖:<BR><BR> 這個(gè)圖就是一個(gè)簡(jiǎn)單的行走動(dòng)作分解圖,復(fù)雜的可能有10幀左右哦:)那么怎么在程序中實(shí)現(xiàn)自動(dòng)在紙上畫出正確的圖片呢?(其實(shí)我一直在考慮是否將這部分內(nèi)容加上,因?yàn)閷?shí)在太基本了。但是每個(gè)人都這么想的話,基礎(chǔ)的誰來教呢?算了,讓別人的口水淹死我吧!)假設(shè)您已經(jīng)有點(diǎn)
C++ 語言的基礎(chǔ)了。這個(gè)教我教的話,說不過去吧:)請(qǐng)看下面的代碼:<BR><BR><BR></FONT></FONT><FONT
face=宋體 color=#99ccff size=2>#define m_Width
32 </FONT><FONT face=宋體 color=#808080 size=2>// 每個(gè)動(dòng)作的 寬度
</FONT><FONT face=宋體 color=#99ccff size=2><BR>#define m_Height
48 </FONT><FONT face=宋體 color=#808080 size=2>// 每個(gè)動(dòng)作的 高度
</FONT><FONT face=Arial size=2><BR> </FONT></TD>
<TD width="28%">
<P align=center><IMG height=192
src="游戲開發(fā)中心----游戲?qū)嶒?yàn)室 - 博客園.files/gpBase_2.bmp" width=96
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT face=宋體 color=#99ccff size=2>void ShowThePic()
<BR>{<BR> static RECT
rect;
</FONT><FONT face=宋體 color=#808080 size=2>// 矩形對(duì)象,用于精確定位所要的當(dāng)前動(dòng)作
</FONT><FONT face=宋體 color=#99ccff size=2><BR> static
int CurrentFrame = 0; </FONT><FONT face=宋體 color=#808080
size=2>// 當(dāng)前動(dòng)作的編號(hào)</FONT><FONT face=宋體 color=#99ccff size=2>
<BR> static int Direction =
0; </FONT><FONT face=宋體 color=#808080
size=2>// 當(dāng)前的方向 </FONT><FONT face=宋體 color=#99ccff
size=2><BR> rect.top = Direction; rect.bottom =
(Direction+1)*m_Height; </FONT><FONT face=宋體 color=#808080
size=2> // 對(duì)當(dāng)前矩形的大小定義,數(shù)學(xué)的問題哦 </FONT><FONT face=宋體
color=#99ccff size=2><BR> rect.left = CurrentFrame;
rect.right = (CurrentFrame+1)*m_Width; </FONT><FONT face=宋體
color=#808080 size=2>// 根據(jù)英文的意思也可以知道在給誰賦值 </FONT><FONT face=宋體
color=#99ccff size=2><BR>
BltPicToScreen();
</FONT><FONT face=宋體 color=#808080 size=2>// 一個(gè)偽函數(shù),作用是將當(dāng)前矩形內(nèi)的圖形復(fù)制到屏幕上。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -