版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二章二維游戲的編程技術(shù)第1頁,共140頁,2023年,2月20日,星期三
第一節(jié)二維游戲的基本流程和架構(gòu)1.二維游戲的基本功能:交互和輸出交互部分:根據(jù)用戶的操作,改變游戲的各種數(shù)據(jù),以反映游戲的當(dāng)前狀態(tài)。輸出:處理游戲運(yùn)行中的各種數(shù)據(jù),在輸出設(shè)備上體現(xiàn)游戲的內(nèi)容,包括游戲畫面、游戲音效、游戲提示等。
這兩個(gè)部件的執(zhí)行由調(diào)度模塊指揮,簡(jiǎn)單的調(diào)度模塊是一個(gè)do-while循環(huán),串行執(zhí)行:交互輸出再輸出再渲染…。當(dāng)然也可以將兩個(gè)部件分成不同的線程,并行執(zhí)行。
VC++游戲編程——游戲的編程技術(shù)第2頁,共140頁,2023年,2月20日,星期三2.實(shí)現(xiàn)二維游戲框架,需要做下面的幾個(gè)工作:實(shí)現(xiàn)游戲地圖的加載和編輯操作圖像的半透明技術(shù)精靈動(dòng)畫技術(shù):采用連續(xù)帖圖方式產(chǎn)生動(dòng)畫效果碰撞檢測(cè)VC++游戲編程——游戲的編程技術(shù)第3頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第二節(jié)VC++基本繪圖技巧一、為什么使用VC++來設(shè)計(jì)游戲1.優(yōu)異的運(yùn)行速度:2.直接訪問內(nèi)存(VB間接訪問)----雙刃劍3.(VC++)+MFC數(shù)據(jù)庫(kù)架構(gòu)4.(VC++)+WindowsAPI架構(gòu)二、與其他函數(shù)庫(kù)的結(jié)合1.DirecXSDK2.OpenGL第4頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)三、游戲舞臺(tái)的坐標(biāo)系統(tǒng)1.屏幕區(qū)、窗口、客戶區(qū)屏幕區(qū)的大小視用戶計(jì)算機(jī)所設(shè)置的分辨率而定,如:1024x768第5頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)2.坐標(biāo)點(diǎn)與坐標(biāo)轉(zhuǎn)換以屏幕左上角為原點(diǎn),屏幕上的任何位置都可以用一個(gè)坐標(biāo)表示,我們稱為屏幕坐標(biāo)。當(dāng)程序中調(diào)用某些以坐標(biāo)點(diǎn)為實(shí)參的函數(shù)時(shí),都要傳遞相應(yīng)的屏幕坐標(biāo),如果我們只知道該點(diǎn)在客戶區(qū)中的位置,則必須先將它轉(zhuǎn)換為屏幕坐標(biāo)。轉(zhuǎn)換方法是調(diào)用ClientToScreen函數(shù),反之調(diào)用ScreebToClient第6頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)四、MFC(MicrosoftFoundationClass)繪圖類1.MFC的GDI類
GDI(GraphicDeviceInterface)意為“圖形設(shè)備接口”。Windows的架構(gòu)不允許使用者直接存取VGA顯卡上的內(nèi)存,所以在MFC中提供了圖形設(shè)備接口類,用來讓使用者顯示數(shù)據(jù)。
上圖表示GDI類都是從CGdiObject繼承而來,這些類必須在配合設(shè)備上下文(DC,DeviceContext)來使用。這些GDI類的用途如下:第7頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)CBimap:該類封裝了一個(gè)GDI位圖,提供一個(gè)操作位圖的接口CBrush:該類封裝了一個(gè)GDI畫刷,可被選擇為設(shè)備描述表的當(dāng)前畫刷,畫筆為圖形中填滿樣式CFont:該類封裝了一種GDI字體,可被選擇為設(shè)備描述表的當(dāng)前字體Cpalette:該類封裝了一個(gè)GDI調(diào)色板,可作應(yīng)用程序和一色彩輸出設(shè)備如顯示器之間的接口CPen:該類封裝了一種GDI畫筆,可被選擇為設(shè)備描述的當(dāng)前畫筆,畫筆為圖形外框樣式CRgn:該類封裝了一GDI域,用于操作窗口內(nèi)的橢圓域或多邊形域。該類一般與CDC類的裁剪成員一起使用第8頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)2.MFC的CDC類DC(DeviceContext,設(shè)備上下文)可以將其想象成一個(gè)圖形繪制的區(qū)域。當(dāng)要在屏幕上繪圖時(shí),應(yīng)用程序就必須先取得“屏幕的DC”才可以進(jìn)行繪圖;當(dāng)使用者要操作其窗口繪圖時(shí),就必須先取得“操作窗口的DC”,然后再把要繪制的圖形放到各個(gè)DC中,這時(shí)在該DC所代表的區(qū)域中,就會(huì)顯示所繪制的圖形。第9頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
MFC把各種不同的DC類包裝在CDC類中,并提供了許多與繪圖有關(guān)的函數(shù)。
第10頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)CClientDC:代表操作窗口的DC,可用于在快速響應(yīng)鼠標(biāo)事件時(shí)進(jìn)行繪畫CMetaFileDC:Windows元文件的設(shè)備環(huán)境類,Windows元文件包含一個(gè)圖形設(shè)備接口(GDI)命令序列,該序列可被重新執(zhí)行而創(chuàng)建一幅圖像CPaintDC:響應(yīng)MN_PAINT消息的DC,是顯示設(shè)備環(huán)境類,用于窗口中的OnPaint成員和視圖OnDraw成員函數(shù)中,自動(dòng)調(diào)用BeginPaint進(jìn)行構(gòu)造,調(diào)用EndPaint進(jìn)行析構(gòu)。CWindowsDC:代表整個(gè)屏幕的DC,即整個(gè)窗口的顯示設(shè)備環(huán)境類,包括客戶區(qū)和框架區(qū)。第11頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)五、構(gòu)建游戲窗口1.設(shè)置VC++應(yīng)用程序中的頭文件第12頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
這樣就不用擔(dān)心VC++會(huì)出現(xiàn)編譯程序找不到DirectX的.h和.lib的頭文件錯(cuò)誤第13頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第14頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)2.建立程序項(xiàng)目使用VC++中的File|New命令建立新項(xiàng)目并按下面步驟操作:可以使用VC++的MFC架構(gòu)開發(fā)應(yīng)用程序,它可以幫助你套入許多默認(rèn)的窗口、對(duì)話框、菜單等基本組件,這些組件在設(shè)計(jì)游戲時(shí)基本用不上,因此只要建立一個(gè)單純的Win32應(yīng)用程序項(xiàng)目即可。第15頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第16頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第17頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
建立新項(xiàng)目后,接著在HeaderFiles中新增一個(gè)名為stdafx.h的頭文件,方法如下:第18頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
在項(xiàng)目中加入此文件后,就打開它并加以編輯。在這個(gè)程序中,所要引用的頭文件都是在stdafx.h中設(shè)定。第19頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)下面建立這個(gè)項(xiàng)目所屬的資源文件第20頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第21頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第22頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第23頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第24頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第25頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第26頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第27頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
最后,還要為這個(gè)新項(xiàng)目設(shè)定使用的MFC函數(shù)庫(kù),方法如下第28頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)完成了設(shè)置MFC之后,就可以建立應(yīng)用程序窗口了第29頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)應(yīng)用程序與窗口下面我們建立一個(gè)信息窗口來展示程序的功能,即建立一個(gè)應(yīng)用程序?qū)ο笠约按翱趯?duì)象。第30頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第31頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
這樣,VC++便會(huì)自動(dòng)為這個(gè)項(xiàng)目建立一個(gè)gameFrame類。雙擊gameFrame.h,即可看到它的內(nèi)容。第32頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)下面我們?cè)俳ㄒ粋€(gè)Class類,并將其命名為gameApp第33頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
gameAppClass建立完后,先在gameApp.h中聲明MFC的初始函數(shù),內(nèi)容如下:第34頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
然后在gameApp.cpp中建立函數(shù)的實(shí)體:第35頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)最后建立一個(gè)基本的Windows窗口,在gameFrame.cpp中加入如下程序代碼:這段程序建立了一個(gè)名稱為“繪圖窗口”的窗口,MFC的Create()函數(shù)會(huì)幫你完成所有建立窗口時(shí)遇到的函數(shù)調(diào)用動(dòng)作。第36頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)運(yùn)行結(jié)果:第37頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
在gameFrame.cpp中可以加入窗口控制命令,程序代碼如下:width=dc.GetDeviceCaps(HORZRES);height=dc.GetDeviceCaps(VERTRES);GetWindowRect(&rect);width=(width-(rect.right-rect.left))/2;height=(height-(rect.bottom-rect.top))/2;MoveWindow(width,height, (rect.right-rect.left), (rect.bottom-rect.top), true);這樣可以將窗口放置在屏幕的正中。第38頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)六、MFC繪圖類---從項(xiàng)目建立繪圖成員函數(shù)
執(zhí)行VC++中的View|ClassWizard,打開MFCClassWizard對(duì)話框第39頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
這時(shí)在項(xiàng)目的程序代碼中多出了一個(gè)有關(guān)窗口繪圖的OnPaint()函數(shù)第40頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)這樣可以在OnPaint()函數(shù)中編寫程序代碼voidgameFrame::OnPaint(){ CPaintDCdc(this); oldFont=dc.SelectObject(&newFont); dc.SetTextColor(RGB(0,0,255)); dc.TextOut(30,60,"繪制文字"); dc.SelectObject(oldFont);}在gameFrame::gameFrame()之前聲明新字體對(duì)象與舊字體指針:CFontnewFont,*oldFont;在gameFrame()中建立Cfont類對(duì)象newFontnewFont.CreateFont(100,50,50,0,100, TRUE,TRUE,FALSE, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH|FF_MODERN, "楷體" );第41頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第42頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)例:線段繪制、繪制填充的區(qū)域(畫刷實(shí)例祥見C++繪圖介紹-new.ppt),第43頁,共140頁,2023年,2月20日,星期三第三節(jié)地圖的創(chuàng)建與顯示一、圖像的加載和顯示1.圖形文件格式:BMP、GIF、JPEG、TIF。其中BMP是Windows平臺(tái)的標(biāo)準(zhǔn)圖像格式。BMP圖像,又名位圖圖像(bitmap),這種格式像一張地圖一樣,記錄目標(biāo)圖像上每個(gè)像素點(diǎn)的顏色值。2.加載位圖文件:步驟一:將位圖加載到內(nèi)存DC中步驟二:將內(nèi)存DC中的內(nèi)容繪制到要顯示位圖的
DC中。見位圖程序。VC++游戲編程——游戲的編程技術(shù)第44頁,共140頁,2023年,2月20日,星期三3.兩個(gè)函數(shù):(1)加載位圖LoadImage()HANDLELoadImage( HINSTANCEhinst,//包含位圖實(shí)體的handleLPCTSTRlpszName,//位圖來源
UINTuType;//加載位圖的類型
intcxDesired,//位圖的寬度
intcyDesired,//位圖的高度
UINTfuLoad//加載位圖的方式
);
當(dāng)位圖加載到內(nèi)存DC后,只要把內(nèi)存DC中的內(nèi)容貼到顯示位圖的DC中即可。只要利用CDC::BitBlt函數(shù)皆可以完成這個(gè)操作。VC++游戲編程——游戲的編程技術(shù)第45頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)(2)繪制位圖BitBlt()
BOOLBitBlt{intx,//貼到目的地左上角點(diǎn)的x坐標(biāo)
inty,//貼到目的地左上角點(diǎn)的y坐標(biāo)
intnWidth,//貼到目的地的寬度
intnHeight,//貼到目的地的高度
CDC*pSrcDC,//存儲(chǔ)來源位圖的DCintxSrc,//源位圖左上角點(diǎn)的x坐標(biāo)
intySrc,//源位圖左上角點(diǎn)的y坐標(biāo)
DWORDdwRop//Raster運(yùn)算值
};第46頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)例如語句:
dc->BitBlt(0,0,500,400,mdc,200,100,raster)
這里可以假設(shè)dc是代表操作窗口的DC,mdc是存儲(chǔ)位圖來源的內(nèi)存DC第47頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第48頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第49頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)Raster值:BLACKNESS:將位圖轉(zhuǎn)換為黑色DSTINVERT:將目的DC做NOT運(yùn)算MERGECOPY:將選擇的畫刷與位圖做AND運(yùn)算MERGEPAINT:先將位圖做NOT運(yùn)算,再與目的DC做OR
運(yùn)算 NOTSRCCOPY: 將位圖做NOT運(yùn)算NOTSRCERASE:先將位圖與目的DC做OR運(yùn)算,再將其做NOT運(yùn)算PATCOPY:將選擇的畫刷貼到目的DCPATINVERT:將目的DC與選擇的畫刷做XOR運(yùn)算PATPAINT:先將位圖做NOT運(yùn)算,再與畫刷做OR運(yùn)算,最后再與目的DC做
OR運(yùn)算SRCAND:先將位圖與目的DC做AND運(yùn)算SRCCOPY:將位圖貼到目的DCSRCERASE:先將目的DC做NOT運(yùn)算,再位圖做AND運(yùn)算 SRCINVERT:將位圖與目的DC做XOR運(yùn)算 SRCPAINT:將位圖與目的DC做OR運(yùn)算WHITENESS:將位圖轉(zhuǎn)換為白色第50頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)二、地圖的繪制1.固定地圖第51頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)2.菱形地圖(斜角地圖貼圖)
用小圖拼湊實(shí)現(xiàn)大地圖,斜角地圖即有立體感,是一種常用的二維畫面上表現(xiàn)三維場(chǎng)景的技術(shù)(三國(guó)風(fēng)云)第52頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第53頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)(1)地圖的拓?fù)浣Y(jié)構(gòu)將每張小圖的長(zhǎng)寬設(shè)置為64x32像素,則要貼上10x15張小圖,可以下圖計(jì)算:將上述方塊地圖編號(hào):0123456789101112131415161718192021222324252627第54頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
第55頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第56頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第57頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第58頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)TransparentBlt實(shí)現(xiàn)透明函數(shù)功能:該函數(shù)對(duì)指定的源設(shè)備環(huán)境中的矩形區(qū)域像素的顏色數(shù)據(jù)進(jìn)行位塊(bit_block)轉(zhuǎn)換,并將結(jié)果置于目標(biāo)設(shè)備環(huán)境。
函數(shù)原型:BOOLTransparentBlt(HDChdcDest,intnXOriginDest,intnYOriginDest,intnWidthDest,inthHeightDest,HDChdcSrc,intnXOriginSrc,intnYOriginSrc,intnWidthSrc,intnHeightSrc,UINTcrTransparent);
第59頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)參數(shù):
hdcDest:指向目標(biāo)設(shè)備環(huán)境的句柄。
nXOriginDest:指定目標(biāo)矩形左上角的X軸坐標(biāo)
nYOriginDest:指定目標(biāo)矩形左上角的Y軸坐標(biāo),
nWidthDest:指定目標(biāo)矩形的寬度。
nHeightDest:指定目標(biāo)矩形高度的句柄。
hdcsrc:指向源設(shè)備環(huán)境的句柄。
nXOriginSrc:指定源矩形(左上角)的X軸坐標(biāo)
nYOriginsrc:指定源矩形(左上角)的Y軸坐標(biāo)
nWidthSrc:指定源矩形的寬度。
nHeightSrc:指定源矩形的高度。
crTransparent:源位圖中的RGB值當(dāng)作透明顏色。返回值:如果函數(shù)執(zhí)行成功,那么返回值為TRUE;如果函數(shù)執(zhí)行失敗,那么返回值為FALSE。
第60頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第61頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)
透明色(又稱關(guān)鍵色),指的是圖像傳送中不會(huì)被傳送的區(qū)域的顏色。比如說我們先在一個(gè)純綠色的背景上畫了一個(gè)人物,把這幅畫調(diào)入一個(gè)頁面,再將純綠色設(shè)為這個(gè)頁面的透明色。以后當(dāng)我們進(jìn)行圖像傳送時(shí),只需指定傳送范圍為一個(gè)包括了人物的矩形,DirectDraw將只會(huì)把不規(guī)則的人物傳到新的頁面上而不會(huì)把純綠色的背景一起傳送。當(dāng)然,人物本身不能包含純綠色,否則就不能完整地傳送了。 一個(gè)頁面在同一時(shí)刻只能有一種透明色,設(shè)置透明色的方法是
DDSetColorKey(頁面名,RGB(紅,綠,藍(lán)));
例如DDSetColorKey(lpDDSMap,RGB(255,0,255));
第62頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)障礙物貼圖第63頁,共140頁,2023年,2月20日,星期三3.單一背景卷動(dòng)技術(shù)(滾屏地圖)
單一背景卷動(dòng)技術(shù)就是只有一張地圖,隨著時(shí)間的推移而在窗口中慢慢移動(dòng)位置,這一技術(shù)是利用在窗口中連續(xù)貼上背景所產(chǎn)生的效果。如下圖,由左上至右下的幾個(gè)黑框,就是操作窗口在每個(gè)不同時(shí)間所顯示的部分地圖。只要設(shè)定一個(gè)定時(shí)器,按從左上至右下的順序在窗口中重繪所顯示的部分地圖就可以產(chǎn)生卷動(dòng)的效果。VC++游戲編程——游戲的編程技術(shù)完整地圖屏幕可見區(qū)域第64頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第65頁,共140頁,2023年,2月20日,星期三4.多重背景卷動(dòng)技術(shù)(多層次地圖)
多重背景卷動(dòng)就是有多幅背景圖,而這些背景圖的卷動(dòng)速度都不相同。如開車時(shí),窗外背景變化最快的依次是車旁的樹木,然后是天空的云朵,最后才是遠(yuǎn)方的太陽。VC++游戲編程——游戲的編程技術(shù)第66頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第四節(jié)動(dòng)畫技術(shù)
動(dòng)畫和電影一樣,都是將差異很小的圖像一幅幅顯示。由于人眼的視覺暫留現(xiàn)象,看上去就像圖像動(dòng)了起來。比如在RPG中,我們要實(shí)現(xiàn)主角從(x1,y1)移動(dòng)到(x2,y2)處,我們可用如下代碼:
while(主角不在(x2,y2)){
在主角(x,y)處恢復(fù)背景;
在(x+dx,y+dy)處重繪主角;x=x+dx;y=y+dy;};第67頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)當(dāng)主角很小時(shí),上面方法是可行的,但主角稍大,就會(huì)出現(xiàn)閃爍現(xiàn)象。閃爍的原因不是因?yàn)槟愕腃PU和GPU不夠快,而同樣是因?yàn)橐曈X暫留。解決的方法是雙緩沖技術(shù)。即構(gòu)造兩個(gè)屏幕緩沖區(qū),一個(gè)表示當(dāng)前屏幕,一個(gè)在后臺(tái)表示下一幀的屏幕。在后臺(tái)緩沖區(qū)上畫好下一幀后,一次性送到前臺(tái)上去,這樣就不會(huì)出現(xiàn)閃爍現(xiàn)象了。其過程可以描述為:
while(主角不在(x2,y2)){
在后臺(tái)緩沖恢復(fù)背景;在后臺(tái)緩沖(x+dx,y+dy)處恢主角;
將后臺(tái)緩沖送到前臺(tái);x=x+dx;y=y+dy;};
以上過程在ModeX下可用VGA的寄存器置位來實(shí)現(xiàn),在DirectX中可用Flip或Blt實(shí)現(xiàn)。ModeX是實(shí)模式下的編程方式,以前DOS下的游戲經(jīng)常使用。第68頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)游戲中的動(dòng)畫按其呈現(xiàn)方式可分為兩種:直接播放方式:這種方式經(jīng)常被用來播放游戲的片頭和片尾,如AVI和MPEG媒體文件。連續(xù)貼圖方式:利用連續(xù)貼圖的成像技術(shù)來制作動(dòng)畫效果——即精靈動(dòng)畫。所謂“精靈”就是指一個(gè)或一組位圖圖像被合成到背景圖像上,并產(chǎn)生運(yùn)動(dòng)的效果。相對(duì)于屏幕而言,“精靈”通常是很小的,當(dāng)今的圖形硬件可以很快地處理精靈動(dòng)畫,使得場(chǎng)景中的很多“精靈”可以同時(shí)運(yùn)動(dòng)。第69頁,共140頁,2023年,2月20日,星期三一、定時(shí)器的運(yùn)用定時(shí)器(Timer)每隔一段時(shí)間就發(fā)出一個(gè)WM_TIMER消息,當(dāng)程序接收到這個(gè)消息時(shí),便可以決定接下來作哪些事情。通常用在控制動(dòng)畫顯示的速度上。1.建立定時(shí)器
UINTSetTimer{HWNDhWnd//窗口句柄
UINTnIDEvent//計(jì)數(shù)器編號(hào)
UINTuElapse//時(shí)間間隔
TIMEPROClpTimerFunc//回調(diào)函數(shù)
}VC++游戲編程——游戲的編程技術(shù)第70頁,共140頁,2023年,2月20日,星期三
第二個(gè)參數(shù)是計(jì)時(shí)器的編號(hào),是唯一的,在同一窗口可以設(shè)定多個(gè)不同的編號(hào),例如:
SetTimer(1,100,NULL); SetTimer(2,200,NULL);第三個(gè)參數(shù)時(shí)間間隔為千分之一秒為單位,如果設(shè)為1000,則每隔1秒發(fā)出一個(gè)WM_TIMER消息第四個(gè)參數(shù)是設(shè)定定時(shí)器發(fā)出消息時(shí)所要執(zhí)行的回調(diào)函數(shù)。如果不使用,這個(gè)參數(shù)可以設(shè)為NULL,并在窗口的OnTimer()函數(shù)中定義所要執(zhí)行的程序代碼。下面的代碼表示建立一個(gè)編號(hào)為1,時(shí)間間隔為0.5秒,且不使用回調(diào)函數(shù)的定時(shí)器:
SetTimer(NULL,1,500,NULL);
VC++游戲編程——游戲的編程技術(shù)第71頁,共140頁,2023年,2月20日,星期三2.刪除定時(shí)器定時(shí)器建立后,它會(huì)一直依照我們?cè)O(shè)定的時(shí)間間隔發(fā)出WM_TIMER消息,因此我們要停止這個(gè)定時(shí)器,就要使用下面的函數(shù):
KillTimer(intnIDEvent);其參數(shù)就是我們要停止的定時(shí)器編號(hào)。例1使用單個(gè)定時(shí)器顯示動(dòng)畫例2使用多個(gè)定時(shí)器顯示動(dòng)畫VC++游戲編程——游戲的編程技術(shù)第72頁,共140頁,2023年,2月20日,星期三3.利用回調(diào)函數(shù)顯示動(dòng)畫
回調(diào)函數(shù)通常用在有多個(gè)定時(shí)器情況下,分別用來設(shè)置各個(gè)定時(shí)器發(fā)出WM_TIMER消息時(shí)所要執(zhí)行的程。SttaticvoidCALLBACKTimeProc(HWNDhWnd,UINTnMsg,UINTnIDEvent,DWORDdwTime)hWnd:定時(shí)器窗口的句柄;nMsg:WN_TIMER消息;nIDEvent:定時(shí)器編號(hào);dwTime:?jiǎn)⒂枚〞r(shí)器后所經(jīng)過的時(shí)間,以千分之一秒為單位VC++游戲編程——游戲的編程技術(shù)第73頁,共140頁,2023年,2月20日,星期三二、鏤空動(dòng)畫技巧鏤空?qǐng)D就是將圖片中的一部分顯示在另一張背景圖上,而且出去圖中不需要顯示的部分。(第五節(jié))三、半透明動(dòng)畫技術(shù)當(dāng)一幅圖顯示在另一幅圖上時(shí),透過上面的圖能夠看到下面的圖,如上面的圖顯示的是玻璃材質(zhì)的物體,這時(shí)就要用到透明技術(shù)。(第六節(jié))VC++游戲編程——游戲的編程技術(shù)第74頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第五節(jié)鏤空?qǐng)D的制作鏤空?qǐng)D就是將圖片中的一部分顯示在另一張背景圖上,而且除去圖中不需要顯示的部分(這部分必須是白色或黑色)。第75頁,共140頁,2023年,2月20日,星期三
現(xiàn)有兩幅圖,左為背景圖,右為需要貼到背景上的圖。將右圖顯示到左圖上,需要去掉邊緣的黑色。VC++游戲編程——游戲的編程技術(shù)第76頁,共140頁,2023年,2月20日,星期三
鏤空?qǐng)D制作原理左邊圖為人物稱之為原始圖,要鏤空的部分為黑色,右邊只有黑色和白色,稱之為蒙版或叫做掩碼圖。VC++游戲編程——游戲的編程技術(shù)第77頁,共140頁,2023年,2月20日,星期三鏤空?qǐng)D的制作原理:由C語言里的位運(yùn)算,我們知道,任何顏色RBG值和黑色按位AND,得到的仍是黑色,和白色按位AND,結(jié)果不變。即:
00000000…蒙版中的黑色部分
AND)10101010…背景圖色彩
00000000…最后變成黑色
11111111…蒙版中的白色部分
AND)10101010…背景圖色彩
10101010…最后還是背景顏色VC++游戲編程——游戲的編程技術(shù)第78頁,共140頁,2023年,2月20日,星期三
同樣,任何顏色和黑色按位OR,不變;白色按位OR,得到白色。即:
10101010…人物圖案顏色
OR)00000000…背景中變成黑色的部分
10101010…最后黑色的部分變成人物圖案
00000000…人物圖案四周的黑色部分OR)10101010…背景圖色彩
10101010…最后還是背景顏色使用BitBlt函數(shù)中的Raster參數(shù)既可以完成上面的運(yùn)算dc->BitBlt(210,213,198,113,mdc,0,0,raster)VC++游戲編程——游戲的編程技術(shù)第79頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)BitBlt()函數(shù)詳解
BOOLBitBlt{intx,//貼到目的地左上角點(diǎn)的x坐標(biāo)
inty,//貼到目的地左上角點(diǎn)的y坐標(biāo)
intnWidth,//貼到目的地的寬度
intnHeight,//貼到目的地的高度
CDC*pSrcDC,//存儲(chǔ)來源位圖的DCintxSrc,//源位圖左上角點(diǎn)的x坐標(biāo)
intySrc,//源位圖左上角點(diǎn)的y坐標(biāo)
DWORDdwRop//Raster運(yùn)算值
};第80頁,共140頁,2023年,2月20日,星期三產(chǎn)生鏤空?qǐng)D的步驟如下:步驟一:使用BitBlt函數(shù)將蒙版與背景做AND運(yùn)算,貼到目的地DC中。這時(shí)我們看到的是將蒙版放在背景上的效果。VC++游戲編程——游戲的編程技術(shù)第81頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第82頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)步驟二:再以要鏤空的圖與上面一步生成的背景圖做OR運(yùn)算,貼到目的地DC中。第83頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第84頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)dc.BitBlt(0,0,right,bottom,mdc,0,0,SRCCOPY);
//貼背景圖
dc.BitBlt(350,150,104,154,mdc,104,0,SRCAND);//與背景圖做AND運(yùn)算dc.BitBlt(350,150,104,154,mdc,0,0,SRCPAINT);//與上一幅圖做OR運(yùn)算
第85頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)注意的問題:1.對(duì)要鏤空的對(duì)象,必須要制作它對(duì)應(yīng)的蒙版2.蒙版的大小尺寸必須和原圖一致第86頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第六節(jié)半透明效果(和透明的區(qū)別)在二維游戲中,常常需要將多幅圖重疊顯示,但又不完全遮蓋,只是就要用到“半透明技術(shù)”。在進(jìn)行半透明處理之前,需要為各個(gè)圖像指定透明度(一般只對(duì)頂層的物體指定),規(guī)定100%的透明度表示完全透明,0%表示完全不透明。實(shí)際應(yīng)用中的透明度用Alpha表示。假設(shè)現(xiàn)在要把一幅圖A以40%的透明度覆蓋在背景圖B上,操作步驟如下:第87頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)步驟:取出位圖A的各個(gè)像素點(diǎn)的數(shù)據(jù),將各個(gè)像素點(diǎn)的RGB值分別乘以(1-40%),然后將它放入到一個(gè)內(nèi)存數(shù)組中。取出背景圖與位圖重疊部分的像素點(diǎn),并將各個(gè)像素點(diǎn)的RGB值分別乘以40%,然后再將其放入另一個(gè)內(nèi)存數(shù)組中。將產(chǎn)生的兩個(gè)數(shù)組相加。透明度計(jì)算公式:
半透明圖色彩=
源圖像色彩╳(1-透明度)+背景圖像色彩╳透明度第88頁,共140頁,2023年,2月20日,星期三位圖像素的顏色結(jié)構(gòu):下圖是一張10*5像素的位圖結(jié)構(gòu)VC++游戲編程——游戲的編程技術(shù)第89頁,共140頁,2023年,2月20日,星期三在上圖中,每個(gè)像素中的RGB值是以BGR的順序存儲(chǔ),每個(gè)像素下面的數(shù)字是程序讀出色彩值后,該色彩值存放于數(shù)組的元素索引值。現(xiàn)有兩幅圖如下,左為源圖,右為背景圖。VC++游戲編程——游戲的編程技術(shù)第90頁,共140頁,2023年,2月20日,星期三上面3幅圖的透明度分別為0.4,0.2,0.8VC++游戲編程——游戲的編程技術(shù)第91頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第七節(jié)物理動(dòng)作設(shè)計(jì)一、物體移動(dòng)勻速移動(dòng)
V=Vx+VyVx,Vy分別表示X,Y方向上的速度變速運(yùn)動(dòng)
V=Vo+att可以在定時(shí)器中設(shè)置
Vx=Vxo+axVy=Vyo+ayax,ay分別為x,y方向的加速度磨擦力及其模擬下落與彈跳
Vy=Vyo+gt
dc.BitBlt(xlast,170,100,100,mdc,0,0,WHITENESS);//在上次貼圖的區(qū)域貼上白色,覆蓋上一次貼圖的圖案
第92頁,共140頁,2023年,2月20日,星期三二、物體間的碰撞對(duì)物體的碰撞檢測(cè)包括:人物與物體碰撞、物體與物體碰撞、人物與人物碰撞等。常見的碰撞檢測(cè)一般有:范圍檢測(cè)、碰撞點(diǎn)檢測(cè)和顏色檢測(cè)。通過范圍(區(qū)域)檢測(cè)碰撞:這種方法適用于可取的其范圍大小的規(guī)則幾何圖形,如下圖:VC++游戲編程——游戲的編程技術(shù)第93頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第94頁,共140頁,2023年,2月20日,星期三2.碰撞點(diǎn)檢測(cè)這種方法也是范圍(區(qū)域)檢測(cè)的一種,不同的是用碰撞點(diǎn)來代替碰撞區(qū)域。一般是在兩個(gè)運(yùn)動(dòng)的物體中的一個(gè)物體上設(shè)置碰撞點(diǎn),另一個(gè)物體上設(shè)置檢測(cè)區(qū)域,運(yùn)行時(shí)逐個(gè)判斷碰撞點(diǎn)是否在檢測(cè)區(qū)域中。
VC++游戲編程——游戲的編程技術(shù)第95頁,共140頁,2023年,2月20日,星期三3.通過顏色檢測(cè)碰撞這種方法較為精確,但是相對(duì)也較為耗時(shí)。如圖,我們要檢測(cè)汽車和樹林的碰撞(或是遮蓋)就要為樹林做一張掩碼圖將樹林的主體顏色用黑色填充。產(chǎn)生汽車駛?cè)霕淞趾竺娴男Ч捎孟仍诒尘吧腺N上汽車的圖像,然后再在上面用鏤空?qǐng)D技術(shù)貼上樹林;然后判斷汽車圖像在樹林中的相對(duì)位置,方法是將汽車圖像上的點(diǎn)和掩碼圖上相應(yīng)位置的點(diǎn)按位AND,檢查結(jié)果中是否有黑色(RGB值為0)存在,這是因?yàn)槿魏晤伾腞GB值與黑色圖像做AND運(yùn)算,將得到黑色。如果預(yù)先排除汽車圖像中原本的黑色部分以及汽車圖像中的白色部分,那么黑色點(diǎn)的出現(xiàn)就表明發(fā)生了碰撞。VC++游戲編程——游戲的編程技術(shù)第96頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)例:顏色檢測(cè)前景圖暗圖第97頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)取出車子圖所有象素點(diǎn)的顏色取出目前車子圖所在位置區(qū)域中所有暗圖像點(diǎn)的顏色檢查運(yùn)算結(jié)果是否有黑色,若出像黑色則表示發(fā)生碰撞第98頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第99頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)DC名稱說明mdc用來做鏤空處理mdc1用來讀取位圖對(duì)象mdc2存放汽車所在位置區(qū)域中暗圖的影像第100頁,共140頁,2023年,2月20日,星期三三、粒子的應(yīng)用粒子指顆粒狀的物體,如雪花、一塊炸彈碎片、一顆沙子、煙霧中的微粒等,許多粒子組合起來就形成了我們現(xiàn)實(shí)生活中所看到的各種物理現(xiàn)象。使用粒子,首先要了解粒子的用途和屬性,然后再定義出一個(gè)合適的粒子類型。如我們定義一個(gè)雪花粒子:Structsnow{intx;//雪花所在的x坐標(biāo)
inty;//雪花所在的y坐標(biāo)
BOOLexist;//雪花是否存在}例:雪花紛飛。在這個(gè)例子中,雪花不斷出現(xiàn)并緩緩落下,直到達(dá)到雪花的上限(本例中為50)便不再增加。當(dāng)雪花落到地面上時(shí),就重新設(shè)置雪花的顯示位置為窗口的上方,以產(chǎn)生雪花消失與新的雪花出現(xiàn)的效果。本例中OnTimer函數(shù)是整個(gè)程序的重點(diǎn)。
VC++游戲編程——游戲的編程技術(shù)第101頁,共140頁,2023年,2月20日,星期三爆炸碎片(火球)粒子:Structfireball{intx;//火球所在位置的x坐標(biāo)
inty;//火球所在位置的y坐標(biāo)
intvx;//火球在x方向速度
intvy;//火球在y方向速度
intlasted;//火球存在時(shí)間
BOOLexist;//記錄火球是否存在VC++游戲編程——游戲的編程技術(shù)第102頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第八節(jié)管理程序中的消息一、鍵盤消息下表表示MFC中鍵盤輸入消息的處理方式消息說明WM_KEYDOWN按下鍵盤按鍵所發(fā)出的消息 WM_KEYUP 松開按鍵所發(fā)出的消息WM_CHAR按下鍵盤按鍵所發(fā)出的消息,并轉(zhuǎn)換為對(duì)應(yīng)的字符第103頁,共140頁,2023年,2月20日,星期三在MFC中,其消息是以一組虛鍵(virtualKey)來判斷按下或松開鍵盤上的按鍵動(dòng)作,上面三種消息中WM_KEYDOWN、WM_KEYUP不區(qū)分輸入按鍵的大小寫,而WM_CHAR則會(huì)將使用者按下按鍵的虛鍵轉(zhuǎn)換成字母,且具有分辨字母大小寫功能。這三種消息的消息處理函數(shù)的格式比較類似,以WM_KEYDOWN消息的處理函數(shù)OnKeyDown為例:voidcanvasFrame::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){//判斷并處理按鍵消息程序代碼
CFrameWnd::OnKeyDown(nChar,nRepCnt,nFlags);}VC++游戲編程——游戲的編程技術(shù)第104頁,共140頁,2023年,2月20日,星期三
第一個(gè)參數(shù)nCha是按鍵的虛鍵,這些虛鍵都以VK_開頭,下表列出幾個(gè)常用按鍵的虛鍵虛鍵說明十六進(jìn)制VK_ESCAPE Esc鍵 0x1BVK_LEFT左箭頭鍵0x25VK_UP上箭頭鍵 0x26VK_RIGHT右箭頭鍵0x27VK_DOWN下箭頭鍵0x28VK_INSERTInsert鍵 0x2DVK_DELETEDelete鍵0x2EVK_SPACE空格鍵 0x20VK_SHIFTShift鍵0x10VK_CONTROLCtrl鍵0x11VK_BACKBackspace鍵 0x08VC++游戲編程——游戲的編程技術(shù)第105頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)二、鼠標(biāo)消息處理鼠標(biāo)輸入消息:消息說明WM_LBUTTONDBLCLK雙擊按鼠標(biāo)左鍵消息WM_LBUTTONDOWN 按下鼠標(biāo)左鍵消息 WM_LBUTTONUP 松開鼠標(biāo)左鍵消息WM_RBUTTONDBLCLK 雙擊按鼠標(biāo)右鍵消息 WM_RBUTTONDOWN 按下鼠標(biāo)右鍵消息 WM_RBUTTONUP
松開鼠標(biāo)右鍵消息WM_MOUSEACTIVATE 鼠標(biāo)移動(dòng)消息 WM_MOUSEMOVE
鼠標(biāo)滾輪轉(zhuǎn)動(dòng)消息第106頁,共140頁,2023年,2月20日,星期三鼠標(biāo)按鍵消息(左鍵)voidcanvasFrame::OnLBUTTONDBLCLK(UINTnFlags,CPointpoint){//處理鼠標(biāo)消息程序代碼
CFrameWnd::OnLBUTTONDBLCLK(nFlags,point);
VC++游戲編程——游戲的編程技術(shù)第107頁,共140頁,2023年,2月20日,星期三
第一個(gè)參數(shù)nFlags代表消息發(fā)生時(shí)是否有其它按鍵被按下,nFlags的參數(shù)值說明如下:參數(shù)值說明MK_CONTROL按下Ctrl鍵MK_SHIFT按下Shift鍵MK_LBUTTON按下鼠標(biāo)左鍵MK_MBUTTON按下鼠標(biāo)中鍵MK_RBUTTON按下鼠標(biāo)右鍵第二個(gè)參數(shù)Point表示傳入目前鼠標(biāo)指針?biāo)诘淖鴺?biāo)位置,point.x為其在x軸上的位置,point.y為其在y軸上的位置。VC++游戲編程——游戲的編程技術(shù)第108頁,共140頁,2023年,2月20日,星期三鼠標(biāo)移動(dòng)消息voidcanvasFrame::OnMouseMove(UINTnFlags,CPointpoint){//處理鼠標(biāo)移動(dòng)消息程序代碼
CFrameWnd::OnMouseMove(nFlags,point);}參數(shù)nFlags與Point所代表的意義同上。VC++游戲編程——游戲的編程技術(shù)第109頁,共140頁,2023年,2月20日,星期三鼠標(biāo)滾輪消息voidcanvasFrame::OnMouseWhell(UINTnFlags,shortzDelta,CPointpt){//處理鼠標(biāo)滾輪消息程序代碼
CFrameWnd::OnMouseWhell(nFlags,Delta,pt);}nFlags同樣代表消息發(fā)生時(shí)是否有其它按鍵被按下;如果參數(shù)zDalta返回的值為120,表示滾輪向前滾動(dòng),-120表示向后滾動(dòng);參數(shù)pt是代表鼠標(biāo)指針?biāo)诘淖鴺?biāo)點(diǎn)。VC++游戲編程——游戲的編程技術(shù)第110頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第九節(jié)人工智能應(yīng)用一、移動(dòng)型人工智能移動(dòng)型人工智能主要包括三類:固定模式移動(dòng)、追逐移動(dòng)、躲避移動(dòng)。固定模式移動(dòng)在程序里,我們給物體定義一個(gè)移動(dòng)路徑公式,物體就會(huì)按照這個(gè)公式來移動(dòng),這種方式就屬于固定模式的移動(dòng)。固定模式移動(dòng)的設(shè)計(jì)重點(diǎn)在于為游戲中每一類移動(dòng)路徑類似的對(duì)象建立一個(gè)共享移動(dòng)路徑的結(jié)構(gòu),由此共享結(jié)構(gòu)所聲明的對(duì)象則擁有類似的移動(dòng)方式,但通過設(shè)置不同的初始值,這些物體的移動(dòng)路徑就會(huì)有所不同。第111頁,共140頁,2023年,2月20日,星期三2.追逐移動(dòng)追逐移動(dòng)最常見的情況是計(jì)算機(jī)怪物追逐玩家,算法如下:if(怪物X>玩家X)
怪物X--;else
怪物X++;if(怪物Y>玩家Y)
怪物Y--;else
怪物Y++;VC++游戲編程——游戲的編程技術(shù)第112頁,共140頁,2023年,2月20日,星期三對(duì)上面的算法作如下修改:if(怪物HP>200)//生命值大于200時(shí)才追{p=rand()%3;if(p!=1)//余數(shù)不為1時(shí)進(jìn)行追逐
{if(怪物X>玩家X)
怪物X--;
else
怪物X++;
If(怪物Y>玩家Y)
怪物Y--;
else
怪物Y++;
}else
怪物HP+=5;//怪物不動(dòng),休息補(bǔ)血}VC++游戲編程——游戲的編程技術(shù)第113頁,共140頁,2023年,2月20日,星期三3.躲避移動(dòng)if(怪物X>玩家X)
怪物X++;else
怪物X--;if(怪物Y>玩家Y)
怪物Y++;else
怪物Y--;VC++游戲編程——游戲的編程技術(shù)第114頁,共140頁,2023年,2月20日,星期三二、行為型人工智能行為型AI的基本原理是物體會(huì)隨著不同的情況而改變,并作出一些特有的行為動(dòng)作,而這些物體可以包含游戲中的主角、怪物,或四周環(huán)境中的物品。物體的動(dòng)作行為在游戲中加入AI,要預(yù)先想好一些可能會(huì)發(fā)生的狀況和物體所要執(zhí)行的動(dòng)作,并利用if語句來讓物體根據(jù)各種情況產(chǎn)生相應(yīng)的行為。例如以一盞燈為例,它的行為只有兩種:亮與不亮,但是使亮或不亮的情況有多種,如:停電了、電燈壞了、沒按開關(guān)等等。考慮到這些情況后,我們就可以利用if語句來賦予一盞燈相應(yīng)的行為型AI了。我們有如下算法:VC++游戲編程——游戲的編程技術(shù)第115頁,共140頁,2023年,2月20日,星期三if(停電)
燈不亮else{if(燈壞了)
燈不亮
else{if(沒按開關(guān))
燈不亮
else
燈亮
}}VC++游戲編程——游戲的編程技術(shù)第116頁,共140頁,2023年,2月20日,星期三假設(shè)一只怪物有以下幾種行為: 普通攻擊 施放攻擊魔法 使勁全力攻擊 補(bǔ)血 逃跑我們可以編寫如下算法VC++游戲編程——游戲的編程技術(shù)第117頁,共140頁,2023年,2月20日,星期三if(生命值>100){if(rand()%9)
實(shí)施魔法攻擊(1/10的幾率使用魔法攻擊)else
實(shí)施普通攻擊}else{swich(rand()%5){case0:普通攻擊
break;case1:魔法攻擊
break;case2:使盡全力攻擊
break; case3:補(bǔ)血
break; case4:逃跑
if(rand()%2==0)(1/2幾率成功)逃跑成功;
else
逃跑失敗
break; }}VC++游戲編程——游戲的編程技術(shù)第118頁,共140頁,2023年,2月20日,星期三2.路徑查找以迷宮為例,設(shè)計(jì)路徑查找時(shí)必須賦予物體一些走迷宮的法則,如:前面的路走過就往沒有走過的地方走等,這些法則必須可以讓物體探索迷宮中的每一塊區(qū)域來找到出口,若走迷宮的法則定得不完整,那么物體可能在一個(gè)地方兜圈子,永遠(yuǎn)也找不到出口。在迷宮程序中,定義一個(gè)二維數(shù)組maze[8][8]用于存儲(chǔ)整個(gè)迷宮狀態(tài),如下圖所示:并設(shè)置入口的元素值為3,入口的元素值為2,墻的元素值為1,通路的元素值為0。代表入口的數(shù)組元素maze[1][0]。VC++游戲編程——游戲的編程技術(shù)第119頁,共140頁,2023年,2月20日,星期三VC++游戲編程——游戲的編程技術(shù)第120頁,共140頁,2023年,2月20日,星期三
程序中使用一個(gè)雙向鏈表來記錄小球所走過的路徑,結(jié)構(gòu)聲明如下:
structlist { intm; intn; structlist*next; structlist*back; }; typedefstructlistnode; typedefnode*pointer;
數(shù)組pass[8][8]用來記錄迷宮中的格子是否已走過,當(dāng)小球走向沒有走過的格子時(shí),這一格就會(huì)被加到鏈表中,當(dāng)小球走到其上下左右都有墻或都已走過時(shí),就必須倒退,而每倒退一格就表示那一個(gè)是錯(cuò)誤的路,因此要將其從鏈表中刪除。直到走出迷宮,鏈表中的每一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026臨沂職業(yè)學(xué)院招聘教師和教輔人員22人考試參考題庫(kù)及答案解析
- 消費(fèi)類公司管理制度(3篇)
- 全聚德生日活動(dòng)策劃方案(3篇)
- 2026年浙江興海控股集團(tuán)有限公司下屬企業(yè)招聘3人參考考試題庫(kù)及答案解析
- 陵水打井施工方案(3篇)
- 鋁合金銷售管理制度范本(3篇)
- 內(nèi)江二幼招聘編外教師備考考試試題及答案解析
- 2026上海黃浦區(qū)中意工程創(chuàng)新學(xué)院教務(wù)崗位招聘1人備考考試試題及答案解析
- 動(dòng)量定理在高考中的應(yīng)用
- 2026年寧德師范學(xué)院附屬小學(xué)招聘教師2人備考考試題庫(kù)及答案解析
- 企業(yè)員工的職業(yè)道德培訓(xùn)內(nèi)容
- 2025年度法院拍賣合同模板:法院拍賣拍賣保證金退還合同
- 青少年無人機(jī)課程:第一課-馬上起飛
- 化工廠用電安全講課
- 部編版九年級(jí)語文上冊(cè)全冊(cè)書教案教學(xué)設(shè)計(jì)(含教學(xué)反思)
- 2023年魯迅美術(shù)學(xué)院附屬中學(xué)(魯美附中)中考招生語文試卷
- 工廠網(wǎng)絡(luò)設(shè)計(jì)方案
- 福建省泉州市2023-2024學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量監(jiān)測(cè)政治試題
- 日文常用漢字表
- QC003-三片罐206D鋁蓋檢驗(yàn)作業(yè)指導(dǎo)書
- 高血壓達(dá)標(biāo)中心標(biāo)準(zhǔn)要點(diǎn)解讀及中心工作進(jìn)展-課件
評(píng)論
0/150
提交評(píng)論