很久沒做更新了。最近比較忙碌,手頭的webgame也都放下。最近很想念我的小webgame了,回來繼續寫。
上篇玩玩webgame開發(3):自動戰鬥實作以及一些遊戲細節(下)http://playfish.iteye.com/blog/267275 在高峰期時候發表的,結果被火速沉底了。。。汗
好了,不小心有說了好多廢話,言歸正傳。
=============
資料結構設計是門高深的學問,而遊戲的資料結構設計,那顯然,也是一門很高深的學問(--||好廢話。。),資料結構應該是整個遊戲的骨架所在,而遊戲資料平衡,(另一門高深的學問。。)跟這遊戲的資料結構息息相關。本文隻是從自己做的一個小遊戲出發,簡要的介紹一下我的一個簡單的遊戲的資料結構設計思路。
一個遊戲幾個基本的要素:
- 地圖
- 遊戲角色
- 怪物
- 物品
- 建築
先從地圖說起
遊戲都在地圖上進行的。地圖的基本要素包括:地圖元素(即每一個地圖坐标格子上的元素),不可進入的位置等。其他的還包括一些基本資訊。我的地圖資料結構設計如下:
var defaultMap = {
mapName : '迷霧森林',
mapLevel: 1,
mapData : [
['f','t','t','t','t','t','w','f','r','f','w','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','w','f','r','f','w','f','r','f','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','f','f','w','f','r','f','w','f','r','f','r','f','r','t','t','r','f','r','t','t'],
['g','g','g','g','f','f','w','f','f','w','f','r','f','r','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','f','r','r','f','w','f','f','w','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','f','w','f','r','f','w','f','r','f','r','f','r','t','t','r','f','r','t','t'],
['g','g','g','g','f','f','w','f','f','w','f','r','f','r','f','r','f','f','f','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','f','f','f','f','f','f','f','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','f','f','r','f','t','t','f','f','r','t','t'],
['g','f','f','f','r','r','f','w','f','f','w','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','f','w','f','r','f','w','f','r','f','r','f','r','t','t','r','f','r','t','t'],
['g','g','g','g','f','f','w','f','f','w','f','r','f','r','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','f','r','r','f','w','f','f','w','f','r','f','r','f','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','r','f','w','f','r','f','f','r','t','t','r','f','r','t','t'],
['g','f','f','f','r','f','w','f','f','w','f','r','f','r','f','r','t','t','r','f','r','t','t']
],
immovable: ['t','r']
};
這是個很簡單的地圖結構,包括的幾個資訊:地圖名稱,地圖等級,地圖元素,不可移動的位置。最後生成的展示效果如下(實際界面大很多,這裡隻是部分):
關于地圖生成以及戰争迷霧的部分,可以參看這個系列文章的前2篇。至于在地圖上出現的物品,角色,怪物,建築,并沒有放在地圖的資料裡面,因為我覺得這是屬于不同角色的資料,是應該分開的。這樣的資料結構可以滿足這樣的需求:地圖按照資料顯示,對于指定的地圖元素,角色不能進入。
接下來是遊戲角色
var bobo = {
pos : {X:1, Y:1},
name : '拉拉',
money : 0, //新增加金錢
hp : 100, //full hp
curHp : 100, //current hp
level : 0,
exp : 19,
ap : 15, //attack power
def : 1, //defence
speed : 3,
luck : 15,
eyeshot : 2, //視野
type : 'bobo',
file : 'baozi',
img : $('<img class="bobo" title="拉拉" src="images/bobo/baozi/lv0/common.gif" />')
};
pos指角色在地圖上的坐标,其它的就是一些常見的資料了,包括名稱,金錢,滿血hp,目前的hp,等級,經驗,攻擊,防禦,速度,幸運,視野,其它的類型,檔案,img屬于我自己定義的一些結構,用于獲得特定狀态下的包子的圖檔。
設計一個這樣的資料結構并不難,自己愛怎麼設定就怎麼設定,呵呵。不過關鍵的問題在于資料平衡,設定得很bt的資料可以開始玩的時候很爽,但是一結束玩家馬上就會失去興趣,是以,合适的數值以及成長曲線才會保證耐玩度。我個人是喜歡很小的資料,這樣玩家自己計算的時候簡單,而且資料平衡比較好做。我平時很經常玩一些war3的rpg,隻要進去裡面的人物或者是物品設定數字都是按百的,alt+q。順便廢話一下我喜歡的元素魔法之戰這個。
怪物的資料設計
var monsters = [
{
id : 0,
name : '青蛙',
hp : 30,
curHp : 30, //記錄怪物目前血量,戰鬥結束後自動回複為hp
level : 0,
exp : 5,
ap : 10,
def : 0,
speed : 5,
luck : 15,
type : 'monster',
file : 'qingwa',
items : [ //掉落物品
{id:0,drop:0.4}
],
img : $('<img class="monster" title="青蛙" src="images/monster/qingwa/lv0/common.gif" />')
}
];
和遊戲角色的資料結構不同,它有額外添加1個id以及一個items數組,id表示怪物類型,因為怪物會在地圖上出現很多不同種類的怪物,通過id來區分不同的怪物。items數組,表示這個怪物身上有多大的機率會掉那種類型物品。items數組内的id表示物品的id。
一個怪物需要分布在地圖上的各個位置,我目前覺得最簡單的方式就是:
var mapMonsters = [
{
pos : { X:1, Y:8 },
id : 0
},
{
pos : { X:5, Y:5 },
id : 0
},
{
pos : { X:4, Y:5 },
id : 0
}
];
哪個位置上哪個怪物,簡單明了。
====未完待續,明晚繼續