Jump to content

Sfw Externo. Fazendo Referencia ao Swf Principal via AS3


Carlos Rocha

Recommended Posts

Carlos Rocha

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 post
Share on other sites
coxosclassic

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 post
Share on other sites
Carlos Rocha

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?

Link to post
Share on other sites
coxosclassic

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 post
Share on other sites
coxosclassic

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 post
Share on other sites
Carlos Rocha

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 post
Share on other sites
coxosclassic

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 post
Share on other sites
Carlos Rocha

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 post
Share on other sites
coxosclassic

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 post
Share on other sites
Carlos Rocha

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 post
Share on other sites
coxosclassic

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 post
Share on other sites
Carlos Rocha

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 post
Share on other sites
coxosclassic

:) 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 post
Share on other sites
  • 1 year later...
Lilianeleila

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 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
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.