好下邊偶說(shuō)說(shuō)45度編輯器的一些心得:
1.為什么要開(kāi)發(fā)一個(gè)編輯器?
很多開(kāi)發(fā)者都沒(méi)有先考慮為什么我要開(kāi)發(fā)一個(gè)地圖編輯器,往往都是因?yàn)榇蠹叶加,所以就去開(kāi)發(fā)。很多游戲都有自己的專屬編輯器,就像魔獸的那個(gè)讓人仰望的編輯器,里邊包含了諸如地圖編輯器,事件編輯器,戰(zhàn)役編輯器,AI編輯器,環(huán)境編輯器等等諸多編輯器,可以說(shuō),一個(gè)好的編輯器是一個(gè)成功的游戲必不可少的組成。我們開(kāi)發(fā)一個(gè)編輯器是為了方便我們往后的開(kāi)發(fā)工作,而不是只為了別人都有而開(kāi)發(fā)。當(dāng)你明確了你的游戲需求后,然后需要針對(duì)性的構(gòu)架你的編輯工具。 編輯器的功能要根據(jù)我們要開(kāi)發(fā)的游戲的需求來(lái)決定其功能。還有的就是我們要注意在編寫這樣的一個(gè)工具時(shí)要把算法及相關(guān)邏輯整理分層好。因?yàn)榫庉嬈鳟吘故蔷庉嬈,我們到了?shí)際游戲場(chǎng)景中還是得再次把原先的邏輯重新實(shí)現(xiàn)的,所以編輯器的結(jié)構(gòu)及代碼的分離效果很大層度上影響到你往后的開(kāi)發(fā)。
2.一些主要用到的算法。
先說(shuō)說(shuō)45度視角下比較難寫好的深度消隱算法。相信很多開(kāi)發(fā)者都疼為此頭疼,不知道如何入手,。網(wǎng)上有很多類似的深度算法,但很多效果都不如人意,特別是用y軸判斷的那種,事實(shí)上這種算法不準(zhǔn)確是因?yàn)樗雎粤艘恍┪锲凡坏乳L(zhǎng)的情況,當(dāng)然如果你的游戲里的場(chǎng)景物品都是等大的戰(zhàn)棋類游戲,這種算法足以你使用了,但事實(shí)上一般的45度游戲或者社區(qū)都是很多不等大物品組成的。一些案例,想this6,他們所采取的方法是預(yù)先在fla里手動(dòng)排序好物品的深度,然后再場(chǎng)景中通過(guò)交換深度的方法來(lái)實(shí)現(xiàn)井深的效果,這種方法不不好之處在于,一些動(dòng)態(tài)場(chǎng)景因?yàn)闆](méi)有預(yù)先編輯好一個(gè)準(zhǔn)確的深度,那樣交換深度的小過(guò)將是很差的,從this6前期的自定義用戶場(chǎng)景我們也可以看出這方面的效果,這也是他們現(xiàn)在采用縮小場(chǎng)景避免排序不準(zhǔn)確帶來(lái)的不好體驗(yàn)的一個(gè)必然選擇。還有就像摩爾,摩爾前期也是典型的只根據(jù)y軸排序的一個(gè)案例,效果相當(dāng)不好,但后期做了優(yōu)化。
要井深準(zhǔn)確,無(wú)法就兩個(gè)方向走。要們將所有物品統(tǒng)一大小,然后用y軸排序,要么就是寫出一套使用性廣泛的深度算法。
這里我推薦的方法也是現(xiàn)在很多大型2.5d游戲使用的方法。2分法。2分在在于其能準(zhǔn)確的將一個(gè)空間的物品的井深層次很好的劃分出來(lái),我們只要通過(guò)一個(gè)物品為參照物先劃分出前后兩個(gè)空間然后遞歸剛才的方法即可,下邊是本人之前寫的消隱算法就是以2分法為基礎(chǔ)寫的一套45度視角下的消隱算法,http://wxsr.blogbus.com/logs/32001884.html 我們?cè)谡f(shuō)說(shuō)A星算法,其實(shí)作為游戲a星算法是不一定要用到的,我們要根據(jù)游戲的實(shí)際需求來(lái)開(kāi)發(fā)我們的游戲才是明智之舉很多情況下我們可以選擇性的將尋路部分放到小地圖上而不是大地圖上,那樣有利于我們整個(gè)游戲的效率及執(zhí)行,我們可以采用兩點(diǎn)間直線移動(dòng),移動(dòng)到不可走地方就停止移動(dòng)的方法來(lái)取代a星。這樣做效果也是不錯(cuò)的。而且效率也高?梢园压(jié)省下來(lái)的消耗應(yīng)用到別的地方去。再說(shuō)回a星,as3效率的提高,現(xiàn)在寫a星算法只要不是很冗余效率基本上都到60-90毫秒左右就可以完成了a星算法無(wú)非就是計(jì)算最優(yōu)值尋找出一條能通道目的地的樹(shù)狀結(jié)構(gòu),然后通過(guò)倒退法,得到一條最優(yōu)的路徑。優(yōu)化的方法很多想我之前說(shuō)的2分法就是一種,我們也可以用4叉樹(shù),2查樹(shù)等方法優(yōu)化效率,無(wú)論是4叉樹(shù)還是2叉樹(shù),目的都是在縮小路徑的范圍,當(dāng)然前提我們都需要預(yù)先建樹(shù),注意的是,我們?cè)趫?chǎng)景深度算法放也可以用到4叉樹(shù),2查樹(shù)這是我的改良版a星算法: http://wxsr.blogbus.com/logs/32550422.html,這個(gè)算法沒(méi)有喲娜跟傳統(tǒng)的2維數(shù)組作為存儲(chǔ)容器,而用哈希表,這樣做的好處在于查詢跟修改的速度要比2維數(shù)組的快而且方便。
最后說(shuō)說(shuō)資源管理跟事件管理。只所以要這個(gè)主要是因?yàn)閒lash的內(nèi)存管理問(wèn)題,太分散的管理方式無(wú)疑對(duì)我們管理內(nèi)存幾會(huì)有相當(dāng)大的麻煩統(tǒng)一的內(nèi)存管理有利于解決因?yàn)橘Y源加載帶來(lái)的諸多麻煩,還有就是事件的統(tǒng)一注冊(cè)管理有人可能認(rèn)為這樣做很麻煩沒(méi)必要,但我想說(shuō)的是,在flash中往往因?yàn)槲覀兒苋菀缀雎缘膯?wèn)題導(dǎo)致了我們的內(nèi)存不能回收,當(dāng)中最為顯著的就是對(duì)象的時(shí)間引用上。很多人抱怨as的弱引用,事實(shí)上只要你看過(guò)幫助文檔就不不能看出其實(shí)弱引用是沒(méi)問(wèn)題的,因?yàn)槟愕膶?duì)象沒(méi)有注銷,所以事件必然還在引用狀態(tài)。加載的資源應(yīng)為都是一次性的所以基本都是很容易刪除的。但一些類的實(shí)例因?yàn)橐玫亩嘀赶驅(qū)е铝藘?nèi)存不能回收,這正是我說(shuō)統(tǒng)一管理事件注冊(cè)的用意,因?yàn)槟菢游覀儾趴梢愿玫耐耆珓h除之前所注冊(cè)的所有事件的。一般我們御載一個(gè)場(chǎng)景我建議都注銷下原先的所有幀聽(tīng),那樣才能保證事件不在被引用,從而保證內(nèi)存可以順利回收。
再補(bǔ)充一點(diǎn)就是,資源及源碼的加密。 現(xiàn)在一般的做法都是混淆編輯好的swf的2進(jìn)制源碼,然后在場(chǎng)景中再還原。 這里提供下我的處理方法: http://wxsr.blogbus.com/logs/32850824.html
經(jīng)典論壇交流: http://bbs.blueidea.com/thread-2931698-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2009/6767.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁(yè) 45度地圖編輯器及游戲開(kāi)發(fā)心得 [2] 下一頁(yè)
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|