Ir para conteúdo

POWERED BY:

Arquivado

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

jonathan_toledo

Criar funçoes dinamicamente

Recommended Posts

tenho um banner com uma transição de imagens, e do lado direito as miniaturas em forma de menu, todas as imagens estao sendo carregadas de um xml para dentro de movieClips criados dinamicamente, como faço para criar funçoes de clique dinamicamente para esses movieClips, sem ter que criar uma por uma.

 

 

 

 

Exemplo:

 

_MC_ = new Vector.<MovieClip>(10);

for (var i=0; i<10; i++) {
_MC_[i] = new MovieClip();
addChild(_MC_[i]);
}

 

 

Quero fazer do mesmo jeito mas com funções do tipo:

 

for (var i=0; i<10; i++) {
nomedobotao[i].addEventListener(MouseEvent.CLICK, clique);
function clique (evt:MouseEvent):void {
	<---comandos--->
}
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não compreendi sua dúvida claramente uma vez que você mesmo citou a resposta.

_MC_ = new Vector.<MovieClip>(10);

for (var i:uint; i < 10; i++) {
_MC_[i] = new MovieClip();
addChild(_MC_[i]);
_MC_[i].addEventListener(MouseEvent.CLICK, _mcClickHandler);
}

function _mcClickHandler(e:MouseEvent):void
{
// ações aqui
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Problema é que este laço não funciona, ele cria mesmo as funções só que todas terão a mesma ação por causa do nome da função...

 

o que eu queria mesmo era um tipo de vetor de funções onde cada uma fosse diferente da outra.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você sempre tem diversas formas de fazer a mesma coisa. Eu, no seu lugar, usaria a orientação a objeto: Ao invés de usar MovieClips, eu criaria uma nova classe de objeto contendo as propriedades necessárias para a navegação dos seus slides. Em seguida, utilizaria uma única função que acessaria as propriedades do objeto criado.

 

Em um arquivo externo nomeado de Miniatura.as.

package
{
import flash.display.Sprite
import flash.net.URLRequest;

public class Miniatura extends Sprite
{
	public var urlImagem:URLRequest;
	public var descricao:String;
}
}

 

No seu filme principal:

import flash.net.URLRequest;
import flash.events.MouseEvent;

var miniaturas:Vector.<Miniatura> = new <Miniatura>[mc1, mc2];

for each (var m:Miniatura in miniaturas) {
m.urlImagem = new URLRequest('...');
m.descricao = '...';
m.addEventListener(MouseEvent.CLICK, mClickHandler);
}

function mClickHandler(e:MouseEvent):void
{
var m:Miniatura = Miniatura(e.currentTarget);
trace(m.descricao, m.urlImagem.url)
}

 

Outra alternativa seria "anexar" as funções utilizando o laço:

import flash.display.MovieClip;
import flash.events.MouseEvent;

var mcs:Vector.<MovieClip> = new <MovieClip>[mc1, mc2];
var funcoes:Vector.<Function> = new <Function>[mc1ClickHandler, mc2ClickHandler];

for (var i:uint; i < mcs.length; i++) {
mcs[i].addEventListener(MouseEvent.CLICK, funcoes[i]);
}

function mc1ClickHandler(e:MouseEvent):void
{
trace('mc1');
}

function mc2ClickHandler(e:MouseEvent):void
{
trace('mc2');
}

 

E ainda outra alternativa: armazenar as propriedades em objetos Vector separados e acessá-los com o auxílio de um Dictionary.

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.utils.Dictionary;

var mcs:Vector.<MovieClip> = new <MovieClip>[mc1, mc2];
var indexes:Dictionary = new Dictionary();
var urlRequest:Vector.<URLRequest> = new <URLRequest>[new URLRequest('...'), new URLRequest('...')];
var descricao:Vector.<String> = new <String>['...', '...'];

for (var i:uint; i < mcs.length; i++) {
indexes[mcs[i]] = i;
mcs[i].addEventListener(MouseEvent.CLICK, mcClickHandler);
}

function mcClickHandler(e:MouseEvent):void
{
var mc:MovieClip = MovieClip(e.currentTarget);
var index:uint = indexes[MovieClip(e.currentTarget)];
trace(descricao[index], urlRequest[index].url);
}

 

Assim como citei acima, minha indicação é, obviamente, o uso da primeira solução apresentada: Programação Orientada a Objeto. Organização sempre.

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.