Ir para conteúdo

Arquivado

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

Evandro PH

[Flash] com reaproveitamento de código AS3

Recommended Posts

Olá, estou tendo um pequeno problema com reaproveitamento de código fonte, e tendo que repetir em vários locais, gostaria de ajuda se puderem...
Explicando o problema:
estou desenvolvendo um sisteminha em flash onde o usuário escolhe uma figura em uma lista, e após disso ele pode personalizar as cores dessa figura, através de uma tabela básica de cores. são 24 cores, que criei o botão para elas e defini a cor específica de cada um botão nomeado de b1,b2,b3... usando array:

var btts:Array = [b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24];
var set_colors:Object = {'b1':0x000000, 'b2':0x333333, 'b3':0x666666, 'b4':0x999999, 'b5':0xCCCCCC, 'b6':0xEEEEEE, 'b7':0xFF0000, 'b8':0x663300, 'b9':0x333300, 'b10':0x006600, 'b11':0x006666, 'b12':0x003399, 'b13':0x0033FF, 'b14':0x3366FF, 'b15':0x6633FF, 'b16':0xCC6699, 'b17':0x996666, 'b18':0xFF9966, 'b19':0xFFCC00, 'b20':0xFF99CC, 'b21':0xFF33CC, 'b22':0x990066, 'b23':0xFF0099, 'b24':0x663366};

 

Após definir os botões e cores de cada um, fiz um loop para adicionar o evento aos botões:

for(var i:int=0; i<btts.length; i++) {
  obj_color.color = set_colors[btts[i].name];
  btts[i].transform.colorTransform = obj_color;
  btts[i].addEventListener(MouseEvent.CLICK, changeColor);
}

 

Após os botões, coloquei a figura e transformei cada "parte" dela em um MovieClip, ficando: mc1, mc2, mc3...
Logo abaixo, a criação das variáveis que serão usadas no AS:

var obj_color:ColorTransform = new ColorTransform();
var item:MovieClip = MovieClip(mc1); //onde mc1 é uma parte da figura que será mudara a cor

 

E logo após a function que faz a troca da cor da figura:

function changeColor(evt:Event):void
{
  var b_name = evt.target.name;
  obj_color.color = set_colors[b_name];
  item.transform.colorTransform = obj_color;
}

 

Até aí tudo certo, tudo funciona...
Mas a hora de eu selecionar a "outra parte" que quero alterar a cor, não consigo fazer uma function genérica que eu consiga reutilizar para todos os MCs (mc1, mc2...)
então tive que fazer assim:

mc1.addEventListener(MouseEvent.CLICK, mudaClipe1);
mc2.addEventListener(MouseEvent.CLICK, mudaClipe2);
mc3.addEventListener(MouseEvent.CLICK, mudaClipe3);
mc4.addEventListener(MouseEvent.CLICK, mudaClipe4);
mc5.addEventListener(MouseEvent.CLICK, mudaClipe5);
mc6.addEventListener(MouseEvent.CLICK, mudaClipe6);
function mudaClipe1(event:MouseEvent):void { item = MovieClip(mc1); }
function mudaClipe2(event:MouseEvent):void { item = MovieClip(mc2); }
function mudaClipe3(event:MouseEvent):void { item = MovieClip(mc3); }
function mudaClipe4(event:MouseEvent):void { item = MovieClip(mc4); }
function mudaClipe5(event:MouseEvent):void { item = MovieClip(mc5); }
function mudaClipe6(event:MouseEvent):void { item = MovieClip(mc6); }

 

O problema é que tem uma figura com mais de 20 partes, e eu queria um comando genérico que entendesse que o último MC clicado seria o que teria a cor alterada...
Tentei armazenar numa variável, ou alterar o valor da variável 'item' definida lá no início, mas não está funcionando...
Algum help?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você precisa é disso:

function inicializaBotoes():void {
    // btts.length representa a quantidade de mc que você tem
    // se o numero de mc não for igual ao numero dos objetos que estão no array btts
    // você tem que alterar isso no for trocando o btts.length pelo numero de mc.
    for (var i:int = 0; i < btts.length; i++) {
        this["mc" + i].addEventListener(MouseEvent.CLICK, mudaClipe);
    }
}

function mudaClipe(e:MouseEvent):void {
    // você pode utilizar o e.target para fazer referência ao mc clicado
    item = MovieClip(e.target);
}

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou, somente fiz uma pequena alteração no "for", que deve criar um evento para cada MC, e a inclusão de uma array com o nome dos MCs (embora eu só precise dizer a quantidade...), ficou assim:

 

var mcs:Array {mc1, mc2, mc3, mc4}
for (var i:int = 0; i < mcs.length; i++) {
// o resto ficou igual

 

 

Muito obrigado pela ajuda Marcos!

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.