Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

PERCY.FERNANDES

Automatização da inserção de vários movieclips da biblioteca no pa

Recommended Posts

Bom dia a todos

 

Na biblioteca há vários movieclips (aula1, aula2, aula3, aula4, ...) todos eles já linkados com classe construtora de mesmo nome. Desejo inserir via código (em tempo de execução) todos eles no palco (a matemática da disposição em me viro). No código a seguir estou descrevendo como fiz para um deles. Meu problema é que não tenho conhecimento suficiente de sintaxe para automatizar a inserção e a atribuição dos eventos dentro de um laço for. Coisa do tipo "aula"+i. Quando tentei fazer isto com o nome da construtora deu erro (var a+"i": "aula"+i = new "aula"+i(); Caso seja possível também enxugar o código, aceito sugestões. Imagino que a alternância entre os eventos marca e desmarca pode ser feita sem o uso da variável booleana m. Também aceito sugestões.

 

//Código
import fl.transitions.Tween;
import fl.transitions.easing.*;
var m:Boolean=true;
var a1 : aula1 = new aula1();
addChild(a1);
a1.scaleX = 1;
a1.scaleY = 1;
a1.x = 0;
a1.y = 0;
a1.addEventListener(Event.ENTER_FRAME, menu1);
function menu1(event:Event):void
{
if(m==true)
{
a1.addEventListener(MouseEvent.MOUSE_OVER, sobre)
function sobre (event:MouseEvent):void
{
var sombra:DropShadowFilter = new DropShadowFilter();
a1.x=5;
a1.y=5;
sombra.distance = -5;
sombra.color = 0x663300;
sombra.blurX = 10;
sombra.blurY = 10;
sombra.quality = 3;
a1.filters = [sombra];
}
a1.addEventListener(MouseEvent.MOUSE_OUT, fora)
function fora (event:MouseEvent):void
{
a1.x=0;
a1.y=0;
a1.filters = [];
}
a1.addEventListener(MouseEvent.CLICK, marca)
function marca (event:MouseEvent):void
{
var deslocaX:Tween;
var deslocaY:Tween;
var cresceLargura:Tween;
var cresceAltura:Tween;
deslocaX = new Tween(a1, "x", Back.easeIn, 0, 50, 0.2, true);
deslocaY = new Tween(a1, "y", Back.easeIn, 0, 55, 0.2, true);
cresceLargura = new Tween(a1, "scaleX", Back.easeIn, 1, 3, 0.2, true);
cresceAltura = new Tween(a1, "scaleY", Back.easeIn, 1, 3, 0.2, true);
a1.filters = [];
m=false;
a1.removeEventListener(MouseEvent.CLICK, marca);
a1.removeEventListener(MouseEvent.MOUSE_OVER, sobre);
a1.removeEventListener(MouseEvent.MOUSE_OUT, fora);
}
}else
{
a1.addEventListener(MouseEvent.CLICK, desmarca)
function desmarca (event:MouseEvent):void
{
var deslocaX:Tween;
var deslocaY:Tween;
var cresceLargura:Tween;
var cresceAltura:Tween;
deslocaX = new Tween(a1, "x", Back.easeIn, 50, 0, 0.2, true);
deslocaY = new Tween(a1, "y", Back.easeIn, 55, 0, 0.2, true);
cresceLargura = new Tween(a1, "scaleX", Back.easeIn, 3, 1, 0.2, true);
cresceAltura = new Tween(a1, "scaleY", Back.easeIn, 3, 1, 0.2, true);
m=true;
a1.removeEventListener(MouseEvent.CLICK, desmarca);
}
}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Noite

 

Eu não consegui resolver o problema inicial do post , como é possível notar no código abaixo. Mas gostaria que o pessoal com mais experiência, implementa-se o código abaixo e me explica-se porque um mesmo movieclip clicado várias vezes seguidas, acaba por se deslocar de sua posição original caso use o parâmetro "Back" nos Tweens. Não achei que fosse algum erro da lógica do algorítmo, pois mudando o parâmetro "Back" para o parâmetro "Strong" nos Tweens de deslocamento "x" e "y", o problema deixa de se manifestar.

 

 

import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.MovieClip;
import flash.display.InteractiveObject;
//Variáveis que armazenarão as coordenadas da possição do movieclip filho clicado
var px : int;
var py : int;
//Cria, posiciona e adiciona o movieclip pai dentro do movieclip da timeline
var container:carrega=new carrega();
container.x=-270;
container.y=25;
addChild(container);
//Cria, posiciona e adiciona os movieclips filhos dentro do movieclip pai
var a1:aula1=new aula1();
a1.x=0;
a1.y=0;
a1.name="aula1";
container.addChild(a1);
var a2:aula2=new aula2();
a2.x=70;
a2.y=0;
a2.name="aula2";
container.addChild(a2);
var a3:aula3=new aula3();
a3.x=0;
a3.y=90;
a3.name="aula3";
container.addChild(a3);
var a4:aula4=new aula4();
a4.x=70;
a4.y=90;
a4.name="aula4";
container.addChild(a4);
var a5:aula5=new aula5();
a5.x=0;
a5.y=180;
a5.name="aula5";
container.addChild(a5);
var a6:aula6=new aula6();
a6.x=70;
a6.y=180;
a6.name="aula6";
container.addChild(a6);
var a7:aula7=new aula7();
a7.x=0;
a7.y=270;
a7.name="aula7";
container.addChild(a7);
var a8:aula8=new aula8();
a8.x=70;
a8.y=270;
a8.name="aula8";
container.addChild(a8);
//Cria os listeners de click para cada movieclip filho
a1.addEventListener(MouseEvent.CLICK,aproxima);
a2.addEventListener(MouseEvent.CLICK,aproxima);
a3.addEventListener(MouseEvent.CLICK,aproxima);
a4.addEventListener(MouseEvent.CLICK,aproxima);
a5.addEventListener(MouseEvent.CLICK,aproxima);
a6.addEventListener(MouseEvent.CLICK,aproxima);
a7.addEventListener(MouseEvent.CLICK,aproxima);
a8.addEventListener(MouseEvent.CLICK,aproxima);
//Função que é executada para o movieclip clicado
function aproxima (evt:MouseEvent):void
{
//Cria um movieclip interno para manipular o filho clicado
var aula : MovieClip = MovieClip(evt.currentTarget);
//Coloca o filho clicado no topo da lista do pai
container.setChildIndex(aula,8);
//Esconde os filhos abaixo do topo da lista de filhos do container
for(var i:int=1;i<8;i++)
{
var esconde:Tween;
esconde = new Tween(container.getChildAt(i),"alpha",Strong.easeIn,1,0,0.3,true);
}
//Evidencia o filho clicado
px = aula.x;
py = aula.y;
var deslocaX:Tween;
var deslocaY:Tween;
var cresceLargura:Tween;
var cresceAltura:Tween;
deslocaX = new Tween(aula,"x",Strong.easeIn,px,10,0.3,true);
deslocaY = new Tween(aula,"y",Strong.easeIn,py,15,0.3,true);
cresceLargura = new Tween(aula,"scaleX",Strong.easeIn,1,4,0.3,true);
cresceAltura = new Tween(aula,"scaleY",Strong.easeIn,1,4,0.3,true);
//Remove os listeners dos filhos que não foram clicados
for(i=i;i<8;i++)
{
container.getChildAt(i).removeEventListener(MouseEvent.CLICK,aproxima);
}
//Muda o listener de click que evidencia o filho para o que devolve o filho para sua posição original
aula.removeEventListener(MouseEvent.CLICK, aproxima);
aula.addEventListener(MouseEvent.CLICK, afasta);
//Devolve o filho clicado para a posição original
function afasta (evt:MouseEvent):void
{
//Mostra os filhos que não foram evidenciados
for(i=1;i<8;i++)
{
var mostra:Tween;
mostra = new Tween(container.getChildAt(i),"alpha",Strong.easeIn,0,1,0.3,true);
}
//Devolve o filho que foi evidenciado para seu estado original
var deslocaX:Tween;
var deslocaY:Tween;
var cresceLargura:Tween;
var cresceAltura:Tween;
deslocaX = new Tween(aula,"x",Strong.easeIn,10,px,0.3,true);
deslocaY = new Tween(aula,"y",Strong.easeIn,15,py,0.3,true);
cresceLargura = new Tween(aula,"scaleX",Strong.easeIn,4,1,0.3,true);
cresceAltura = new Tween(aula,"scaleY",Strong.easeIn,4,1,0.3,true);
//Muda o listener de click, do que devolve o filho clicado para o que evidencia
aula.removeEventListener(MouseEvent.CLICK, afasta);
//Adiciona o listener de evidencia para todos os filhos
for(i=1;i<9;i++)
{
container.getChildAt(i).addEventListener(MouseEvent.CLICK,aproxima);
}
}
}

Poxa, acabei de me tocar que cliques seguidos fazem com que o evt.currentTarget altere os valores de px e py dentro da função que contém os Tweens. Isto significa que deve haver um jeito de habilitar o clique só depois que o evento Tween terminar. Se alguém conhece, é só postar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A Tween nativa do Flash não é lá essas coisas. Não uso nunca.

 

Sugiro experimente a classe da Greensock/AS3, excelente. Há um simulador com exemplos de código no site, ao baixar a classe vem junto, bem útil.

 

Enquanto a tween estiver ocorrendo se remove o 'evento' (ou seja, nada acontece até que termine), e devolvemos na função onComplete.

 

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre o primeiro problema pode usar algo do tipo.

o x e o y do objeto você coloca como ficar melhor, se colocar o x como a largura do objeto e multiplicar pelo contador do for(exceto pelo primeiro) você adiciona um do lado do outro

import flash.display.MovieClip;

//coloque o nome do as linkage dos Objetos
var vetItens:Array = new Array(Obj2,Obj1)

function atacaObj():void
{
   for (var a:uint=0; a<vetItens.length; a++)
     {
       var mc:MovieClip = MovieClip(new vetItens[a]());	  
       mc.x = 90 * a;
       mc.y = 50 * a;
       mc.name = String(vetItens[a]);
       MovieClip(root).addChild(mc);
     }
}

atacaObj();

atacaObj();

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.