Carlos Rocha Posted January 20, 2012 at 05:07 PM Report Share #433795 Posted January 20, 2012 at 05:07 PM Boas pessoal! 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 Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 06:53 PM Report Share #433814 Posted January 20, 2012 at 06:53 PM boas Carlos, bemvindo ao forum! 🙂 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: var t:MovieClip = MovieClip(root); 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 07:14 PM Author Report Share #433824 Posted January 20, 2012 at 07:14 PM Boas. Meu swf principal tem um menu lá que, pelo clik dos botoes, dispara a função clike que é assim(para cada botão): stop(); // 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: http://www.gapde.com.br/bb.png E o codigo do frame do meio é: stop(); //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: import flash.display.MovieClip; 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? Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 07:28 PM Report Share #433827 Posted January 20, 2012 at 07:28 PM que valor te da o trace que tens na ultima funcao 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); // QUE APARECE? addChild(carrega); play(); } } esse container que estas a tentar encontrar, é o container do swf que queres remover? se sim, tenta usar: 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); 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 07:35 PM Author Report Share #433830 Posted January 20, 2012 at 07:35 PM Esperimentei colocar o teu codigo e veja no que dá: Dá o mesmo. Se puder, baixe meus fontes e de uma olhada onde estou errando http://www.gapde.com.br/aa.zip Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 08:43 PM Report Share #433855 Posted January 20, 2012 at 08:43 PM Nao estas a acessar ao container correctamente: trace(MovieClip(root).container); // MOSTRA UNDEFINED ( Experimenta antes: trace(MovieClip(root).parent); // MOSTRA [object MovieClip] ... na tua funcao "completo" do swf atuacao, e has-de reparar que ja tens acesso ao "container" 🙂 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 09:36 PM Author Report Share #433865 Posted January 20, 2012 at 09:36 PM Pois é. Mas o parent, neste caso, não seria o MC conainer? Do jeito que voce mandou deu esse erro na linha que substitui: SecurityError: Error #2000: Não há contexto de segurança ativo. [object Loader] Outra coisa. 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. Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 10:01 PM Report Share #433872 Posted January 20, 2012 at 10:01 PM Mas o parent, neste caso, não seria o MC conainer? ... Exacto. Essa é uma das maneiras mais simples de aceder. mas se queres especificamente aceder ao container, faz: var f:MovieClip = MovieClip(root).parent.root as MovieClip //ISTO É O ROOT GERAL trace(f.container) //MOSTRA [object MovieClip] Vai dar ao mesmo. Do jeito que voce mandou deu esse erro na linha que substitui: 1084: Syntax error: expecting rightparen before semicolon. Deves ter um parentisis em falta ai no teu codigo (eu estou a testar aqui, e tou sem erros). A tua funcao completo deverá ser algo assim: function completo(evt:Event):void { 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": function carregaSwf( url:String ):void { link=new URLRequest(url); mcCarrega.gotoAndPlay(2); } Depois no swf atuacao (ou qq outro): function clique(evt:MouseEvent):void { 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 10:05 PM Author Report Share #433874 Posted January 20, 2012 at 10:05 PM pois é, mas essa função deverá ser colocada no timelime palco principal ou na timeline do mcCarrega? Pois eu ja tenho isso lá: // 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); } Não seria a mesma coisa? Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 10:26 PM Report Share #433883 Posted January 20, 2012 at 10:26 PM pois é, mas essa função deverá ser colocada no timelime palco principal ou na timeline do mcCarrega? A funcao seria colocada no timeline palco principal na scene Site Não seria a mesma coisa? Não é bem a mesma coisa.. 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: function carregaSwf( url:String ):void { link=new URLRequest(url); mcCarrega.gotoAndPlay(2); } Funcao para definir (internamente) o swf a carregar: function clique(evt:MouseEvent):void { 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 10:46 PM Author Report Share #433890 Posted January 20, 2012 at 10:46 PM Bom, esta abrindo o outro swf externo e fechando o que estava aberto certinho, mas, no Output (saida) esta dando esse erro: SecurityError: Error #2000: Não há contexto de segurança ativo. Posso conviver com ele sem problemas ou terá que ser corrigido? Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 11:00 PM Report Share #433898 Posted January 20, 2012 at 11:00 PM Boa! 🙂 Mas o importante é que tenhas percebido a "ideia"! ...no Output (saida) esta dando esse erro: SecurityError: Error #2000: Não há contexto de segurança ativo. Posso conviver com ele sem problemas ou terá que ser corrigido? hmmm... por acaso tb tou com esse erro. Isso provavelmente ira dar erro quando colocares o site online.. 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 11:03 PM Author Report Share #433900 Posted January 20, 2012 at 11:03 PM http://www.gapde.com.br/aa Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 11:07 PM Report Share #433902 Posted January 20, 2012 at 11:07 PM 🙂 Boa! mas o erro continua a dar no flash? Porque eu nao estou a ver qual possa ser o problema. Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 11:12 PM Author Report Share #433906 Posted January 20, 2012 at 11:12 PM Não. 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 Link to comment Share on other sites More sharing options...
coxosclassic Posted January 20, 2012 at 11:20 PM Report Share #433912 Posted January 20, 2012 at 11:20 PM 🙂 obrigado! 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 Cumps, cc Link to comment Share on other sites More sharing options...
Carlos Rocha Posted January 20, 2012 at 11:32 PM Author Report Share #433915 Posted January 20, 2012 at 11:32 PM obrigado Link to comment Share on other sites More sharing options...
Lilianeleila Posted August 24, 2013 at 12:45 AM Report Share #522549 Posted August 24, 2013 at 12:45 AM Boas! Tenho dúvida de como trabalhar com dois swf com movieclip. Como fazer com que o raiz.swf com o seu botão acione o gemeo.swf e o próprio raiz.swf seja removido(descarregado) com removeChild e vice-versa via AS3 ? É como se um saísse da memória dando lugar a outro através de botão. Diferente do addChild que carrega um swf e sobrepõe o outro. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now