2012-03-12 85 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