2009-10-19 81 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