Ir para conteúdo


Revista PROGRAMAR – Edição 46 (Setembro 2014): Download já disponível!

- - - - -

Sfw Externo. Fazendo Referencia ao Swf Principal via AS3


  • Por favor inicie sessão para responder
17 respostas a este tópico

#1 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 20 de Janeiro de 2012 - 18:07

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

#2 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 20 de Janeiro de 2012 - 19:53

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:

Código (ActionScript):
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

#3 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 20 de Janeiro de 2012 - 20:14

Boas.

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):
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:
Imagem Colocada

E o codigo do frame do meio é:
Código (ActionScript):
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:

Código (ActionScript):
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?

#4 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 20 de Janeiro de 2012 - 20:28

que valor te da o trace que tens na ultima funcao clique?:

Código (ActionScript):
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:
Código (ActionScript):
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

#5 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 20 de Janeiro de 2012 - 20:35

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

#6 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 20 de Janeiro de 2012 - 21:43

Nao estas a acessar ao container correctamente:
Código (ActionScript):
trace(MovieClip(root).container); // MOSTRA UNDEFINED :)(

Experimenta antes:
Código (ActionScript):
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

#7 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 20 de Janeiro de 2012 - 22:36

Pois é.

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 :
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.

#8 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 20 de Janeiro de 2012 - 23:01

Ver Mensagemcarcleo, em 20 de Janeiro de 2012 - 22:36, disse:

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:
Código (ActionScript):
var f:MovieClip = MovieClip(root).parent.root as MovieClip //ISTO É O ROOT GERAL
trace(f.container) //MOSTRA [object MovieClip]
Vai dar ao mesmo.

Ver Mensagemcarcleo, em 20 de Janeiro de 2012 - 22:36, disse:

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:
Código (ActionScript):
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":
Código (ActionScript):
function carregaSwf( url:String ):void
{
        link=new URLRequest(url);
        mcCarrega.gotoAndPlay(2);
}

Depois no swf atuacao (ou qq outro):
Código (ActionScript):
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

#9 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 20 de Janeiro de 2012 - 23:05

pois é, mas essa função deverá ser colocada no timelime palco principal ou na timeline do mcCarrega?

Pois eu ja tenho isso lá:
Código (ActionScript):
// 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?

#10 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 20 de Janeiro de 2012 - 23:26

Ver Mensagemcarcleo, em 20 de Janeiro de 2012 - 23:05, disse:

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

Ver Mensagemcarcleo, em 20 de Janeiro de 2012 - 23:05, disse:

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:
Código (ActionScript):
function carregaSwf( url:String ):void
{
        link=new URLRequest(url);
        mcCarrega.gotoAndPlay(2);
}

Funcao para definir (internamente) o swf a carregar:
Código (ActionScript):
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

#11 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 20 de Janeiro de 2012 - 23:46

Bom, esta abrindo o outro swf externo e fechando o que estava aberto certinho, mas, no Output (saida) esta dando esse erro:

Código :
SecurityError: Error #2000: Não há contexto de segurança ativo.

Posso conviver com ele sem problemas ou terá que ser corrigido?

#12 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 21 de Janeiro de 2012 - 00:00

Boa!  :)
Mas o importante é que tenhas percebido a "ideia"!

Ver Mensagemcarcleo, em 20 de Janeiro de 2012 - 23:46, disse:

...no Output (saida) esta dando esse erro:

Código :
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

#13 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 21 de Janeiro de 2012 - 00:03

http://www.gapde.com.br/aa

#14 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 21 de Janeiro de 2012 - 00:07

:)
Boa! mas o erro continua a dar no flash? Porque eu nao estou a ver qual possa ser o problema.

#15 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 21 de Janeiro de 2012 - 00:12

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

#16 coxosclassic

coxosclassic

    Try-Catch User

  • Moderador
  • PipPipPipPip
  • 424 mensagens

Publicado 21 de Janeiro de 2012 - 00:20

:) 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

#17 carcleo

carcleo

    CRLF

  • Membro
  • PipPipPipPipPip
  • 605 mensagens

Publicado 21 de Janeiro de 2012 - 00:32

obrigado

#18 Lilianeleila

Lilianeleila

    null

  • Novo Membro
  • Pip
  • 4 mensagens

Publicado 24 de Agosto de 2013 - 01:45

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.