Ir para o conteúdo
carcleo

Sfw Externo. Fazendo Referencia ao Swf Principal via AS3

Mensagens Recomendadas

carcleo    5
carcleo

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
carcleo    5
carcleo

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
carcleo    5
carcleo

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
carcleo    5
carcleo

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
carcleo    5
carcleo

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
carcleo    5
carcleo

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
coxosclassic    4
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Lilianeleila    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade