RPG遊戲引擎開發日誌1 理解分析RPG遊戲

2021-08-08 23:27:48 字數 2896 閱讀 1673

**:

rpg遊戲

├ 地圖

│ ├ 背景

│ ├ 前景:建築、山、河、樹等

│ ├ 玩家

│ │ ├ 面向、座標

│ │ └ 動作:站、走、跑、跳、其他動作如攻擊

│ ├ npc:同玩家

│ ├ 物品:掉落的東西,可撿起的東西等

│ ├ 元素:比如射擊後飛行的子彈

│ └ 視窗:人物資訊、技能資訊、包裹、對話等

└ 遊戲資訊的顯示視窗:迷你地圖、生命值、物品欄、聊天框等

1.    地圖層次

把玩家和npc等都放到地圖中是因為會出現這樣乙個情況:當玩家走動的時候,只需移動地圖而不是移動地圖時還要移動玩家和npc。

這裡把地圖分成三層:

背景層:在任何時候它都處在最底層,並且我是認為它不應該有動畫(影片剪輯)存在,背景是整個地圖中最大的,它有大幅的動畫會嚴重影響速度。如果需要動畫那就把動畫放到中間層吧。

前景層:所有會與玩家交換深度的東西都在這一層,它們會參與遊戲的互動(如發生碰撞)。

頂層:在任何時候都會顯示在最上面,而且為了遊戲的速度,頂層並不跟著玩家的移動而移動。如:雲和雨。

在每一層中也存在深度關係。

2.    地圖描述

每張地圖會被分割成乙個區塊的陣列,陣列的值就描述了這個區塊的資訊,這些資訊有障礙特性、空置特性、例項深度、事件id(比如:用於地圖跳轉的出口)。

障礙特性應有三種值,沒障礙、有物體但沒障礙、有障礙,有物體但沒障礙是為了在深度交換中使用的。

空置特性:表示該區塊是否為「空」可放置物品,單獨使用這個來表示能否放置物品而不用障礙特性來表示,是因為可以通行的區塊可能不允許放置物品,比如傳送點,不可通行的區塊也可能允許放置物品,想深草地上不能通行但可以放置物品。

背景和前景它們統稱為圖形,圖形有乙個id和圖形檔案位址以及乙個區塊的陣列,這個陣列的值中標識障礙特性、空置特性。在檔案中儲存地圖的描述時,是把三個層單獨來表示的,背景層每個區塊存乙個值,類似陣列,前景層是乙個列表,表示出圖形的id和位置等,事件也要儲存。

圖形是可以被重複使用的,它們可以多次的拖放到地圖上,對於前景圖形它被放到地圖上時還可以新增名稱和介紹資訊,用於在互動過程中顯示,程式執行中前景圖形的例項深度會賦給相應區塊陣列值的例項深度上(前景圖形所占有的每個區塊陣列值都會賦值)。

使用這樣的地圖描述就可以很好的實現遮擋效果了,「遮」即是深度交換,以玩家和建築物為例,只要判斷玩家前方(玩家的面向即前方)一排區塊中任意乙個區塊所對應的陣列值即可知道是否需要交換玩家與建築物的深度(此深度值即地圖陣列中的例項深度)。「擋」即是碰撞檢測,同樣也是根據地圖陣列中的值判斷前方是否存在物體來判斷碰撞的發生。

這樣構建地圖陣列的方式完全是從效率上的考慮的,第一:陣列中存放了例項深度而不是例項的名稱,因為通過例項名稱獲得例項物件(即getchildbyname方法)沒有痛過深度獲得例項物件(即getchildat方法)的效率高;第二:如果不在地圖陣列中不存放例項深度也是可以找到前方例項物件的,可以用getobjectsunderpoint方法獲得例項物件,但這種做法程式寫的不好的話會出現找不到例項物件的情況(本人用as3改寫牧場遊戲時使用的是這種方法,經過多次除錯才得以完美實現),因此這種方法不夠好;第三:如果使用hittestobject、hittestpoint或者hittest進行碰撞檢測是不合適的,因為這些函式只是發生了碰撞後才能檢測到,但我們實際上是要進行碰撞的**,雖然後兩個函式可以進行高效率的畫素級檢測而且可以通過一些手段使用它們進行碰撞的**,但需要事先知道待檢測的物件而這也正是我們想知道的而且現有的陣列標識的方法效率上也很不錯,因此這裡的碰撞檢測應該稱為碰撞**。

雖然很好的減少了頻繁操作的可能,但這種做法所擔心的一點就是玩家與npc之間的碰撞檢測的效率問題,因為玩家和npc的任何一點移動都需要對地圖陣列的更改,玩家和npc多的話這將帶來很大的負擔,因此我準備做乙個選項設定是否啟用角色的遮擋特性,如果不啟用將會出現角色踩在另乙個角色的身上。

45度全視角,實際上45度視角並不是45度的,它在地圖的高度上縮小了一半,這樣視角就是26度多了,我想這樣做主要是因為完全45度視角會造成沒有近大遠小的透視效果,導致視覺上不舒服。下面這個圖是我設想的45度全視角的地圖(補上了四個角上的區塊,使整個地圖不是乙個菱形而是乙個長方形),不過還在考慮是否用這種方式,這個的地圖陣列就仍然用90度視角下的方式,不旋轉,座標轉換公式為:

小菱形高:h,小菱形寬:w=2h

遊戲座標x=2h*j-(i%2)*h

遊戲座標y=i*h/2-h/2

3.    動作與技能

乙個動作的執行序列:

動作┬>技能───────┐

├>作用物體發生動作 

└>無反應 

動作和技能都是乙個動畫,動作由玩家或npc自主產生,有些動作不產生技能,直接作用到物體或者無任何反應,有些動作產生技能,然後作用到物體或者無任何反應,技能動畫是由程式控制的,可以有跟蹤、直線飛出以及作用範圍。

被動作或技能作用到的物體有時會進入一種狀態,狀態也可以是有動畫效果的,它由定時器或者其他動作作用於它而結束。

4.    換裝

實現原理:對每乙個裝備(如衣服和手套等等)都做多個針對每乙個角色的每乙個動作的動畫,這些動畫中只有這乙個裝備,為什麼要多個動畫呢,某個角色向左行走這個動作的手套動畫就需要兩個,左手乙個右手乙個,左手的深度最高,右手的深度最低(會被角色本身和其他裝備遮擋),當然也可以是乙個動畫。當某個角色在進行某個動作的時候,程式要將該角色當前穿著的所有裝備的該動作所有動畫根據相對於角色本身的深度值放到該動作上,這樣就實現了換裝。

從上面那麼難表達的話中可以看出換裝對美術人員來說是非常大的工作量,本來乙個動作要想做的很好就已經很耗時的,何況要針對每個角色的沒個動作做動畫。上面提到的角色一詞指玩家和npc。

遊戲開發日誌 1

很久沒有在自己的blog發表文章了,感覺有點過意不去。於是今天試過n次密碼後終於以管理員的身份進入了久違的專欄。自己的記性是越來越差了!掐指一算,進入遊戲開發這個行業已經有一年半的時間了,想當初剛進公司的時候,還是乙個懵懂的頑童,現在也可算是久經沙場啦。原來在一家台灣的製造企業裡打工,不知不覺過了兩...

Silverlight遊戲專案開發日誌 11 10

game architecture game operation logic 1 game initialization process i factories keyword 1.mainusercontrol 指明遊戲部署的usercontrol 2 rootcanvas 作為根的ui元素 3 ...

Silverlight遊戲專案開發日誌 11 3

tools 在visualstudio中開啟異常檢測,開啟主選單 除錯 異常,將common language runtime exception勾選上,這樣就表示對於捕獲的異常也break,這樣就可以發現被吃掉的異常了。在開發過程中,千萬不要隨便用catch 把異常吃掉了,以圖乙個耳根子清靜。這樣...