在線客服
24小時(shí)免費(fèi)咨詢電話:18978941786
客服時(shí)間:上午9:30~下午6點(diǎn)
當(dāng)前位置:首頁(yè)>> 技術(shù)文章 >> Web開(kāi)發(fā) >> 從一個(gè)游戲存檔例子學(xué)習(xí)設(shè)計(jì)模式
從一個(gè)游戲存檔例子學(xué)習(xí)設(shè)計(jì)模式
收藏 分享 發(fā)布日期:2012-2-12 16:30:44 編輯:admin 文章來(lái)源:ActionScript3天地會(huì) 點(diǎn)擊率:
給和我一樣在菜鳥(niǎo)前進(jìn)的路上掙扎的兄弟們...老鳥(niǎo)就不用看了,大菜鳥(niǎo)請(qǐng)先找兩本象樣的進(jìn)階as3書(shū)大補(bǔ)再來(lái)看。
正題
游戲存檔說(shuō)白了其實(shí)就是一個(gè)備忘錄,用到的設(shè)計(jì)模式也被稱為“備忘錄模式”。就象把當(dāng)前的狀態(tài)都寫(xiě)在一張紙上,當(dāng)發(fā)現(xiàn)狀態(tài)無(wú)效的的時(shí)候去讀取備忘錄并把它的狀態(tài)重新賦給對(duì)象,以復(fù)原對(duì)象。說(shuō)了這么多,玩過(guò)游戲的人應(yīng)該都明白。。
ok,明白了概念,下面就是如何實(shí)現(xiàn)這個(gè)設(shè)計(jì)模式了。最典型的就是游戲存檔了。更多FLASH游戲:http://www.flashas.net/html/flashas/asyouxi/
照上邊說(shuō)的,存檔這么簡(jiǎn)單,就用一個(gè)HeroState去存唄,要讀取的時(shí)候再去讀唄。簡(jiǎn)單是簡(jiǎn)單了,但是擴(kuò)展性就沒(méi)了,耦合性也很高。照大話設(shè)計(jì)模式的 話說(shuō),就是“如果一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多,等于把這些職責(zé)耦合在一起,一個(gè)職責(zé)的變化可能會(huì)抑制或削弱這個(gè)類(lèi)完成其他職責(zé)的能力。這種設(shè)計(jì)會(huì)導(dǎo)致脆弱的設(shè) 計(jì),當(dāng)變化發(fā)生時(shí),會(huì)導(dǎo)致意想不到的破壞。”。換句話說(shuō),就是盡量把各個(gè)類(lèi)的職責(zé)分工明確,相互之盡量不透露自身的信息(封裝)。
拿這個(gè)游戲存檔例子來(lái)說(shuō),可以劃分為游戲主類(lèi),游戲角色類(lèi),存檔管理者,狀態(tài)盒子。游戲主類(lèi)去操作游戲角色和儲(chǔ)存,讀取進(jìn)度,需要儲(chǔ)存和讀取進(jìn)度就去通知 存檔管理者,由它去處理狀態(tài)盒子具體的存檔和取檔操作。我的理解是類(lèi)的分工職責(zé)要明確,各個(gè)類(lèi)之間互相知道的越少越好。邏輯很簡(jiǎn)單吧?設(shè)計(jì)模式的真諦就是 簡(jiǎn)單就是美(個(gè)人理解)。
這個(gè)存檔例子用接口實(shí)現(xiàn)了用兩種方法去儲(chǔ)存角色狀態(tài):用saveBox去儲(chǔ)存(一般方法)和SOSaveBox(用SharedObject本地儲(chǔ)存).不懂SO的請(qǐng)進(jìn)FLASH按F1。什么?你不知道F1是什么東西?出門(mén)左拐不用謝。。
只說(shuō)一點(diǎn)理論上的東西,具體的概念和方法請(qǐng)自行翻書(shū)找,比這里詳細(xì)多了。
廢話了這么多,看代碼,游戲主類(lèi)Main.as:
package
{
import flash.display.Sprite;
/**
* 主類(lèi),繼承Sprite
* @author ZMYSPC
*/
public class Main extends Sprite
{
var zmyspc:Hero;
var gameSaver:SaveManager;
public function Main()
{
SaveManager.useSO = true;//是否用SO儲(chǔ)存
zmyspc= new Hero(1000, 200, 100);//我是英雄!
gameSaver= new SaveManager();//存檔管理者
zmyspc.show();//顯示角色當(dāng)前狀態(tài)
gameSaver.save = zmyspc.getState();//存檔了
zmyspc.dead();//我掛了。。
zmyspc.show();
zmyspc.recoveryState(gameSaver.save);//讀取存檔,又是一條好漢!
zmyspc.show();
}
}
}





