2009-10-19 83 views
2

我在php中編程了一段時間,但它都是面向過程的。現在我在Flex 3中有一個項目,並且我製作了一個簡單的腳本,它可以動畫(移動)很少的對象,但我認爲我錯過了面向對象編程的重點,因爲我一遍又一遍地重複着一些東西......也許它與所有的混亂混在一起我仍然有關於AS3,所以請告訴我有沒有寫這個代碼的任何「聰明」的方式:簡化Flex/AS3代碼

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="100%" height="100%" 
    paddingBottom="0" paddingLeft="0" paddingRight="0" paddingTop="0" 
    horizontalScrollPolicy="off" verticalScrollPolicy="off" 
    creationComplete="init()"> 

    <mx:Script> 
     <![CDATA[ 
      import mx.events.EffectEvent; 

      public var opened1:Boolean; 
      public var opened2:Boolean; 
      public var opened3:Boolean; 
      public var opened4:Boolean; 

      [Bindable] public var pgW:Number; 

      private function init():void{ 
       pgW = this.width; 

       opened1 = false; 
       opened2 = false; 
       opened3 = false; 
       opened4 = false; 

       addListeners(); 
      } 

      private function mouseOver1(event:MouseEvent):void{ 
       removeListeners(); 

       if (opened2){ 
        moveOut.target = txt2; 
       } 
       if (opened3){ 
        moveOut.target = txt3; 
       } 
       if (opened4){ 
        moveOut.target = txt4; 
       } 

       moveOut.play(); 
       setOpened(1); 
       moveIn.target = txt1; 
       moveIn.play(); 
      } 

      private function mouseOver2(event:MouseEvent):void{ 
       removeListeners(); 

       if (opened1){ 
        moveOut.target = txt1; 
       } 
       if (opened3){ 
        moveOut.target = txt3; 
       } 
       if (opened4){ 
        moveOut.target = txt4; 
       } 

       moveOut.play(); 
       setOpened(2); 
       moveIn.target = txt2; 
       moveIn.play(); 
      } 

      private function mouseOver3(event:MouseEvent):void{ 
       removeListeners(); 

       if (opened1){ 
        moveOut.target = txt1; 
       } 
       if (opened2){ 
        moveOut.target = txt2; 
       } 
       if (opened4){ 
        moveOut.target = txt4; 
       } 

       moveOut.play(); 
       setOpened(3); 
       moveIn.target = txt3; 
       moveIn.play(); 
      } 

      private function mouseOver4(event:MouseEvent):void{ 
       removeListeners(); 

       if (opened1){ 
        moveOut.target = txt1; 
       } 
       if (opened2){ 
        moveOut.target = txt2; 
       } 
       if (opened3){ 
        moveOut.target = txt3; 
       } 

       moveOut.play(); 
       setOpened(4); 
       moveIn.target = txt4; 
       moveIn.play(); 
      } 




      private function addListeners():void{ 
       btn1.addEventListener(MouseEvent.MOUSE_DOWN, mouseOver1); 
       btn2.addEventListener(MouseEvent.MOUSE_DOWN, mouseOver2); 
       btn3.addEventListener(MouseEvent.MOUSE_DOWN, mouseOver3); 
       btn4.addEventListener(MouseEvent.MOUSE_DOWN, mouseOver4); 
      } 

      private function removeListeners():void{ 
       btn1.removeEventListener(MouseEvent.MOUSE_DOWN, mouseOver1); 
       btn2.removeEventListener(MouseEvent.MOUSE_DOWN, mouseOver2); 
       btn3.removeEventListener(MouseEvent.MOUSE_DOWN, mouseOver3); 
       btn4.removeEventListener(MouseEvent.MOUSE_DOWN, mouseOver4); 
      } 

      private function setOpened(nr:int):void{ 
       if (nr == 1){ 
        opened1 = true; 
        opened2 = false; 
        opened3 = false; 
        opened4 = false; 
       } 
       if (nr == 2){ 
        opened1 = false; 
        opened2 = true; 
        opened3 = false; 
        opened4 = false; 
       } 
       if (nr == 3){ 
        opened1 = false; 
        opened2 = false; 
        opened3 = true; 
        opened4 = false; 
       } 
       if (nr == 4){ 
        opened1 = false; 
        opened2 = false; 
        opened3 = false; 
        opened4 = true; 
       } 
       trace("opened" + nr); 
      } 

      private function setPositions(event:EffectEvent):void{ 
       event.effectInstance.target.x = -(pgW); 
      } 

      private function klik(event:MouseEvent):void { 
       event.stopPropagation(); 
      } 
     ]]> 
    </mx:Script> 

    <mx:Move id="moveIn" 
     xFrom="{-pgW}" xTo="0" 
     yFrom="0" yTo="0" 
     duration="1000" 
     effectEnd="addListeners();"/> 

    <mx:Move id="moveOut" 
     xFrom="0" xTo="0" 
     yFrom="0" yTo="250" 
     duration="1000"/> 


    <mx:Image id="btn1" source="assets/img/32/32-btn1.swf" 
      x="0" y="0" 
      width="100%" 
      click="klik(event)"/> 

    <mx:Image id="btn2" source="assets/img/32/32-btn2.swf" 
      x="0" y="0" 
      width="100%" 
      click="klik(event)"/> 

    <mx:Image id="btn3" source="assets/img/32/32-btn3.swf" 
      x="0" y="0" 
      width="100%" 
      click="klik(event)"/> 

    <mx:Image id="btn4" source="assets/img/32/32-btn4.swf" 
      x="0" y="0" 
      width="100%" 
      click="klik(event)"/> 



    <mx:Image id="txt1" source="assets/img/32/32-txt1.swf" 
      x="{-pgW}" y="0" 
      width="100%"/> 

    <mx:Image id="txt2" source="assets/img/32/32-txt2.swf" 
      x="{-pgW}" y="0" 
      width="100%"/> 

    <mx:Image id="txt3" source="assets/img/32/32-txt3.swf" 
      x="{-pgW}" y="0" 
      width="100%"/> 

    <mx:Image id="txt4" source="assets/img/32/32-txt4.swf" 
      x="{-pgW}" y="0" 
      width="100%"/> 
</mx:Canvas> 

非常感謝您的寶貴時間!

m。

回答

3

示例代碼是完美的是OO'ed(由面向對象)。

您有四件事(您將使用一個類定義),它們持有對Button,文本,打開狀態等的引用。因此,您將一個類定義爲MXML組件,其中包含一個按鈕,一個文本和任何其他狀態,並將方法放在該分量上(在<mx:Script>塊中)。另外,您還可以在creationComplete方法中初始化組件,以便在完成初始繪圖時打開的變量爲false。即使你的mouseOver方法是完美的:你可以讓對象決定是否需要做某件事(並且MXML組件將自動進行事件處理)。基本上,這就是我們要做的:MXML組件處理它自己的內部狀態,而不是有一個必須爲列表管理狀態的外部對象。

由於MouseOver方法將放置在您的MXML組件中,每個方法都必須保持對其他引用的引用。有很多方法可以做到這一點,包括在某個時刻傳遞一個引用並存儲它,或者擁有一個包含另一個x個對象列表的var。

希望能夠提供一定的理解和幫助。

-2

按照上設計應用程序的一些教程,使用一些模式,嘗試MVC或MVP,結賬聰明的傢伙IOC

+0

我會說,在這一點上,簡單的面向對象的東西比模式/ MVC(尤其是如果你正在考慮一個MVC框架)更重要。 –

3

而是做類似的事情。在僞代碼:

init() 
    btn[] = create array of buttons 
    txt[] = create array of txt 
    opened[] = create array of boolean 
    opened[] = false 
    for each btn 
      btn.mouseover = mouseover 
      add listeners 

mouseover 
    remove listeners 
    i = find source btn index from event 
    moveout.target = movein.target 
    moveout.play 
    opened[] = false 
    opened[i] = true 
    movein.target = txt[i] 
    movein.play 

也許你並不需要打開的變量。

+0

感謝你的例子,我會檢查它並嘗試對它進行試驗。我接受了另一個答案,因爲它有更多的解釋,但我相信我會發現你的答案和另一個答案一樣有幫助=) – errata

+0

做數組或集合的東西絕對比提問者的好,但是用面向對象只是一種方式:代碼變得更乾淨,更容易理解。只是我的2美分... –

+1

其實我沒有理由在這裏使用OO。我想這一切都取決於情況。有時候是簡化程序的方法。 OO可能會變得很滑,但如果你不認爲它通過(OO-ing),它會比程序更糟糕。當我通常做OO操作時,我需要所有的對象,然後將它縮小到最小(這意味着保持低對象)以支持所有對象並保留繼承。 – Egon

0

作爲事實上,的moveOut.target執行下面的代碼段之後的值將總是txt3如果opened3true(不論​​opened2/3的數值)。是由設計還是opened1/2/3/4相互排斥(一次只能有一個是真的)還是缺少else陳述或...?

if (opened1){ 
moveOut.target = txt1; 
} 
if (opened2){ 
moveOut.target = txt2; 
} 
if (opened3){ 
moveOut.target = txt3; 
} 
+0

啊,是的,這是有道理的......但我的例子實際上按預期工作......雖然我不知道爲什麼=) – errata