• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

carcleo

Sfw Externo. Fazendo Referencia ao Swf Principal via AS3

18 posts in this topic

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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:

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?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

:)

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now