《饑荒》這款遊戲是怎麼做的?
很好奇它是怎麼做的。用的什麼引擎?怎麼組織的遊戲世界等等。反正就是詳細一點的吧。。。。。
額,搜到了這個問題,我就隨便答一下吧,下面都是我的猜測,正確與否自行判斷。
一、用的什麼引擎?
不知道,推測可能是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目錄一樣。
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?