2009-02-17 2 views
-1

У меня есть этот код 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

В vim просто сделайте 'ggdGzz', который исправит вашу проблему – Qix

ответ

2

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

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-loop над ячейками массива или использовать forEac ч() функция-член:

boxes.forEach(processBox); 

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

+0

Спасибо, что-то в этом роде, но я вроде хотел иметь весь код в , поэтому я мог бы просто вставить boxLink (a); и он будет делать все с помощью a (a_box.link1, a_box.arrow1, a_box.image). ? –

+0

То, что boxLinkWrapper() делает. – dirkgently

+0

Хорошо, я получил это;) Но как я могу получить весь код в «function boxLink»? –