Apache flex 简化Flex/AS3代码

Apache flex 简化Flex/AS3代码,apache-flex,actionscript-3,oop,flex3,Apache Flex,Actionscript 3,Oop,Flex3,我曾经用php编程过一段时间,但都是面向过程的。现在我在Flex3中有一个项目,我制作了一个简单的脚本,它可以为一些对象设置动画(移动),但我认为我忽略了面向对象编程的要点,因为我一遍又一遍地重复一些东西。。。也许它和我对AS3的所有困惑混在一起,所以请告诉我有没有更聪明的方法来编写这段代码: <?xml version="1.0" encoding="utf-8"?> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"

我曾经用php编程过一段时间,但都是面向过程的。现在我在Flex3中有一个项目,我制作了一个简单的脚本,它可以为一些对象设置动画(移动),但我认为我忽略了面向对象编程的要点,因为我一遍又一遍地重复一些东西。。。也许它和我对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、

遵循一些有关应用程序架构的教程,使用一些模式,尝试MVC或MVP,签出Smartypants IOC

您的示例代码非常适合OOD(面向对象)

您有四个对象(将使用一个类来定义),它们包含对按钮、文本、打开状态等的引用。因此,您将一个类定义为MXML组件,该组件包含按钮、文本和任何其他状态,并将方法放在该组件上(在
块中)。此外,还可以在组件的
creationComplete
方法中初始化组件,以便在完成初始图形时打开变量为false。即使您的
mouseOver
方法也很完美:您可以让对象决定是否需要执行某些操作(MXML组件将自动进行事件处理)。基本上,这就是我们要做的:MXML组件处理它自己的内部状态,而不是有一个必须管理列表状态的外部对象

由于MouseOver方法将放在MXML组件中,因此每个组件都必须保存对其他组件的引用。有很多方法可以做到这一点,包括提前在某个点传递引用并存储它,或者使用
static
var保存其他x个对象的列表


希望这有一定的意义和帮助。

不如做些类似的事情。在伪代码中:

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

可能您不需要打开的变量。

事实上,如果
opened3
true
(与
opened2/3
的值无关),则执行以下代码段后
moveOut.target
的值将始终为
txt3
。这是故意的还是相互排斥的(一次只能有一个是真的),或者您缺少
else
语句还是

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

谢谢你的例子,我将检查它并尝试用它进行实验。我接受了另一个答案,因为它有更多的解释,但我相信我会发现你的答案和另一个答案一样有用=)使用数组或集合做事情肯定比提问者做的要好,但是使用OO做事情更流畅:代码变得更干净,更容易理解。只有我的2美分…实际上我看不出有什么理由在这里使用OO。我想这完全取决于形势。有时,这是一种程序性的方法,更容易做到。OO可能更圆滑,但如果你不仔细思考(过OO化),它比程序化更糟糕。当我通常做OO的时候,我会做所有我需要的事情,然后把它缩小到最小值(这意味着在对象上保持较低),以支持所有对象并保持继承。啊,是的,这很有意义。。。但我的例子确实如预期的那样有效。。。虽然我不确定为什么=),但我想说,在这一点上,学习简单的OO内容比学习模式/MVC(特别是如果您考虑的是MVC框架)重要得多。