《饑荒》這款遊戲是怎麼做的?

很好奇它是怎麼做的。用的什麼引擎?怎麼組織的遊戲世界等等。反正就是詳細一點的吧。。。。。


額,搜到了這個問題,我就隨便答一下吧,下面都是我的猜測,正確與否自行判斷。

一、用的什麼引擎?

不知道,推測可能是cocos-2d或者他們自己寫的一個框架。

  • Don"t Starve 用FMOD來處理聲音,在datasound目錄下的文件可以用fmod_eventplayer.exe這個程序來編輯。
  • Don"t Starve 的圖片好像是用類似PVR格式的紋理載入的。數據目錄下面所有後綴是*.tex的就是紋理文件。每一個紋理還有一個同名的xml文件來描述資源。這些紋理可以用Don"t Starve 的TEXTools程序查看,用nsimplex/ktools · GitHub和png格式的圖片相互轉換。
  • Don"t Starve 的動畫文件用Spriter 2D sprite animation character creation software.製作。可以用Don"t Starve Mod Tools 工具將Spriter的動畫文件弄成Don"t Starve 能載入的動畫文件。Don"t Starve 的動畫文件本質上包括三部分,一個anim.bin的二進位文件用來描述動畫,多個atlas-xxx.tex的紋理文件用來放置動畫需要的文件,bulid.bin承擔描述紋理文件的作用。之後將這些文件壓縮成zip文件,主要提高載入速度。用上面提到的ktools可以將饑荒的動畫文件轉換成Spriter能編輯的格式。不過anim.bin,bulid.bin,atlas-xxx.tex,這些文件不一定每個動畫文件都有,比如那些角色共用一套anim.bin動畫文件,每個角色只是紋理換了一下。所以用ktools轉換不成功時,注意分析這些動畫的依賴關係,把對應的打包成zip,就行了。

因為上面所說的都在cocos-2d裡面都有用到,所以我才推測它是cocos-2d的。

--------------------------------------------------------------

二、怎麼組織的遊戲世界?

我幾個月前翻譯過國外的一篇介紹遊戲世界的生成方式的文章,在這裡【饑荒】關於隨機地圖生成的方式。BTW,這個博客里還有幾篇關於饑荒的,有興趣可以看一下。

  • Don"t Starve使用Tiled Map Editor 來編輯地圖塊,Tiled是開源的喲。Don"t Starve的地圖是隨機生成的,但是也有一些內在聯繫,比如pigking只會出現在森林邊上,而且每一個pigking周圍都有四個sanityrock(好像是叫這個?),這些東東的位置就是用Tiled編輯出來的,此外還有一大堆,在Static Layouts目錄下。

  • 一個Room有多個Static Layouts
  • 一個Task有多個Room,還有幾個key,lock。
  • 生成地圖就把對應的key和lock拼接起來,可以保證地圖的連貫性。

-------------------------------------------------------------------------

三、反正就是詳細一點的吧。

要詳細的話我就隨便寫寫,想到那寫那。

1.面向對象

Don"t Starve 主要用Lua腳本實現遊戲邏輯,大體上,饑荒的Lua部分採用面向對象的編程範式,在class.lua文件里用lua metatable實現了一套面向對象的系統,可實現類的繼承。

在饑荒里基本上每一個類都由一個獨立的腳本文件定義,這些個腳本文件大體結構如下:

require "class" --載入class文件
local baseclass=require "baseclass" --基類,有時沒有

--這裡可以載入其他的東東

--創建繼承基類的子類
--為了不污染全局變數域,使用local關鍵字
--沒有基類時,這樣寫:
--~local childclass=Class(function (self,...)
local childclass=Class(baseclass,function (self,...)

self.value=0 --屬性

--初始化函數內容
end)

--方法
function childclass:fn(...)

end

--因為使用了local,所以要返回,其他文件才能接收到
return childclass

如果你了解了饑荒時如何實現面向對象的,看饑荒的源碼就可以很快速的理解了。

2.代碼與資源分布

下面列出了饑荒中各個文件或文件夾的作用:

(以*結尾的,該文件夾里就是一堆上面所說的類)

├─bin 二進位程序文件
├─data 數據目錄
│ ├─anim 放置動畫
│ ├─bigportraits 人物肖像紋理
│ ├─fonts 字體文件
│ ├─fx 好像是用來放置於天氣相關紋理的
│ ├─images 主要紋理放置目錄
│ ├─levels 放置地皮紋理
│ ├─minimap 地圖圖標
│ ├─models 未知,猜測與洞穴有關
│ ├─scriptlibs 一些用lua實現的庫,用來網路通信與json字元串處理
│ ├─scripts 主要的lua腳本目錄
│ │ ├─behaviours 控制行為*
│ │ ├─brains 大腦AI*
│ │ ├─cameras 相機,用來控制玩家所能看到的視野*
│ │ ├─components 組件,一組通用的,用來描述物品的代碼*
│ │ ├─languages 語言文件,國際化用的
│ │ ├─map 地圖相關代碼*
│ │ │ ├─levels 世界模式,有生存,冒險,洞穴等等
│ │ │ ├─rooms Room
│ │ │ ├─static_layouts 靜態布局
│ │ │ └─tasks Tasks,上面那些具體去看博客
│ │ ├─nis 賣萌用的,直接在命令行運行,有隻會動的大象^.^
│ │ ├─prefabs 定義世界裡所有的物品
│ │ ├─scenarios 場景,也就是貼吧所說的彩蛋
│ │ ├─screens 界面*
│ │ ├─stategraphs 狀態機或狀態圖,用來和AI一起控制動物(和植物?)的運動
│ │ └─widgets 界面小部件(按鈕,文本框etc.)*
│ ├─shaders 未知
│ └─sound 聲音
└─mods 插件放置目錄

此外,data文件里還有DLC0001目錄,這個目錄來放置DLC版本的文件,結構和data目錄一樣。

下面就一大堆網址:

kleientertainment/ds_mod_tools · GitHub 遊戲官方發布的mod工具,拿來自動轉換紋理和動畫,在win和ubuntu下編譯成功。

nsimplex/ktools · GitHub Ktools 工具,可以把tex紋理和png圖片相互轉換。還可以轉換動畫文件。

nsimplex/wicker · GitHub 一個饑荒Mod框架。

debugman18/UpAndAway · GitHub 一個大型饑荒Mod《天堂》,利用上面的wicker寫的。

jkolokotronis/dsmods · GitHub 還是一個大型mod《黑夜英雄》,不過真的有點大,400多M,翻下牆再去克隆。


http://aigamedev.com/premium/interview/dont-starve/ 涉及到了Narrative-Based Procedural World Generation和Lua-Based Behavior Tree這兩個玩法核心


可參考

Gamasutra - Road to the IGF: Klei Entertainment"s Don"t Starve


使用SDL2庫來做兼容不同平台 參加 Simple DirectMedia Layer


最近自己邊玩邊改(主要是compents和prefabs兩部分),感覺饑荒得失都很明顯的一點:用組合代替繼承,好處是添加屬性很靈活,可惜用起來還是像繼承。參考大量顯式的調用inst.compents.**,而且各個compents間還是耦合上了,比如eater和locomotor。

思路有點像com。

lua這樣的動態類型語言做oo用,總覺得是暴殄天物。

應該可以更容易,更多的code as data


推薦閱讀:

在三維遊戲關卡製作中,關卡設計師與場景美術應該如何合作?
遊戲《全境封鎖》中,對紐約還原度有多高?
知乎上有哪些值得一看的遊戲評論專欄?
為何橫板清關類遊戲大家都不認可?
如何評價 Unity 2017?

TAG:遊戲 | 遊戲設計 | 遊戲開發 |