Sfw Externo. Fazendo Referencia ao Swf Principal via AS3
#1
Publicado 20 de Janeiro de 2012 - 17:07
Feliz 2012.
Como eu faço para, em um sfw Externo, fazer Referencia ao Swf Principal via AS3?
Tipo assim:
Tenho um Swf Principal com um MovieClip Container que, pelo Menu que esta no proprio Swf Principal, carrega os Swf's Externos. Até ai consegui sem problemas.
O problema é que, em um desses MovieClip's Externos, eu tenho um botão que vai abrir outro Swf Esterno no Mesmo lugar dele. E ainda precisa removê-lo, senão dai dar sobreposição de clicp's.
Alguem me ajuda?
Obrigado.
Carlos Rocha
#2
Publicado 20 de Janeiro de 2012 - 18:53
nao sei bem como tens o teu codigo feito, mas para fazer isso precisas de aceder ao teu "MovieClip Container" apartir do seu "conteudo"
tenta algo tipo:
Código (ActionScript):
while(t.numChildren > 0) t.removeChildAt( 0 );
deste modo, estas a remover o unico (ele proprio) mc que esta no teu "MovieClip Container".
Se isto nao ajudou, coloca algum codigo que tens para se poder perceber melhor a questao.
cumps,
cc
#3
Publicado 20 de Janeiro de 2012 - 19:14
Meu swf principal tem um menu lá que, pelo clik dos botoes, dispara a função clike que é assim(para cada botão):
Código (ActionScript):
// Declação de Variáveis e Incialização da página HOME
var link:URLRequest=new URLRequest("inicio.swf");
mcCarrega.gotoAndPlay(2);
// Eventos dos Botões
inicio.addEventListener(MouseEvent.CLICK, clique);
empresa.addEventListener(MouseEvent.CLICK, clique);
produtos.addEventListener(MouseEvent.CLICK, clique);
infuteis.addEventListener(MouseEvent.CLICK, clique);
ambiental.addEventListener(MouseEvent.CLICK, clique);
atuacao.addEventListener(MouseEvent.CLICK, clique);
contato.addEventListener(MouseEvent.CLICK, clique);
// Função clique que troca o valor da variável LINK
function clique(evt:MouseEvent):void {
switch (evt.currentTarget) {
case (inicio):
link=new URLRequest("inicio.swf");
break;
case (empresa):
link=new URLRequest("empresa.swf");
break;
case (produtos):
link=new URLRequest("produtos.swf");
break;
case (infuteis):
link=new URLRequest("infuteis.swf");
break;
case (ambiental):
link=new URLRequest("ambiental.swf");
break;
case (atuacao):
link=new URLRequest("atuacao.swf");
break;
case (contato):
link=new URLRequest("contato.swf");
break;
}
mcCarrega.gotoAndPlay(2);
}
Esse mcCarrega é um mc vazio que tem em sua timeline a seguinte construção:

E o codigo do frame do meio é:
Código (ActionScript):
//Declaração de Variável
var carrega:Loader = new Loader();
// Carregando o arquivo escolhido na variável CARREGA
carrega.load(MovieClip(root).link);
// Verificação de Eventos de Carregamento
carrega.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, carregando);
carrega.contentLoaderInfo.addEventListener(Event.COMPLETE, completo);
//Funções de Carregamento
function carregando(evt:ProgressEvent):void {
var perc:Number=evt.bytesLoaded/evt.bytesTotal;
barra.scaleX=perc;
percentual.text=Math.floor(perc*100)+"%";
}
function completo(evt:Event):void {
MovieClip(root).container.removeChildAt(0);
MovieClip(root).container.addChild(carrega);
play();
}
Bom, dentre os mc externos que são carregados, há um que tem um botão dentro dele para abrir no seu lugar outro swf externo e remover seu conteudo da memoria.
Usei esse código:
Código (ActionScript):
contato.addEventListener(MouseEvent.CLICK, clique);
function clique(evt:MouseEvent):void {
var carrega:Loader = new Loader();
var link:URLRequest = new URLRequest("contato.swf");
carrega.load(link);
carrega.contentLoaderInfo.addEventListener(Event.COMPLETE, completo);
function completo(evt:Event):void {
trace(MovieClip(root).container);
addChild(carrega);
play();
}
}
Mas parece que esse mc externo esta carregando para dentro dele mesmo e não para dentro do mc vazio que esta no palco do swf principal e tambem, quando abre o swf contato, ele abre sobreposto ao atuacao.swf.
Como saio dessa?
#4
Publicado 20 de Janeiro de 2012 - 19:28
Código (ActionScript):
var carrega:Loader = new Loader();
var link:URLRequest = new URLRequest("contato.swf");
carrega.load(link);
carrega.contentLoaderInfo.addEventListener(Event.COMPLETE, completo);
function completo(evt:Event):void {
trace(MovieClip(root).container); // QUE APARECE?
addChild(carrega);
play();
}
}
esse container que estas a tentar encontrar, é o container do swf que queres remover?
se sim, tenta usar:
Código (ActionScript):
var carrega:Loader = new Loader();
var link:URLRequest = new URLRequest("contato.swf");
carrega.load(link);
carrega.contentLoaderInfo.addEventListener(Event.COMPLETE, completo);
function completo(evt:Event):void {
trace(MovieClip(root).container);
var a:MovieClip = MovieClip(root).container
while( a.numChildren > 0 ) a.removeChildAt(0);
a.addChild(carrega);
play();
}
}
Não tenho a certeza se irá dar ou nao, mas desta forma estarias a remover o swf atual do container, a adicionar o swf "carrega".
Acho que a solucao podera passar por ai.
Se tiveres duvidas, avisa
cc
#5
Publicado 20 de Janeiro de 2012 - 19:35
Dá o mesmo.
veja:

Se puder, baixe meus fontes e de uma olhada onde estou errando
http://www.gapde.com.br/aa.zip
#6
Publicado 20 de Janeiro de 2012 - 20:43
Código (ActionScript):
Experimenta antes:
Código (ActionScript):
Quando tentas aceder ao "root", so acedes ao root do proprio objecto (ou swf) e nao ao root geral.
Dá uma olhada nisto:
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#root
e procura as propriedades "parent" e "root", acho que te pode dar umas dicas.
Se ainda tiveres mais duvidas avisa
cc
#7
Publicado 20 de Janeiro de 2012 - 21:36
Mas o parent, neste caso, não seria o MC conainer?
Do jeito que voce mandou deu esse erro na linha que substitui:
Código :
[object Loader]
Abrir o mc contato abre normal. O problema é fechar o que esta aberto (atuacao.swf). Pois esta abrindo um por cima do outro conforme a imagem anexa.
Ta parecendo que o Flash não autoriza voltar para o swf principal a partir do swf externo por questao de segurança.
#8
Publicado 20 de Janeiro de 2012 - 22:01
carcleo, em 20 de Janeiro de 2012 - 21:36, disse:
...
Exacto.
Essa é uma das maneiras mais simples de aceder.
mas se queres especificamente aceder ao container, faz:
Código (ActionScript):
trace(f.container) //MOSTRA [object MovieClip]
carcleo, em 20 de Janeiro de 2012 - 21:36, disse:
1084: Syntax error: expecting rightparen before semicolon.
A tua funcao completo deverá ser algo assim:
Código (ActionScript):
{
trace(MovieClip(root).parent); // MOSTRA [object MovieClip]
var t:MovieClip = MovieClip(root).parent as MovieClip;
while( t.numChildren > 0 ) t.removeChildAt(0);
t.addChild(carrega);
}
Existe uma outra solucao (que é bem mais eficiente):
No teu index.fla, podes criar uma funcao que ficara acessivel sempre que queiras mudar o conteudo do container de uma forma mais "limpa":
Código (ActionScript):
{
link=new URLRequest(url);
mcCarrega.gotoAndPlay(2);
}
Depois no swf atuacao (ou qq outro):
Código (ActionScript):
var t:MovieClip = MovieClip(root).parent.root as MovieClip;
t.carregaSwf("contato.swf");
}
desta forma reaproveitas todo o codigo do swf principal (index), incluindo a animacao que tens no mcCarrega
cc
#9
Publicado 20 de Janeiro de 2012 - 22:05
Pois eu ja tenho isso lá:
Código :
function clique(evt:MouseEvent):void {
switch (evt.currentTarget) {
case (inicio):
link=new URLRequest("inicio.swf");
break;
case (empresa):
link=new URLRequest("empresa.swf");
break;
case (produtos):
link=new URLRequest("produtos.swf");
break;
case (infuteis):
link=new URLRequest("infuteis.swf");
break;
case (ambiental):
link=new URLRequest("ambiental.swf");
break;
case (atuacao):
link=new URLRequest("atuacao.swf");
break;
case (contato):
link=new URLRequest("contato.swf");
break;
}
mcCarrega.gotoAndPlay(2);
}
#10
Publicado 20 de Janeiro de 2012 - 22:26
carcleo, em 20 de Janeiro de 2012 - 22:05, disse:
carcleo, em 20 de Janeiro de 2012 - 22:05, disse:
Nessa funcao (ou Event Handler) estas a receber um parametro (evt:MouseEvent), e é apartir desse parametro que defines o link: switch (evt.currentTarget)
Se chamares esse event handler apartir do swf "atuacao", nao terias maneira de saber qual o valor que passavas no switch.
Daí eu ter criado uma funcao aparte (carregaSwf()) para poderes aceder "externamente" ao "ciclo" de mudar de conteudo no container.
por exemplo:
na tua timeline principal (index.fla):
Funcao para definir (externamente) o swf a carregar:
Código (ActionScript):
{
link=new URLRequest(url);
mcCarrega.gotoAndPlay(2);
}
Funcao para definir (internamente) o swf a carregar:
Código (ActionScript):
var swfPath:String;
switch (evt.currentTarget) {
case (inicio):
swfPath = "inicio.swf";
break;
case (empresa):
swfPath = "empresa.swf";
break;
case (produtos):
swfPath = "produtos.swf";
break;
case (infuteis):
swfPath = "infuteis.swf";
break;
case (ambiental):
swfPath = "ambiental.swf";
break;
case (atuacao):
swfPath = "atuacao.swf";
break;
case (contato):
swfPath = "contato.swf";
break;
}
carregaSwf(swfPath);
}
Assim ficas com isso bastante dinamico.
cc
#11
Publicado 20 de Janeiro de 2012 - 22:46
Código :
Posso conviver com ele sem problemas ou terá que ser corrigido?
#12
Publicado 20 de Janeiro de 2012 - 23:00
Mas o importante é que tenhas percebido a "ideia"!
carcleo, em 20 de Janeiro de 2012 - 22:46, disse:
Código :
Posso conviver com ele sem problemas ou terá que ser corrigido?
Nao sei bem o que possa estar a fazer isso, mas consegui perceber que o erro acontece qd se está a tentar carregar um swf que nao existe (produtos.swf por exemplo). Tens todos os swfs feitos?
cc
#14
Publicado 20 de Janeiro de 2012 - 23:07
Boa! mas o erro continua a dar no flash? Porque eu nao estou a ver qual possa ser o problema.
#15
Publicado 20 de Janeiro de 2012 - 23:12
Não deu erro online.
Agora vou testar como se comporta o envio do email.
Pocha, você é o "pai da paciencia" hein.
Obrigado pela ajuda.
Caso necessite de ajuda em php pode contar comigo.
Meu msn: carcleo1999@hotmail.com
skype; carcleo.
Deus te abençoe
#16
Publicado 20 de Janeiro de 2012 - 23:20
Isto é um forum aberto, e é sempre bom ter pessoas contribuindo!
vai passando por aqui, e se puderes, responde a dúvidas que outros possam ter.
Boa sorte no teu projecto, ta com bom aspecto
cumps,
cc
#17
Publicado 20 de Janeiro de 2012 - 23:32











