Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Isaque Martins

Fazer referencia a objeto em um swf externo em as3

Recommended Posts

olá

 

to com uma dúvida aqui:

 

como faço referência à um objeto que está dentro de um swf externo

 

por exemplo: tenho dois swf's externos no msm palco, preciso que os botoes dentro de um deles faça eventos no outro e no palco...como me referencio?

 

tentei por Exemplo(essa ação coloquei dentro do swf q tem os botoes) Stage.mc_box_fot.addChild(carrega); //se eu n me engano no as2 era com _parent ou _root, deu esse erro (... e o retorno foi o msm (1119: Access of possibly undefined property mc_box_fot through a reference with static type Class.)

 

 

tambem tentei colocar a ação no action do palco assim:

 

mc_menu.botao1.addEventListener

 

não consigo fazer essa ligação ele sempre diz que o objeto é indefinido, seria com localconnetion? me de uma luz ai algum link, um tutorial

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isaque.

 

Uma prática comum que vejo entre os programadores é adicionar o objeto Loader ao stage.

 

Ao meu ver, o ideal é adicionar um callback onComplete ao Loader, e adicionar o loader.content ao stage. Dessa forma o swf externo passa a ser um MovieClip como qualquer outro, tendo todas as propriedades e métodos públicos acessíveis normalmente.

 

Segue um exemplo:

 

var movie:MovieClip;
var loader:Loader = new Loader();
loader.addEventListener("complete",onComplete);
loader.load(new URLRequest("externo.swf"));

function onComplete(evt:Event):void
{
 	loader.removeEventListener("complete",onComplete);
 	movie = loader.content as MovieClip;
 	movie.btn.addEventListener("click"onClick);
 	addChild(movie);
}

function onClick(evt:MouseEvent):void
{
 	trace("clique")
}

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Will pela ajuda mas não sei se compreendeu bem o q preciso fazer, eu não consegui entender como usar o callback, vou tentar me explicar melhor:

 

No 2.0 isso era uma coisa simples de se fazer, mais não faço idéia de como funciona no 3.0.

 

É o seguinte, vou tentar ser bem suscinto:

 

Tenho um palco(swf principal), q contém dois mc's(q carregam swf's externos)

 

mc_menu // q carrega um menu de fotos q contem fotos pequenas que ao serem clicadas abra a sua respctiva foto grande dentro do segundo mc.

 

mc_box // que é o mc que vai carregar a foto grande, q foi clicada la no swf externo menu_mc

 

1º onde coloco o códico do botao(da ft peq) q esta dentro do swf carregado no mc_menu? Coloco na timeline do swf externo q vai ser carregado ou coloco na timeline do swf principal que contém os dois swf's

 

2º que método eu uso no as3? qual o código que eu uso para que por ex: o botao foto1 que está dentro do swf externo faça com que carregue a foto 1 grande no outro mc chamado mc_box.

 

To quebrando a cabeça para trabalhar com níveis no as3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara.

 

Em AS3 o ideal é isolar os códigos dentro de cada objeto e controlar o comportamento deles de fora para dentro.

 

É mais fácil codificar isso para que entenda:

 

mc_menu

	static const SELECIONOU:String = "selecionou";
	var id:int;

	for(var i:int = 1; i <= 4; i++) // assumi que temos 4 boões dentro de mc_menu
		this["btn"+ i].addEventListener("click",onClick); // assumi que os botões têm instância btn1, btn2, btn3 e btn4

	function onClick(evt:Event):void
	{
		id = int(evt.target.name.substr(3)); // altera o id da seleção dentro do movie
		dispatchEvent(new Event(SELECIONOU)); // dispara um evento indicando que ocorreu uma seleção
	}

 

 

mc_box

	function load(id:int):void
	{
		var loader:Loader = new Loader();
		loader.addEventListener("complete",onComplete);
		loader.load(new URLRequest("foto"+ id + ".jpg")); // carrega imagem de acordo com o id recebido do parâmetro
	}


	function onComplete(evt:Event):void
	{
		evt.target.removeEventListener("complete",onComplete);
		addChild(evt.target.content as Bitmap); // adiciona a imagem ao movieClip
	}

Agora com os dois movies preparados, vamos controlar o comportamento de cada um:

 

controlador

	// assumi que mc_box e mc_menu já estão dentro do controlador

	mc_menu.addEventListener(mc_menu.SELECIONOU, onSelecionou); // adiciona um callback ao evento SELECIONOU
	
	function onSelecionou(evt:Event):void
	{
		mc_box.load(evt.target.id); // executa a função load contida em mc_box passando o id da seleção de mc_menu
	}

 

Perceba que os códigos dos movies secundários ficaram completamente isolados. Não referenciei nada ao parent, e não adicionei listeners a um child contido em outro child.

 

Seria possível colocar os listeners dos botões do menu a partir do controlador, porém não teríamos um código independente do outro. Isso dificulta muito o debug.

 

Espero que ajude. Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais uma vez obrigado Will

 

mas ficamos no quase de novo hehe,

 

me tira mais essa dúvida, fiz tudo como você falou mas ele a acusa o seguinte erro na seguinte linha do mc_menu:

 

static const SELECIONOU:String = "selecionou";

1012: The static attribute may be used only on definitions inside a class. ou seja,

1012: O atributo estático somente pode ser usado em definições dentro de uma classe. (acho q é isso)

 

Como faço pra usar esse atributo dentro de uma classe, não entendi muito bem esse erro seria uma classe externa ou eu poderia criar uma classe no próprio documento?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Will

 

o problema do

static const SELECIONOU:String = "selecionou";
ficou assim

const SELECIONOU:String = "selecionou";
não sei se fiz certo, pelo menos não acusou mais esse erro

 

mas agora tenho outro erro no output quando testo o swf principal

 

TypeError: Error #2007: O parâmetro type não deve ser nulo.

at flash.events::EventDispatcher/addEventListener()

at Galeriadefotos_fla::MainTimeline/frame1()

 

creio que seja com relação a seguinte linha

dispatchEvent(new Event(SELECIONOU));

como represento ela de outra forma?

tentei substituir essa linha por

var evento:Event = new Event(SELECIONOU);
	dispatchEvent(evento);

mas continuou dando o mesmo erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa.

 

Vamos lá. Tem alguns problemas no código que passei.

 

O teste é pra ser feito na timeline, mas por costume de programar em classes, acabei digitando o static. Como você fez, é só tirar mesmo.

 

Quanto ao erro, o problema é que não é mais uma constante static. :P

 

Troque a linha:

mc_menu.addEventListener(mc_menu.SELECIONOU, onSelecionou);

 

Por essa:

mc_menu.addEventListener("selecionou", onSelecionou);

Veja se rola agora.

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Will, não tenho erro nenhum mais no output

 

mas ainda não funcionou, apenas não acontece nada...pelo menos to aprendendo devagarinho

 

Deixa eu ver se entendi, neste caso o dispatchEvent envia para o controlador a constante SELECIONOU, que por sua vez corresponde à string "selecionou", correto?

 

então eu estou enviando através do dispatchEvent apenas a string "selecionou", e onde está indo a id que corresponderia ao numero de cada botao.

 

outra dúvida lá no controlador eu tenho a ouvinte do método dispatchEvent, e tenho como primeiro parametro a string "selecionou"

mc_menu.addEventListener("selecionou", onSelecionou);
me explica aí como funciona isso

 

de qualquer forma não entendi onde está sendo passado o id (que deve conter o numerorespctivo de cada botao) do mc_menu para ocontrolador...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.