天天看點

玩玩webgame開發(4):遊戲資料結構設計

很久沒做更新了。最近比較忙碌,手頭的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']


	};      

這是個很簡單的地圖結構,包括的幾個資訊:地圖名稱,地圖等級,地圖元素,不可移動的位置。最後生成的展示效果如下(實際界面大很多,這裡隻是部分):

玩玩webgame開發(4):遊戲資料結構設計

 關于地圖生成以及戰争迷霧的部分,可以參看這個系列文章的前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屬于我自己定義的一些結構,用于獲得特定狀态下的包子的圖檔。

玩玩webgame開發(4):遊戲資料結構設計

設計一個這樣的資料結構并不難,自己愛怎麼設定就怎麼設定,呵呵。不過關鍵的問題在于資料平衡,設定得很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
		}
	];      

 哪個位置上哪個怪物,簡單明了。

====未完待續,明晚繼續

繼續閱讀