[心得] 沙漠商旅C的遊戲設計(4)

看板GameDesign (遊戲設計)作者 (溺於黑暗)時間15年前 (2010/03/18 17:58), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串1/1
作者:NDark 時間:201001 沙漠商旅C的遊戲設計(4)-主流程與事件 http://wp.me/pBAPd-b3 遊戲主流程說明 主要流程在stage paragraphing已經說明過了。這邊針對比較值得一提部分再詳細說明。 1.FPS計算:計算FPS以及檢查目前FPS狀況作出相對應的反應。 2.網路處理:未完成預留。 3.3D動畫:未完成預留。 4.更新位置:依照物體的速度更新物體的位置,當然是傳入了FPS 5.2D動畫:未完成預留,保留給Sprite Engine。 以上三個流程是在進行動畫的部分, 之所以網路放在更前面是希望先得到動畫狀態有沒有改變。 6.輸入事件:也就是InputHandle函式 這裡檢查滑鼠左鍵,右鍵,滑鼠目前位置(滑過),鍵盤按鍵等事件。 這些事件是從windows form的事件中產生進來遊戲流程的。 如同我們在stage paragraphing中所提到的,內部都是以stage分段。 這些輸入事件除了比較特別的之外, 大多使用點選系統檢查有無點選到2D或3D場景。然後呼叫gLeftClickOnUID()函式。 gLeftClickOnUID函式的功用是列出並檢查所有會被點選到的物件然後進行事件的觸發。 這是我在事件處理該節說明沙漠商旅C是三層式的原因。 7.碰撞偵測:在物體都更新完畢之後來檢查碰撞偵測。 目前沙漠商旅C有作的碰撞偵測很簡單,只有算距離。 判斷城市與商旅有無碰撞,觸發進入城市的事件。 判斷商旅與商旅之間有無碰撞,觸發進入戰鬥的事件。 我不進一步撰寫碰撞偵測的原因也就是這是一般遊戲引擎應該要有的基本功能。 8.環境變化(讀檔,遊戲事件處理,更新3D視野,更新2D選單) 事件觸發完畢之後,會進入環境變化函式,依據不同的stage會有不同的工作要作。 最重要的是在初始/進入其他模式的階段進行資料讀取的動作。 第二個最重要的工作就是處理遊戲事件。這裡已經在事件處理該節描述過。 此外環境變化還負責像是戰場勝負判斷,遊戲時間進行檢查, 更新3D視野(如同前述,這個步驟已經簡化為讓攝影機依據目標來自己移動), 更新選單(依據目前的stage與啟動的選單來檢查是否有資料要更新)等工作。 9.人工智能: 雖然AI是我很有興趣的一個部分, 但是目前沙漠商旅並沒有針對這塊流程進行開發。 因為沒有AI雖然使得遊戲有缺陷,但是整個遊戲還是可以動起來。 目前沙漠商旅有建構一個簡易的AI平台,用來紀錄玩家角色與電腦角色的行動順序。 我希望未來能有機會完成一定程度,讓電腦角色會動會攻擊。 10.繪圖前處理:可能要做一些處理讓不用畫的物件關閉(未完成預留)。 11.繪圖:設定3D視野,畫3D物件,設定平面視野,畫2D選單 遊戲事件架構與擴充 雖然有關遊戲事件已經在事件處理該節討論了, 這邊把整個架構再說明清楚,並且說明擴充時候要作的事情 在沙漠商旅C的事件處理如同前述是一個事件的串列。 事件處理時用一個while迴圈與switch所組成。 while( 還有未處理事件 ) { EventNow = EventList.front() ; switch( 事件type ) { case event_1 : ... break ; case event 2 : ... break ; } EventList.pop_front() ; } 系統與特色 事件處理的一個目的是集合不同的觸發,達到相同的結果。 舉例來說CME_ChangeState_StudioLogo就是進行自工作室宣告頁切換下一頁的事件。 雖然這個動作十分的簡單但是,如果不這樣設計,會變的十分不容易維護。 因為這個換頁的動作可能是由很多地方所驅動 1. 滑鼠按任何鈕:左鍵 右鍵  2. 鍵盤按任何鍵:全部按鈕 3. 一個計時器,當工作室宣告出現一定時間,如1秒並fade out之後。 有了這個事件,我們就在以上這三種區域撰寫事件的觸發。 if( IE_TYPE_KEY == InputType ) { switch( gpSystem->m_eGameStageNow )// 當然要檢查一下stage { ... case GS_Stage_PreMainMenu : { ... // 假如工作室選單是開啟狀態,這個key會產生一個換工作室頁的事件 if( true == gsMenuManager.GetStateActiveByName( STATE_StudioLogo) ) { gEventAdd( CME_ChangeState_StudioLogo ) ; } ... 而滑鼠與鍵盤也相同。 事件處理的內容就可以寫在同一個地方,避免分開維護。 有些事件攜帶了一個變數, 譬如說按下讀檔清單的第幾格產生了事件 gEventAdd( CME_ChangeState_LoadSlot , i ) ) ; 事件 第幾格 事件處理的時候就要取出到底是要讀第幾個存檔。 有些事件攜帶了不只一個變數, 譬如說打到敵人這個事件CME_Battle_HitEnemy就攜帶了 誰被打到 與 傷害值 兩個變數。 攜帶的變數基本上是看事件需求而定,而基本上不會弄錯, 要使用事件的時候當然會知道這事件帶幾個參數, 就跟硬體指令一樣開發時必須列出清單讓團隊的人員都清楚。 另外某些事件造成的影響有時候必須經由某些變數存起來, 等待到選單或是某些流程執行的時候才使用, 這種變數資料暫存的機制也必須要謹慎分配清楚, 避免程式時期使用到相同變數的情形。 譬如說讀檔清單假如可以顯示好幾頁, 那麼就會有一個變數SlotIndex是紀錄目前第一個欄位是存檔清單的第幾個。 按下上一頁時(事件),這個變數就會減少。 使得顯示選單的時候會在第一欄位的空間顯示SlotIndex的存檔資料,以此類推。 同時真正讀取該欄位確定時,如讀取第三欄位,則真正讀取的存檔當然是 存檔陣列中[ SlotIndex+3 ]的內容。 因此這個變數同時會影響到 控制 顯示 讀取(流程) 三個部分。 有關於事件的擴充,在沙漠商旅C中會需要作以下幾件事情。 1. 在GameEvent.h中宣告這個事件 2. 事件發生,如果是一個新的選單按鈕則在UIDDefine.h要新增這個選單 3. 在InputHandle()中撰寫事件發生的程式 4. 在EventHandle()中撰寫事件處理的程式 5. 用break point檢查這個事件有沒有被正確觸發 6. 用正常模式檢查事件觸發的反應是否正確,如否,用break point再去各地檢查。 有點囉唆是真的,尤其是當事情發生在不同地方的時候XD。 -- "May the Balance be with U"(願平衡與你同在) 視窗介面遊戲設計教學( http://0rz.tw/V28It ),討論,分享。歡迎來信。 視窗程式設計(Windows CLR Form)遊戲架構設計(Game Application Framework) 遊戲工具設計(Game App. Tool Design ) 電腦圖學架構及研究(Computer Graphics)論文代讀(含投影片製作) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.96.77.176 ※ 編輯: NDark 來自: 140.96.77.176 (03/18 17:58)

03/18 21:26, , 1F
推!
03/18 21:26, 1F

03/20 20:06, , 2F
再推一次XD
03/20 20:06, 2F
文章代碼(AID): #1BeVarLT (GameDesign)
文章代碼(AID): #1BeVarLT (GameDesign)