談談最近做的一個FLEX遊戲架構

來源:互聯網
上載者:User

對這兩個星期做的一個遊戲架構進行總結。

 

主要解決問題是:

如何?遊戲情境的輪轉

 

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 />}

 

 

至此,一個鬆散耦合,組件關係獨立,僅由一個主情境控制的,並且具有遷移性的結構完成。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.