2012-03-12 39 views
0

我想设置一个动画片段按钮的数组,以通过标签在我的时间线上导航,这就是梨形状的位置。AS3流体动画和AT状态下的动画片段按钮阵列

花了三天的时间阅读并尝试了大多数在线解决方案后,我找不到某种方法在不失败的情况下以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是因为你经常使用在线看到的代码,而没有充分掌握细节。

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

添加具有流动性,这从一个数组抵消成为当你学习了三天的使命影片剪辑按钮...

回答

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(); 
     } 
    } 
} 
} 
+0

感谢您的答复和你输入。它是一个来自AS2的沉重的学习曲线! 就我个人而言,我仍然有点不确定软件包在Flash中的工作原理。作为新手,我发现它很奇怪,我不确定为什么以及如何对代码进行最佳排序,再加上我试图做的差异更容易内联。 我可以在某些方面看到你的方法中的逻辑,但是当它在包装中时,它有点超出我的把握。希望很快。 – esadude 2012-03-13 20:26:24

+0

同时,您不确定的mouseOverHandler项目是从另一个示例中修改的,我看到它使鼠标悬停以允许流体操作nextFrame代码。 我有一个真正的问题,它要么注册一个框架向前,或类似的整个阵列在parralel工作,一天后,我设法使用这个来启用按钮动画之间的流体运动,同时仍然导航通过destArray没有任何显示错误报告。 我真的很高兴它的工作,如何变得无关紧要... – esadude 2012-03-13 20:26:41

+0

我在我的网站上工作,这是相当沉重,但理解一些AS3行话的技巧是一个杀手,它更加恼人,当你可以发现问题,但无法找到答案。 按钮我也尝试了ROLL_OVER但必须有一些编码错误的地方,因为我把似乎只该为我工作的方式方法。 – esadude 2012-03-13 20:27:32