Сократить код функции и преобразовать переменную - PullRequest
0 голосов
/ 17 февраля 2009

У меня есть этот код AS2, который выполняет несколько простых анимаций, когда я переключаю mc с помощью TweenLite.

Я чувствую, что у меня много повторяющегося кода.

Можно ли просто указать такую ​​функцию, как эта

boxLink (а);

и иметь остальную часть кода с путем к целевому мувиклипу в функции, а не в переменной функции?

Как сделать этот код максимально коротким?

Можно ли преобразовать переменную: String в переменную: MovieClip? Как бы я это сделал в этом примере?

 import gs.*;
 import gs.easing.*;


function imageAlpha(mc_target:MovieClip) {
    mc_target.onRollOver = function() {
            TweenLite.to(mc_target,1,{_alpha:100, ease:Back.easeOut});
    };

    mc_target.onRollOut = function() {
            TweenLite.to(mc_target,1,{_alpha:60, ease:Back.easeOut});
    };
 }



  function boxLink(mc_function:MovieClip, mc_target:MovieClip, mc_image:MovieClip, linkURL:String) {
    mc_function.onRollOver = function() {
            TweenLite.to(mc_target,0.5,{_xscale:150, _yscale:150, ease:Back.easeOut});
            TweenLite.to(mc_image,1,{_alpha:100, ease:Back.easeOut});
    };

    mc_function.onRollOut = function() {
            TweenLite.to(mc_target,0.5,{_xscale:100, _yscale:100, ease:Back.easeOut});
            TweenLite.to(mc_image,1,{_alpha:60, ease:Back.easeOut});
    };

    mc_function.onRelease = function() {
            if (linkURL) {
            getURL(linkURL);
            }
    };
 }



 imageAlpha(a_box.image);
 imageAlpha(b_box.image);
 imageAlpha(c_box.image);
 imageAlpha(d_box.image);

 boxLink(a_box.link1,a_box.arrow1,a_box.image,'http://www.google.no');
 boxLink(a_box.link2,a_box.arrow2,a_box.image,'http://www.google.no');
 boxLink(a_box.link3,a_box.arrow3,a_box.image,'http://www.google.no');

 boxLink(b_box.link1,b_box.arrow1,b_box.image,'http://www.google.no');
 boxLink(b_box.link2,b_box.arrow2,b_box.image,'http://www.google.no');
 boxLink(b_box.link3,b_box.arrow3,b_box.image,'http://www.google.no');

 boxLink(c_box.link1,c_box.arrow1,c_box.image,'http://www.google.no');
 boxLink(c_box.link2,c_box.arrow2,c_box.image,'http://www.google.no');
 boxLink(c_box.link3,c_box.arrow3,c_box.image);

 boxLink(d_box.link1,d_box.arrow1,d_box.image,'http://www.google.no');
 boxLink(d_box.link2,d_box.arrow2,d_box.image,'http://www.google.no');
 boxLink(d_box.link3,d_box.arrow3,d_box.image);

1 Ответ

2 голосов
/ 17 февраля 2009

Использовать массивы вместо именованных переменных

a_box.link_1, a_box.link_2, ..., a_box.link_3 

становится

a_box.link[ i ] where i = 0 to n-1, n = number of links

Аналогично для стрелок.

Далее создайте оболочку для boxLink()

public function 
boxLinkWrapper(x:BoxType, url:string='http://www.google.no') :ReturnType {
    for (i:int = 0; i < x.link.size; ++i) {
        boxLink(x.link[ i ], x.arrow[ i ], x.image, url);
    }
}

Кроме того, поскольку у вас есть несколько таких блоков, поместите их в массив:

var boxes:Array = new Array();
boxes.push(new Box("a")); //a_box
boxes.push(new Box("b")); //b_box

и оберните шаги, которые вам понадобятся для каждой коробки:

public function 
processBox(x:BoxType):SomeReturnType {
    imageAlpha(d_box.image);
    boxLink(a_box.link1,a_box.arrow1,a_box.image,'http://www.google.no');
}

и выполните цикл for над полями массива или используйте функцию-член forEach ():

boxes.forEach(processBox);

Не забудьте заменить BoxType, SomeReturnType и ReturnType на соответствующие типы. Это помогает? (Примечание: это непроверенный код, но вы должны начать!)

...