具有流畅动画和AT状态的AS3动画片段按钮阵列

时间:2012-03-12 10:27:07

标签: arrays actionscript-3 event-handling movieclip

我想设置一个动画片段按钮数组,以便通过标签在我的时间轴上导航,这就是梨形状。

花了三天时间阅读并尝试了大多数在线解决方案,我找不到一种100%工作的方法而不会以某种方式失败。

我对下面的方法感到非常高兴看到一个博客条目,涵盖了调用框架等的不同方式,并突出了下面的问题:

clipArray[i].mouseChildren = false; //Hidden bugbear

我已经添加了下面的完整代码,所以希望它可以帮助其他任何同样在尝试此事时几乎采用hari-kari的人。

import flash.events.MouseEvent;
import flash.events.Event;

var clipArray:Array = [btn_1,btn_2]; // Movieclip's called btn_1 etc...
var destArray:Array = ["page_1","page_2"]; Labels on timeline...
for (var i:int = 0; i < clipArray.length; i++) {
clipArray[i].buttonMode = true; // Define Button from Movie Clip
clipArray[i].useHandCursor = true; // Enable HandCursor over clip
clipArray[i].mouseChildren = false; // Define clip as single denomination
clipArray[i].addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
clipArray[i].addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
clipArray[i].addEventListener(Event.ENTER_FRAME, frameHandler);
clipArray[i].addEventListener(MouseEvent.CLICK,clickHandler, false, 0, true);
}

function clickHandler(event:MouseEvent):void {
for (var i:int = 0; i < clipArray.length; i++) {
    if (event.currentTarget == clipArray[i]) {
        this.gotoAndStop(destArray[i]);
        clipArray[i].mouseEnabled = false;
        clipArray[i].useHandCursor = false;
        clipArray[i].alpha = 0.5;
    } else {
        clipArray[i].mouseEnabled = true;
        clipArray[i].useHandCursor = true;
        clipArray[i].alpha = 1;
    }
}
}

function mouseOverHandler(e:MouseEvent){
e.target.onOff = true;
}

function mouseOutHandler(e:MouseEvent){
e.target.onOff = false;
}

function frameHandler(e:Event){
if(e.target.onOff){
    e.target.nextFrame();
} else {
    e.target.prevFrame();
}
}

这很好用,但是现在我对它是否是“好”代码的理解是一个问题,如果可以通过任何方式改进我想知道为什么以及如何从2学习AS3的问题通常你会使用已经在网上看过的代码而没有完全掌握细节。

暂时,我很高兴,因为这被证明是一个寻找或解决的噩梦,并希望它可以帮助处于类似心态的其他人。

当你正在学习时,添加具有流动性的MovieClip按钮并从阵列中取消成为一个为期三天的任务......

1 个答案:

答案 0 :(得分:0)

如果将所有这些放在一个类中并使用Tween类前往“标签”而不是时间轴,您可能会发现自己有更多自由。这意味着您可以删除事件侦听器,直到动画结束。

看起来你最好还是使用MouseEvent.ROLL_OVER和MouseEvent.ROLL_OUT

如果我是诚实的,我不知道你的一些方法想要做什么而不看你的整个项目,但我很快就为你写了一堂课。我已经替换了页面之间的动画,只需将按钮设置为ramdom位置。 (请记住将使用IDE创建的MovieClip导出到actionscript中,为它们提供类名Button01,Button02等...)。我希望这会让你朝着正确的方向前进:)

package com
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;

public class Main extends MovieClip
{
    private var btn_1:Button01 = new Button01;
    private var btn_2:Button02 = new Button02;
    private var clipArray:Array = new Array();
    private var xAxis:Number = 0;
    private var yAxis:Number = 0;
    private static const WIDTH:int = 300;
    private static const HEIGHT:int = 250;
    private var tweenButton:Tween;

    public function Main()
    {
        makeArrays();
        addChildren();
        setEventListeners()
    }
    private function makeArrays():void
    {
        for(var i:uint=0; i<2; i++)
            clipArray.push(this['btn_'+(i+1)]);
    }
    private function addChildren():void
    {
        for(var i:uint=0; i<clipArray.length; i++){
            addChild(clipArray[i]);
            clipArray[i].x = WIDTH*Math.random();
            clipArray[i].y = HEIGHT*Math.random();
        }
    }
    private function setEventListeners():void
    {
        for (var i:uint=0; i<clipArray.length; i++) {
            clipArray[i].buttonMode = true; // Define Button from Movie Clip
            //clipArray[i].useHandCursor = true; // Enable HandCursor over clip
            //clipArray[i].mouseChildren = false; // Define clip as single denomination // DON'T NEED THIS WITH ROLL_OVER
            clipArray[i].addEventListener(MouseEvent.ROLL_OVER, mouseOverHandler);
            clipArray[i].addEventListener(MouseEvent.ROLL_OUT, mouseOutHandler);
            clipArray[i].addEventListener(Event.ENTER_FRAME, frameHandler);
            clipArray[i].addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
        }
    }
    private function tweenButtons(e:Event):void
    {
        var dispObj = e.currentTarget as DisplayObject;
        dispObj.removeEventListener(MouseEvent.CLICK, clickHandler)
        tweenButton = new Tween(dispObj, 'x', Regular.easeIn, dispObj.x, WIDTH*Math.random(), 1, true);
        tweenButton = new Tween(dispObj, 'y', Regular.easeIn, dispObj.y, HEIGHT*Math.random(), 1, true);
        tweenButton.addEventListener(TweenEvent.MOTION_FINISH, reattachEventListener);
    }
    private function reattachEventListener(e:Event):void
    {
        tweenButton.removeEventListener(TweenEvent.MOTION_FINISH, reattachEventListener);
        for (var i:uint=0; i<clipArray.length; i++) {
            if(!(hasEventListener(MouseEvent.CLICK)))
               clipArray[i].addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
        }
    }
    private function clickHandler(e:MouseEvent):void
    {
        for (var i:uint=0; i<clipArray.length; i++) {
            if (e.currentTarget == clipArray[i]) {
                tweenButtons(e);
                clipArray[i].buttonMode = false
                clipArray[i].alpha = 0.5;
            } else {
                clipArray[i].buttonMode = true;
                clipArray[i].alpha = 1;
            }
        }
    }

    private function mouseOverHandler(e:MouseEvent):void // I HAVE NO IDEA WHAT YOU'RE TRYING TO DO HERE
    {
        e.target.onOff = true;
    }

    private function mouseOutHandler(e:MouseEvent):void // I HAVE NO IDEA WHAT YOU'RE TRYING TO DO HERE
    {
        e.target.onOff = false;
    }

    private function frameHandler(e:Event):void // I HAVE NO IDEA WHAT YOU'RE TRYING TO DO HERE
    {
        if(e.target.onOff){
            e.target.nextFrame();
        }else{
            e.target.prevFrame();
        }
    }
}
}
相关问题