freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于vc的飛行模擬游戲的設計及實現(xiàn)(編輯修改稿)

2025-07-19 01:42 本頁面
 

【文章內(nèi)容簡介】 4.3.1 主類 Level 的實現(xiàn)Level 類是最核心的類,他實現(xiàn)了最初關卡的創(chuàng)建,最終關卡的銷毀,并實現(xiàn)了檢測碰撞,為 Object 類里的物體實現(xiàn)碰撞提供了接口,同時,Level 類中的兩個方法 getNearestEnemy 和 getNumCompanies 則為敵機對玩家實行攻擊策略提供了函數(shù),最后,玩家“吃”掉獎子后生命增加和得分增加的函數(shù)實現(xiàn)也包含在 Level 類中,所謂關卡,就必須要有一定的運行狀態(tài),關卡運行有三種狀態(tài),可以定義一個枚舉類型來定義三個不同的狀態(tài),這里用到枚舉類型的原因是,關卡運行的狀態(tài)只有運行,結(jié)束和失敗三種,只有有限的幾種可能值,雖然可以用 int, char 等類型來表示他們,但是對數(shù)據(jù)的合法性檢查卻是一件很麻煩的事情,而 C++中的枚類型就是專門來解決這類問題的typedef enum Status //關卡狀態(tài)定義一個名為Status的枚舉類型 { LEVEL_END, //關卡結(jié)束 LEVEL_FAILED, //關卡失敗 LEVEL_RUN, //關卡運行 }。同時,在游戲運行中會發(fā)生不同的事件,也需要一一定義,由于游戲事件較多,同理,也需要定義一個枚舉類型來定義眾多的事件enum Event { E_RenewPlayer,//! 創(chuàng)建玩家,關閉所有事件 E_ReadyDelay,//! 顯示‘ready’前的等待,并啟動E_Ready 事件 E_Ready,//! 顯示‘ready’,啟動E_RenewPlayer 事件 E_LevelEnd,//! 使關卡處于完成狀態(tài),表示通關 E_LevelFailed,//! 使關卡處于失敗狀態(tài) E_LevelFailedDelay,//! 關卡失敗前的等待,并啟動E_LevelFailed 事件 E_LevelEndDelay,//! 關卡通關前的等待,并啟動E_LevelEnd 事件 }。接下來,我們所要做的,便是創(chuàng)建關卡,從關卡文件中讀入物體數(shù)據(jù),創(chuàng)建物體并加入到關卡中bool create (char *name, dev::ResourceManager* rs, dev::KeyBoard *kb)。在關卡最初創(chuàng)建時,需要把敵機數(shù)目設置為 0,把關卡狀態(tài)設置為運行,同時應該關閉定時器。接著就是使用 io 包內(nèi)的 ReadFile 創(chuàng)建對象 rf,方便讀取文件,以實現(xiàn)關卡中敵機的初始化,由于 IO 包不透明,所以無法了解其內(nèi)部是如何實現(xiàn)這一功能的,在此,只能列出在文本中的格式,格式如下:視圖 獎子 爆炸 子彈 體力 坐標 X 坐標 Y 策略號視圖有兩種:編號 1 表示使用第一個敵機圖片,編號 2 表示使用第二個敵機圖片;獎子有四種:編號 0 表示沒有獎子,編號 1 表示獎一個生命的獎子,編號 2 表示獎勵三發(fā)子彈武器的獎子,編號 3 表示獎勵 20 分的獎子;爆炸有三種:編號 0 表示小型爆炸,編號 1 表示普通爆炸,編號 2 表示大型爆炸;子彈有四種:編號 0 表示小單發(fā)子彈,編號 1 表示雙發(fā)子彈,編號 2 表示三發(fā)子彈,編號 3 表示反彈型單發(fā)子彈,編號 4 表示高速雙發(fā)子彈;體力的數(shù)值就表示可以被攻擊多少次;坐標的兩個數(shù)值即為敵機在關卡中的坐標位置。比如說,要設置一個使用第一張敵機圖片,掉落一個獎勵 20 分的獎子,爆炸類型為普通爆炸,發(fā)射小單發(fā)的子彈,可被攻擊 1 次,坐標為 60 80 的敵機,那么就在文本文件中輸入 1 3 1 0 1 60 80由于這里涉及設備層中的資源管理器,提供加載圖片和聲音的服務以及設備層中的鍵盤,提供輸入查詢,具體的實現(xiàn)將放到重要問題說明中詳細介紹。關卡創(chuàng)建完畢,就應該向其中添加我們想要的東西,并使其工作void Level::add (Object *o)//向關卡里添加敵機的實現(xiàn){ int id = ogetRuntimeClassID()。//獲取物體運行時的類ID if (id==Enemy::ClassID)//如果物體是敵機,增加敵機數(shù)目 { mNumEnemies++。 }在這里向關卡中添加敵機時先要判斷當前被添加物體是否為敵機,如果是才添加,如果不是,則不添加。敵機添加完畢就需要創(chuàng)建玩家,玩家的位置是固定的,把玩家的坐標位置設置為:X 軸坐標設置為當前關卡 X 軸的二分之一,Y 軸坐標設置為當前關卡 Y軸最大值減 20psetPos (amp。Vector(, ))。要添加,就必須要移出,所以相應的,也就有摧毀物體,比如在關卡結(jié)束后,我們需要摧毀關卡中所有的資源,所以我們定義一個 destroy 方法,摧毀關卡中的所有物體,釋放資源給資源管理器,比如圖片和聲音void destroy (dev::ResourceManager* rs);同時,關卡還需要處理玩家或者敵機的死亡,我們定義一個 processDie 的方法來實現(xiàn),流程如下圖 2 處理飛機死亡流程其中在判斷物體的類別,并且完成玩家和或者敵機的死亡后繼續(xù)判斷玩家的生命是否用盡和敵機數(shù)目是否為 0,這樣做的目的是為了避免在玩家和最后一個敵機同歸于盡的時候依然進入關卡結(jié)束事件。而 update 方法算是 Level 類中比較關鍵的方法,他更新關卡中的所有物體,包括檢測碰撞,更新定時器,處理碰撞等,其中最主要的方法便是物體的越界處理,首先計算物體的坐標與關卡邊緣是否發(fā)生相交,其中判斷是否在 X 軸越界的算法為:取出物體的坐標,判斷其是否小于關卡的坐標 X1 或者其是否大于關卡的坐標 X2,若滿足一項時,則調(diào)用 Object 類中的 onOutOfArea 方法,實現(xiàn)每個物體不停的越界實現(xiàn),流程圖如下圖 3 判斷物體是否在 X 軸上越界流程其中,關于檢測物體碰撞由于是本設計的重點和難點,將放在后面的重要說明中具體說明。關卡還需要實現(xiàn)兩個方法,那就是 getNearestEnemy 和getNumCompanies,它們主要是用來實現(xiàn)敵機的攻擊策略的,這里首先要聲明一下,當玩家,敵機和獎子類被創(chuàng)建時,都會獲取一個 ID,以表明其身份,同樣的,凡是通過這幾個類創(chuàng)建的對象也具有與其所屬類相同的 ID,通過這樣的方法,就可以把關卡中眾多的物體相互之間區(qū)分開。getNearestEnemy 主要是實現(xiàn)敵機將離其最近的玩家作為目標,以實現(xiàn)跟蹤策略,其基本思想是,以當前物體作為中心,對整個關卡中的物體進行一個遍歷,若它們同為敵機,則繼續(xù),若它們一個為玩家,一個為敵機,則計算出與其的距離,選出其中與自己距離最小的物體,判斷其是否小于最小距離,若小于,則把當前物體鎖定為自己的目標,流程如下開始取出當前物體的坐標是否大于關卡坐標 X2或者小于關卡坐標 X3通知物體做越界處理結(jié)束開始圖 4 鎖定最近敵人的流程getNumCompanies 方法主要是用于給敵機策略提供一個接口,它是基于這樣一個想法,那就是當敵機總數(shù)大于一個數(shù)值時,敵機不會做出任何攻擊動作,而當玩家消滅一定數(shù)量后,敵機便會實行攻擊策略,getNumCompanies 就是讓敵機獲取當前敵機總數(shù),當其返回值小于一定的值時便執(zhí)行攻擊策略,實現(xiàn)的方法仍然是對以當前所指向的物體為中心進行遍歷,若被遍歷到的物體與其為同一隊伍且同為敵機或玩家,則同伴數(shù)目增加 1,最開始時,同伴數(shù)目設置為0,流程如下圖 5 取得同伴數(shù)目流程此外,關卡還需要管理增加玩家生命和得分,用于實現(xiàn)玩家“吃”掉獎子后的屬性改變,分別定義為 addPlayerLife 和 addScore 方法實現(xiàn),實現(xiàn)方法為他們實現(xiàn)自加即可。4.3.2 Object 類的實現(xiàn)Object 類主要管理物體的可視性,速度,以及判斷設置物體的隊伍和判斷隊伍是否一樣等,他抽象了所有的物體,也就是說,其中所有的屬性和方法是一切物體都具有的,這樣做是為了增加代碼的重用量,這也是運用 C++開發(fā)游戲的好處之一,但是,這樣做就要求把 Object 類的析構(gòu)函數(shù)設為虛函數(shù),這是因為如果不將析構(gòu)函數(shù)設為虛函數(shù)的話,那么當用一個 Object 類的指針刪除一個其子類的對象時,子類的析構(gòu)函數(shù)就不會被調(diào)用,雖然這樣做并沒有什么實際意義,但是這卻符合用 C++進行軟件開發(fā)的時候一般用來做基類的類的析構(gòu)函數(shù)設為虛函數(shù)的默認規(guī)定,因此,需要將析構(gòu)函數(shù)設為虛函數(shù)。此外,還有幾個方法是需要重點提及的:ObjectTracer* setTracer 是設置越界處理器,這個處理器將處理物體的越界事件ObjectTracer* setTracer (ObjectTracer* tr) //指針指向新的越界處理器 { ObjectTracer* old = mTracer。 mTracer = tr。 return old。 //返回舊的越界處理器 }setDirection 是用來設置物體的移動方向,這個方向為用來修改物體的當前運動速度void setDirection (Vector* dir) //指針指向新方向向量 { Vector* vel = getVelocity()。 dirnormalize ()。// 單位化這個向量 velmultiply (dir)。// 應用這個向量到速度上 }onOutOfArea方法是為了實現(xiàn)物體越界的處理函數(shù),將任務代理給mTrancer處理,這樣實現(xiàn)了ObjectTracer接口的類都可以處理物體的越界void onOutOfArea (bool onX) //onX 為真的話表示在X軸上越界,否則在Y軸上 { if (mTracer) mTraceronOutOfArea (this, onX)。 }通過這樣的方法,在前面提及的Level類中的update方法就可以成功地實現(xiàn)越界處理。另外,顧名思義,所謂Object類,肯定是要設定所有物體的屬性的,這些屬性包括是否可見Visible,是否可碰撞Collidable,物體所屬隊伍號Team,設置位置setPos和獲取位置getPos,設定速度setVelocity和獲取速度getVelocity,需要說明的是,這里的速度不是普通的標量,而是一個矢量,即它是有方向的,這樣做的好處就是由于飛機是只能向前開火,并且其面朝的方向應該和其速度的方向一致,那么如何來實現(xiàn)這兩點呢?這就需要把速度設置為一個矢量,這樣一來,就可以把飛機的開火方向和面朝方向與速度方向取一致。4.3.3 Plane 類的實現(xiàn)Plane 類是 Object 類的子類,它通過 Object 類公有繼承而來,所以,凡是 Object 類中有的方法和屬性,它也具有,當然,我們必須為起
點擊復制文檔內(nèi)容
教學教案相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1