AS3 массив кнопок мувиклипа с плавной анимацией и состоянием AT - PullRequest
0 голосов
/ 12 марта 2012

Я хотел настроить массив кнопок мувиклипа, чтобы перемещаться по моей временной шкале с помощью меток, вот где он стал грушевидным.

Потратив три дня на чтение и попытку большинства онлайн-решений, я не смог найтиметод, который работал на 100% без сбоев тем или иным образом.

Я испытал некоторую радость от метода, приведенного ниже, когда увидел запись в блоге, посвященную различным способам вызова фреймов и т. д., и выделил указанную ниже ошибку:

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

Я добавил полный код ниже, так что, надеюсь, он может помочь любому, кто так же почти прибег к Хари-Кари, попробовать это.

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

Это работает отлично, но теперь мойПонимание того, является ли это «хороший» код или нет, является проблемой, если это можно улучшить каким-либо образом, я хотел бы знать, почему и как проблема с изучением AS3 из 2 заключается в том, что вы часто используете код, увидев его в Интернетебез полного понимания деталей.

Ориентировочно, я рад, поскольку это оказалось кошмаром, чтобы найти или решитьи надеюсь, что это поможет кому-то еще в подобном состоянии.

Добавление кнопок MovieClip с плавностью и отменой из массива стало трехдневной миссией, когда вы учитесь ...

1 Ответ

0 голосов
/ 12 марта 2012

Вы можете обнаружить, что у вас больше свободы, если вы поместите все это в класс и используете класс Tween для перехода к вашим «ярлыкам» вместо временной шкалы.Это будет означать, что вы сможете удалить своих слушателей событий, пока анимация не закончится.

Кроме того, похоже, что вам может быть лучше использовать MouseEvent.ROLL_OVER и MouseEvent.ROLL_OUT

ЕслиЧестно говоря, я не знаю, чего хотят некоторые из ваших методов, не видя весь ваш проект, но я быстро написал для вас класс.Я заменил анимацию между страницами просто анимированием кнопок в месте быстрого доступа.(Не забудьте экспортировать ваши мувиклипы, созданные с помощью IDE, в 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();
        }
    }
}
}
...