對于飛機(jī)射擊類游戲的設(shè)計(jì)原理
發(fā)表時(shí)間:2024-06-11 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]眾所周知,飛機(jī)射擊類游戲幾乎是我們接觸到的第一類計(jì)算機(jī)游戲,不論是在街機(jī)中還是在計(jì)算機(jī)中,這一類游戲都是非常容易上手和招人喜愛的。就算是在這個(gè)即時(shí)戰(zhàn)略游戲、3D第一視角游戲等盛行的年代,閑暇是玩玩打飛機(jī)的游戲也是很愜意的。 在這幾天里學(xué)完了有關(guān) DirectX 方面的知識后,就上手編了一下飛機(jī)...
眾所周知,飛機(jī)射擊類游戲幾乎是我們接觸到的第一類計(jì)算機(jī)游戲,不論是在街機(jī)中還是在計(jì)算機(jī)中,這一類游戲都是非常容易上手和招人喜愛的。就算是在這個(gè)即時(shí)戰(zhàn)略游戲、3D第一視角游戲等盛行的年代,閑暇是玩玩打飛機(jī)的游戲也是很愜意的。
在這幾天里學(xué)完了有關(guān) DirectX 方面的知識后,就上手編了一下飛機(jī)射擊的游戲?雌饋砗孟蠛軓(fù)雜,其實(shí)只不過是些數(shù)據(jù)結(jié)構(gòu)的集合而已,還是比較容易實(shí)現(xiàn)的。
關(guān)于 DirectDraw 方面的編程,我就不想介紹了,因?yàn)槿魏我粋(gè)人照本書看幾天就可以編出象樣的示范程序了,無非是在申請的2~3個(gè)表面上輪換貼圖而已,WIN32 的 API 函數(shù)似乎已經(jīng)讓我們不需要花什么精力就可以實(shí)現(xiàn)非常平滑的動畫了。
下面簡單介紹一下設(shè)計(jì)方法,關(guān)鍵是PLAYER的飛機(jī)和敵人的飛機(jī)的控制,以及它們的子彈的控制。
很顯然,用2個(gè)對象就可以實(shí)現(xiàn)它們的控制了。分別是PLAYER的飛機(jī)(可以是2架)、敵人的飛機(jī)。
PLAYER的飛機(jī)類:
class CPlayer
{
private:
CPoint ptPos; //飛機(jī)坐標(biāo)
struct bullet *stBullet; //飛機(jī)所發(fā)出的所有子彈的鏈表
struct display PlaneDisplay; //即有關(guān)飛機(jī)的位圖信息指針、飛機(jī)有效區(qū)域等信息
private:
FreshBullet(); //定時(shí)刷新子彈鏈表,除去已經(jīng)爆炸或消失的子彈
public:
int nOil; //飛機(jī)油料
int nSpeed; //飛機(jī)速度
int nDisplayState; //顯示方式,如果被擊中,就轉(zhuǎn)向爆炸狀態(tài),以便
//飛機(jī)顯示函數(shù)顯示爆炸效果,比如,正常是1,
//消失是0,而爆炸就是-15。這樣,顯示函數(shù)可以
//單純的按照這個(gè)植,在SUFFACE中計(jì)算圖象位置
//直接顯示就可以了,每次+1,這樣-15加了15次就
//變成0了,動畫也顯示了,飛機(jī)也消失了,不需要
//其他處理。這樣的方法也可以用在子彈的處理上,
public:
CPoint GetPos(); //獲取飛機(jī)的坐標(biāo)
void SetPos(CPoint); //社頂設(shè)定飛機(jī)坐標(biāo)
void AddBullet(struct bullet*); //給飛機(jī)加入子彈,只要每隔設(shè)定的 TickTime
//就加入一次,就可以形成連續(xù)的發(fā)彈效果
void RunBullet(); //每隔設(shè)定的 TickTime,按Bullet的屬性更新
//Bullet的坐標(biāo),就可以形成復(fù)雜的子彈效果
struct bullet* IsAttack(CPoint); //獲取當(dāng)前坐標(biāo)是否有子彈,并返回子彈指針
//這是為了判斷敵機(jī)是否被擊中所設(shè)計(jì)的函數(shù)
//敵機(jī)只要將自己的坐標(biāo)放入CPoint中,就可以
//知道是否被擊中,并且用指針設(shè)定子彈的狀態(tài)
}
子彈的STRUCT
struct bullet
{
struct bullet* next; //指向下一個(gè)子彈
int nStyle; //子彈的種類
int nSpeed; //子彈的速度
int nDirection; //子彈的方向
int nDisplayState; //顯示方式,如果擊中目標(biāo),就轉(zhuǎn)向爆炸狀態(tài),以便
//Runbullet函數(shù)顯示爆炸效果,同上邊的飛機(jī)處理方法一樣
}
敵機(jī)的類和PLAYER的飛機(jī)類差不多,去掉油料等的屬性,多加入一個(gè)MotionStyle屬性,控制飛機(jī)的
飛行方式和攻擊方式,如直線、斜線、曲線、SIN方式、跟蹤方式等。再加入一個(gè)Run()方法,利用
MotionStyle在每個(gè)TickTime時(shí),決定飛機(jī)坐標(biāo)的變換方法,這樣就可以很直觀的控制飛機(jī)的飛行和攻擊。
在判斷雙方是否被攻擊時(shí),只要先用PLAYER對象的IsAttack,將所有敵機(jī)對象的坐標(biāo)放入其中,就可以
獲取所有被PLAYER擊中的飛機(jī),反過來用所有敵機(jī)的對象調(diào)用IsAttack,將PLAYER飛機(jī)的坐標(biāo)放入其中,
就可以知道PLAYER是否被擊中。
至于是否被擊中,可以單純的用矩形來判斷,完美的方法當(dāng)然是用Rgn(區(qū)域)來判斷,將飛機(jī)的輪廓變
成區(qū)域就可以了。
至于背景的設(shè)計(jì)就更簡單了,只要用一個(gè)二維數(shù)組,每個(gè)數(shù)組單位中存放著位圖的代號,通過一個(gè)代號與
位圖RECT的映射,就可以產(chǎn)生一幅背景圖了。如果想產(chǎn)生立體感,或者背景中的單位有遮蓋現(xiàn)象,可以通過
設(shè)定優(yōu)先級的方法,將優(yōu)先級底的先畫,然后畫優(yōu)先級高的,自然就可以產(chǎn)生立體效果了。更簡單的方法就是
直接按從上往下(假設(shè)背景立體感是向上的)的順序貼圖,就可以了。