【簡介:】一個(gè)簡單的RPG游戲 首先,要制作一個(gè)RPG的游戲。所需要涉及到的方面,有以下幾個(gè): 1. 使用鍵盤控制精靈。2. 由于精靈有四個(gè)走動(dòng)方向,而每個(gè)方向又應(yīng)該有幾幀動(dòng)畫(這里定為二幀)???
一個(gè)簡單的RPG游戲 首先,要制作一個(gè)RPG的游戲。所需要涉及到的方面,有以下幾個(gè): 1. 使用鍵盤控制精靈。2. 由于精靈有四個(gè)走動(dòng)方向,而每個(gè)方向又應(yīng)該有幾幀動(dòng)畫(這里定為二幀)。考慮到每個(gè)機(jī)器的配置不一樣(CPU和顯卡不同)。 所以幀與幀之間必須有延遲。 3. 當(dāng)精靈在我們所定的迷宮里行走時(shí),當(dāng)它碰到"障礙"時(shí),應(yīng)該無法繼續(xù)前進(jìn)。 4. 在游戲里,還應(yīng)該有"壞精靈"。在我這個(gè)游戲里,其表現(xiàn)狀態(tài)為"追趕受控的精靈"。(目前,只使用了簡單的追逐算法,所以"壞精靈"有時(shí)會(huì)卡住。在將來的版本里將考慮使用A*算法。) 5. 精靈的移動(dòng)不應(yīng)該只局限于屏幕的高寬,這時(shí)就需要卷軸了。 以下是具體解決辦法:(對應(yīng)上面4個(gè)問題)1. 只需使用WINDOWS消息WM_KEYDOWN即可。在DX環(huán)境下使用DirectInput來操作鍵盤。2. 為每一張精靈位圖分別分配一塊內(nèi)存保存其圖像信息。這樣每一張位圖對應(yīng)一個(gè)指針。(這里我使用一數(shù)組實(shí)現(xiàn),其大小由具體的圖像數(shù)量決定)具體訪問時(shí),我又指定了一個(gè)指向此數(shù)組的指針,在精靈運(yùn)動(dòng)時(shí),只需操作指針+=偏移量即可,這樣在繪制時(shí),只需繪制此指針的值就行了。在這里,我設(shè)定受控精靈的運(yùn)動(dòng)偏移量為2(像素)。接著定義一int 數(shù),初始其為0,在每次精靈的有效運(yùn)動(dòng)(這里只是指UP、DOWN、LEFT、RIGHT四個(gè)方向操作,而且每次只允許一個(gè)有效。要不然就會(huì)當(dāng)用戶同時(shí)按下以上四個(gè)方向任何兩個(gè)時(shí),出現(xiàn)此精靈斜向運(yùn)動(dòng),因?yàn)榇藭r(shí)它的位置坐標(biāo)x和y可能同時(shí)發(fā)生了改變)時(shí)遞加。規(guī)定一個(gè)常量值,在上個(gè)int整數(shù)等于此常量時(shí),令其清零。這整個(gè)操作的意義為,當(dāng)此int數(shù)等于常量值時(shí),此時(shí)精靈狀態(tài)為當(dāng)前方向的第一張動(dòng)畫;當(dāng)?shù)扔诔A恐?2時(shí),為第二張。這樣就產(chǎn)生了動(dòng)畫效果。再談?wù)勓訒r(shí),只需在WM_CREATE消息時(shí)定義一個(gè)TIMER。然后在每次設(shè)置指針偏移時(shí),首先判斷TIMER是否有效即可。 例: 首先定義TIMER,再定義一變量state = 0 (其變化為:當(dāng)TIMER發(fā)生時(shí),state=1-state ) 第一張動(dòng)畫if(時(shí)間延時(shí)) if(遞加的變量==常量值)指向精靈數(shù)組的指針=精靈數(shù)組+偏移量; 第二張動(dòng)畫 if(!時(shí)間延時(shí)) if(遞加的變量==常量值*2)指向精靈數(shù)組的指針=精靈數(shù)組+偏移量; 3. 用一單色位圖記錄地圖信息。其中白色為可通行,黑色為不可行。 然后繪制時(shí)由此位圖生成用戶可視地圖。并用一全局二維數(shù)組記錄此地圖。然后每次精靈移動(dòng)時(shí),其實(shí)是在此二維數(shù)組里移動(dòng),在其移動(dòng)前進(jìn)行判斷下一步是否可行。具體的判斷方法由精靈的坐標(biāo)來換算出其實(shí)際在我們的地圖數(shù)組中的位置,然后取此位置值,判斷此處是否可以通行。4. 至于"壞精靈"的跟蹤算法。目前只是簡單的遞加和遞減,沒有必要再進(jìn)一步闡述。將來使用A*算法,再寫出具體思想吧。 5. 為了表現(xiàn)游戲的世界觀,有很多時(shí)候精靈是在一個(gè)很大的地圖上行走,其大小會(huì)大于我們所見的屏幕大小,這時(shí)就要用到卷軸。 現(xiàn)在已知有兩個(gè)方法,簡單的是擁有或創(chuàng)建一個(gè)所需的大地圖,其具體表現(xiàn)形式可能是BMP位圖,在DirectDraw里的概念叫“表面”。方法是,每當(dāng)操作者控制精靈移動(dòng)時(shí),只需改變精靈的朝向和狀態(tài),并不改變其實(shí)際坐標(biāo)。而真正發(fā)生變化的,是操作者所看到的屏幕。也就是背景移動(dòng)而在中心的精靈不動(dòng),這樣會(huì)給人以錯(cuò)覺,覺得是精靈在移動(dòng)。而我們所要做的,就是計(jì)算一個(gè)矩形,這個(gè)矩形的范圍也就是操作者所能看到的。它實(shí)際上是整個(gè)地圖中的一部分。BMP位圖有一個(gè)操作函數(shù)叫做StretchBlt和DirectDraw中表面的Blt方法類似,都是從源位圖拷貝矩形區(qū)域到目標(biāo)位圖中去。利用它們的功能和我們先前計(jì)算出來的矩形數(shù)據(jù),就可以實(shí)現(xiàn)了!具體來說:無卷軸時(shí)是精靈本身移動(dòng),地圖不動(dòng);而卷軸的時(shí)候,是整個(gè)屏幕(即我們所要計(jì)算它實(shí)際在地圖中的矩形位置)在地圖里移動(dòng)(注:其移動(dòng)是與精靈相反的),在地圖卷到盡頭時(shí),精靈開始無卷軸時(shí)的移動(dòng),其它時(shí)候不動(dòng)。------------這里有個(gè)網(wǎng)站,RPG制作大師,希望對你有點(diǎn)幫助 http://www.66rpg.com