對這兩個星期做的一個遊戲架構進行總結。
主要解決問題是:
如何?遊戲情境的輪轉
14:10 2009-9-21
打算用swfloader在主情境(用戶端)從伺服器load不同情境swf下來運行。前提是各個swf互不通訊。但是後來發現和實際情況相差甚遠,例如從子情境A返回到主情境,這時候是要使自情境A隱藏或者離開顯示列表。但是這個命令是由主情境發出還是由自己發出,顯然,正常情況是由前者控制的。這就要求要各個情境間互相通訊。於是用swfloader的想法失敗。代碼泡湯。
21:29 2009-9-22
推翻昨天的做法,用自訂群組件。大概架構是一個swf,然後各個情境均是主情境的子控制項,這樣就可以很方便控制各個控制項的顯示和隱藏。這是一個樹狀模型,有一個弊端,當子控制項裡面還有子控制項的時候,根情境是控制不了的,這樣做多少會讓人覺得很彆扭和笨拙
10:05 2009-9-23
使用自訂事件,實現各個組件間的通訊,實現鬆散耦合。結合viewstack,和情境映射數組(arr["sence"] = senceobject),主情境需要兩個函數,一個是返回上一層情境,一個跳入一下層情境,然後使用viewstack進行輪轉情境。這樣形成衛星模型,即使子情境中還有情境,他們之間的關係也是平行的。這樣使情境控制權集中在根情境處。keep it simple!
0:46 2009-9-26
純MXML做的幾個情境,很手工作坊,手段比較低級。轉而考慮子情境全部用AS。
這個遊戲比較簡單的是,沒有出現碰撞的畫面。或者說遊戲元素很少。主要還是button比較多。
做了如下安排:
1,自訂button。繼承sprite,做個輕量級按鈕
2,各個子情境父類MyComponent。繼承UIComponent,添加自訂事件。
3,由於到了主情境需要用到viewstack添加子容器,繼承UIComponent導致類型轉換出錯,修改button繼承UICompnent,MyComponent繼承Canvas。代碼如下
package com.works.packages<br />{<br />import flash.events.MouseEvent;</p><p>import mx.containers.Canvas;</p><p>[Event(name = "myclick", type = "com.works.packages.MyEvent")]<br />public class MyComponent extends Canvas<br />{</p><p>public function MyComponent()<br />{<br />super();<br />}</p><p>/**<br /> * 當前按鈕添加監聽函數<br /> * @param obj<br /> * @param sence<br /> *<br /> */<br />public function comAddListener(obj: MyButton, sence: String): void<br />{<br />obj.sencenow = sence;<br />obj.addEventListener(MouseEvent.CLICK, messageFun);<br />}</p><p>/**<br /> * 對自訂訊息響應<br /> * @param sence 下一情境<br /> *<br /> */<br />protected function messageFun(e: MouseEvent): void<br />{<br />this.dispatchEvent(new MyEvent("myclick", e.target.sencenow));<br />}</p><p>/**<br /> * 從當前情境退出,處理當前情境內容釋放(退出按鈕)<br /> * @param sence 退出到的情境<br /> *<br /> */<br />public function releaseOutLocal(sence: String): void<br />{</p><p>}</p><p>/**<br /> * 從當前情境退出,處理下一情境的布景初始化(退出按鈕)<br /> * @param sence 退出到的情境<br /> *<br /> */<br />public function releaseOutNext(sence: String): void<br />{</p><p>}</p><p>/**<br /> * //進入按鈕<br /> * @param sence 下一情境<br /> *<br /> */<br />public function enterLocal(sence: String): void<br />{</p><p>}</p><p>}<br />}
package com.works.packages<br />{<br />import flash.display.DisplayObject;<br />import flash.events.MouseEvent;</p><p>import mx.core.UIComponent;</p><p>/**<br /> * 跳轉情境的按鈕<br /> * @author xuexuankr<br /> *<br /> */<br />public class MyButton extends UIComponent<br />{</p><p>protected var mouseup: DisplayObject;//滑鼠彈起<br />protected var mousedown: DisplayObject;<br />protected var mouseout: DisplayObject;<br />protected var mouseover: DisplayObject;</p><p>protected var _sencenow: String = null;//標記下一情境<br />protected var _enabled: Boolean = true;</p><p>public function MyButton(up: Class, down: Class, over: Class)<br />{<br />//執行個體化介面<br />mouseup = new up();<br />mouseout = new up();<br />mousedown = new down();<br />mouseover = new over();</p><p>//設定初始介面<br />this.addChild(mouseup);</p><p>//添加監聽<br />this.addEventListener(MouseEvent.MOUSE_UP, upFun);<br />this.addEventListener(MouseEvent.MOUSE_DOWN, downFun);<br />this.addEventListener(MouseEvent.MOUSE_OUT, upFun);<br />this.addEventListener(MouseEvent.MOUSE_OVER, overFun);</p><p>//設定經過時是否顯示滑鼠手型<br />this.buttonMode = true;<br />this.useHandCursor = true;<br />}</p><p>public function set myenabled(b: Boolean): void<br />{<br />_enabled = b;<br />if (!b)<br />{<br />//this.removeChildAt(0);<br />this.addChild(mousedown);<br />}<br />else<br />{<br />//this.removeChildAt(0);<br />this.addChild(mouseup);<br />}<br />}</p><p>public function set sencenow(s: String): void<br />{<br />_sencenow = s;<br />}</p><p>public function get sencenow(): String<br />{<br />return _sencenow;<br />}</p><p>private function upFun(e: MouseEvent): void<br />{<br />this.removeChildAt(0);<br />this.addChild(mouseup);<br />}</p><p>private function downFun(e: MouseEvent): void<br />{<br />this.removeChildAt(0);<br />this.addChild(mousedown);<br />}</p><p>private function overFun(e: MouseEvent): void<br />{<br />this.removeChildAt(0);<br />this.addChild(mouseover);<br />}<br />}<br />}
至此,一個鬆散耦合,組件關係獨立,僅由一個主情境控制的,並且具有遷移性的結構完成。