Ir para conteúdo

Arquivado

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

Elektra

Obter índices de mc em Grid, ao completar o Array chamar uma função

Recommended Posts

Atualmente obtenho o índice ao carregar os objetos do Array.

 

Preciso verificar se todas as instâncias executaram a Tween para depois chamar uma nova função.

 

O contador funciona, desde que o movimento do mouse sobre os mcs seja lento, ou seja, inadequado.

 

Não estou sabendo como obter o índice ou name do objeto com MOUSE_OVER em um Grid.

Penso que seja necessário identificar se todos os objetos do Array chamaram a Tween, e no total, vigésimo, utilizar MOTION_FINISH para chamar outra função.

 

Agradeço alguma orientação.

 

 

import flash.display.MovieClip;
import flash.events.MouseEvent;
import com.greensock.TweenMax;

stop();

var cont:uint = 0;
var boxs:Array = new Array();

for (var i:int =0; i<4; i++){

for (var j:int =0; j<5; j++){

	var box:MyMovie= new MyMovie();

	addChild(box);									

	box.x = i * 70;			
	box.y = j * 70;

	box.buttonMode = true;

	boxs.push(box);

	trace(boxs.indexOf(box) + 1);


	box.addEventListener(MouseEvent.MOUSE_OVER, anima);		
}
}

function anima(e:MouseEvent):void {

var boxGrid = e.target as MovieClip;

TweenMax.to(boxGrid, .5,{autoAlpha: 0});


cont++;
trace(cont);

if(cont == 20){		
gotoAndStop(2);
}

}

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Elektra

 

se eu entendi bem o que você esta tentando fazer, é que depois depassar o mouse sobre todos os 20 movieClips,

é para ir para o frame 2, certo?

 

se for, para que a contagem fique correta, acho que você teria que remover o listenner depois que passar

o mouse da primeira vez, para não executar de novo

 

function anima(e:MouseEvent):void {

       var boxGrid = e.target as MovieClip;
       boxGrid.removeEventListener(MouseEvent.MOUSE_OVER, anima); 

       TweenMax.to(boxGrid, .5,{autoAlpha: 0});


       cont++;
       trace(cont);

       if(cont == 20){         
          gotoAndStop(2);
       }

}

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada Eder, já tinha feito isso (removi ao postar) mas não resolve.

 

Na verdade usei:

 

box.removeEventListener(MouseEvent.MOUSE_OVER, anima);

 

Mesmo lentamente, deixa um mc na tela (inferior, à direita).

 

Arquivo com o 'remove' >> Clique aqui

 

Já pensei em remover o listener ao chamar a Tween, e devolver com onComplete, mas talvez fique lento. Nesse caso, acho que dava pra dispensar o contador. O autoAlpha é pra facilitar, provisório.

Menos que .5 deixa a transição dura.

 

Por isso tento descobrir outra forma de verificação, gostaria de usar este grid como uma máscara.

Chamar o frame 2 é apenas em um arquivo de teste.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

A forma correta usando OO seria assim (eu usaria hasmap e pode ser um tanto mais trabalhosa):

 

public class MyMovie extends MovieClip{
        public var done:boolean = false;
       [...]
}

 

 


function anima(e:MouseEvent):void {

       var boxName = (e.target as MyMovie).name;
       var boxGrid:MyMovie = boxMap.get(boxName);
       boxGrid.done = true;

       boxGrid.removeEventListener(MouseEvent.MOUSE_OVER, anima); 
       TweenMax.to(boxGrid, .5,{autoAlpha: 0});
       boxMap.put(boxGrid.name,boxGrid);
       checkGrid();
}

function checkGrid():void{
       var allDone:boolean = true;
       for(tempBoxName:String in boxMap.keyset){
               if(!boxMap.get(tempBoxName).done){
                       allDone = false;
               }
       }
       if(allDone){
       {
               gotoAndStop(2);
       }
}

 

Eu soh nao lembro se era mesmo obrigatório atualizar o item do hashmap rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Elecktra]

 

realmente, add o listenner antes do tween e remover depois ficaria bem ruim,

assim com contador já esta bom

 

 

estranho mesmo o quadrado ficar ali embaixo, e sempre acontece depois que ele foi para o segundo frame,

 

tenta fazer o seguinte, troca o MOUSE_OVER por ROLL_OVER

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ Irineu

 

Se você se enrolou, imagina eu. Não domino action, e sei o básico de OOP. :lol:

 

Estou estudando, tenho muito chão pela frente.

 

Não precisa ser algo perfeito, mas faço questão de compreender o que estou fazendo.

 

Obrigada pela atenção assim mesmo.

 

 

 

 

@ Eder

 

Testei com o ROLL_OVER, no add e remove Listener, deu na mesma.

O quadrado malvado só é removido se for o primeiro a ser acionado.

 

O contador não resolve.

 

Tenho exemplo de adicionar um 'name' para os objetos de um menu com um for.

 

for(var i:uint = 0; i < btnNum; i++){
btn = new Btn();
btn.name = "button" + (i + 1);
...	
}

function onTraceName(evt:MouseEvent):void {
	trace(evt.target.name);
}

 

 

Em um Array com imagens posso recuperar a url.

Mas não sei como fazer isso com um for dentro de outro for para montar o grid usando instâncias.

Esse é o 'ó' do borogodó.

 

Pode haver outra forma mais adequada, mas foi o que me ocorreu para obter a validação, identificar pelo índice ou name dos objetos se todos executaram a Tween.

 

Como é que eu vou fazer isso já são outros 500 (... largo a bomba pro Irineu) ahahahhhh :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com esse código que você está usando até dá pra fazer, mas só por meio de gambiarras... Isso se, através da sua classe, não for possível você monitorar o alpha do MC no momento em que o efeito for aplicado...

 

...

Mas não sei como fazer isso com um for dentro de outro for para montar o grid usando instâncias.

Esse é o 'ó' do borogodó.

 

Se for mesmo basta adicionar mais uma variável para te auxiliar na atribuição de nome aos mcs...

 

Ex.:

 

var cont:uint = 0;
var boxs:Array = new Array();
var aux:int = 0;

for (var i:int =0; i<4; i++){

       for (var j:int = 0; j<5; j++){

               var box:MyMovie= new MyMovie();

			box.name = "meuMc"+aux; 
			aux++;
               addChild(box);                                                                  

               box.x = i * 70;                 
               box.y = j * 70;

               box.buttonMode = true;

               boxs.push(box);



               box.addEventListener(MouseEvent.MOUSE_OVER, anima);             
       }
}

 

O que você quer, penso eu, seria +/- isso:

 

var cont:uint = 0;
var boxs:Array = new Array();
var aux:int = 0;
for (var i:int =0; i<4; i++){

       for (var j:int = 0; j<5; j++){

               var box:MyMovie= new MyMovie();

			box.name = "meuMc"+aux; 
			aux++;
               addChild(box);                                                                  

               box.x = i * 70;                 
               box.y = j * 70;

               box.buttonMode = true;

               boxs.push(box);



               box.addEventListener(MouseEvent.MOUSE_OVER, anima);             
       }
}

function anima(e:MouseEvent):void {

       var boxGrid = e.target as MovieClip;

	  efeito( boxGrid );
      // TweenMax.to(boxGrid, .5,{autoAlpha: 0});


       cont++;
       trace(boxGrid.name);

       if(cont == 20){         
       trace("->"+cont);
       }

}

function efeito( mc:MovieClip ){

mc.addEventListener( 'enterFrame', alphaFunc );

}

function alphaFunc( e:Event ){

	if( e.target.alpha <= 0 ){

		e.target.removeEventListener( "enterFrame", alphaFunc );


	} else {//O segredo está aqui...

		e.target.removeEventListener( MouseEvent.MOUSE_OVER, anima);
		e.target.alpha -= 0.1;

	}

}

 

 

Teste e conte-nos o resultado...

 

Bom feriadão, :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada pela atenção Roger.

 

Bem, agora obtenho um 'name', mas penso que a intenção era mostrar em output a String 'meuMc' + o valor adicionado pela variável auxiliar.

 

O que visualizo é 'instance2', 'instance5' ... 'instance38', parece algo aleatório.

 

Se adiciono o 'gotoAndPlay(2)' entre as chaves do if, dá bug geral. Replica os mcs antes de remover todos.

 

if(cont == 20){         
       trace("->"+cont);
//gotoAndPlay(2);
}

 

Pelo que compreendi, você chamou a função 'efeito', definiu o parâmetro 'mc', e verifica se ainda ocorrerá a animação em 'alphaFunc'.

 

efeito( boxGrid );

function efeito( mc:MovieClip ){

       mc.addEventListener( 'enterFrame', alphaFunc );

}

 

Meu conhecimento atual ainda não alcança essa forma resumida de declarar com uso de Strings. O trace idem. Vi 1 ou 2 codes assim, nunca usei.

 

Então, abusando bem pouquinho (100% Flash_lover :love: ), agradeço muito se puder 'traduzir'. Será realmente útil pra mim.

 

Quanto a variável auxiliar pensei em algo semelhante. Tinha imaginado criar um novo Array vazio e popular com os 'names' ou 'índices' obtidos pelo mouse_over, e verificar se atingiam o valor '20', ou talvez, igualar ao Array inicial, só não sabia como.

 

Vou estudar sua sugestão, certamente é o caminho. Nada urgente, isso é idéia que alimento há algum tempo, eu chego lá.

 

Furungando, pesquisando, ralando um bocado e atormentando as orelhas dos amigos mais experientes, sempre se aprende.

 

 

Abraços :grin:

 

 

Excelente feriado pra você também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada pela atenção Roger.

 

Bem, agora obtenho um 'name', mas penso que a intenção era mostrar em output a String 'meuMc' + o valor adicionado pela variável auxiliar.

 

O que visualizo é 'instance2', 'instance5' ... 'instance38', parece algo aleatório.

 

Se você copiar o código que eu te passei, ele faz exatemente isso... Mas é aqui que você você pega o name do mc:

 

trace(boxGrid.name);

 

Pelo que compreendi, você chamou a função 'efeito', definiu o parâmetro 'mc', e verifica se ainda ocorrerá a animação em 'alphaFunc'.

 

Exatamente isso... Explicar, seria quase que repetir o que você falou :)

 

Só acrescentando, o que faz a diferença e que evita que o contador fique incrementando erradamente, foi, sempre que o mc disparar o evento 'MOUSE_OVER' eu remover o evento:

 

e.target.removeEventListener( MouseEvent.MOUSE_OVER, anima);

 

(existe outras formas também sem precisar remover o evento, mas não vejo necessidade...)

 

Quanto a variável auxiliar pensei em algo semelhante. Tinha imaginado criar um novo Array vazio e popular com os 'names' ou 'índices' obtidos pelo mouse_over, e verificar se atingiam o valor '20', ou talvez, igualar ao Array inicial, só não sabia como.

 

Da forma como você está querendo fazer, fica meio que como uma gambiarra... O ideal seria que sua classe possuisse um método para monitorar o efeito aplicado... Por isso que criei minha função personalizada para aplicar o tipo de efeito que eu desejar e poder ter controle sobre o efeito...

 

Tente novamente, como falei... Qualquer coisa é só falar...

 

Abs,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Buenas, digitei 'gotoAndPlay(2)'. Bugou né! Cansaço honesto, peço desculpas pela desatenção.

 

Foi simples de entender o uso das Strings no add/removeListener, obtive o 'box.name' ao carregar o grid, equivalente a >> trace(boxs.indexOf(box) + 1).

 

box.name = "meuMc"+ (aux + 1); 
aux++;
trace(box.name); // output >> meuMc1...meuMc20

 

Por enquanto, a função alphaFunc tem comportamento idêntico ao code inicial, com 'cont == 20', sem o 'remove'.

 

Ainda não descobri como criar uma verificação para que o 'gotoAndStop(2)' seja executado somente depois que todos os objetos forem removidos do stage.

 

Nenhuma disposição para gambi ao pensar em outro Array, 'delírio' de quem está começando e nunca viu nada semelhante. (off: hoje pensei também no potencial do hitTest) GOD SAVE THE QUEEN!

 

Obrigada Roger, tô na luta (largar o osso??? ... nem pensar).

 

 

Abraços :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por enquanto, a função alphaFunc tem comportamento idêntico ao code inicial, com 'cont == 20', sem o 'remove'.

 

Ainda não descobri como criar uma verificação para que o 'gotoAndStop(2)' seja executado somente depois que todos os objetos forem removidos do stage.

 

Mas o código que eu te passei faz exatamente isso... rss

 

Teste de novo para você ver...

 

Bom, mas se é o que está faltando, basta colocar o gotoAndPlay dentro da condição:

 

if( cont == 20 ){

gotoAndPlay( 2 );

}

 

Abs,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é isso Roger. O 'gotoAndStop(2)' está no lugar devido.

 

A questão é que ao mover o mouse mais rápido não impede que vá para o frame 2 sem remover todos os objetos na tela.

 

Ou seja, o cont ainda ultrapassa 20. Clique aqui

 

 

Mas não vou ficar alugando você, aprender a estruturar o code de forma mais eficiente, adicionar name aos mcs e usar Strings está ótimo. Agradeço muito pela generosidade.

 

O resto, é conhecimento que me falta adquirir.

 

 

Grande abraço :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa, não acredito que só agora é que eu vim compreender o real problema... rss

 

ah, mas aí é bem tranquilo também...

 

Teste isso agora:

stop();

var boxs:Array = new Array();
var aux:int = 0;

for (var i:int =0; i<4; i++){

       for (var j:int = 0; j<5; j++){

               var box:MyMovie= new MyMovie();

                               box.name = "meuMc"+aux; 
                               aux++;
			boxs.push( box );
               addChild(box);                                                                  

               box.x = i * 70;                 
               box.y = j * 70;

               box.buttonMode = true;                
               box.addEventListener(MouseEvent.MOUSE_OVER, anima);

       }
}

function anima(e:MouseEvent):void {

       var boxGrid = e.target as MovieClip;

       efeito( boxGrid );
      // TweenMax.to(boxGrid, .5,{autoAlpha: 0});                
       trace(boxGrid.name);

}

function efeito( mc:MovieClip ){

       mc.addEventListener( 'enterFrame', alphaFunc );

}

function alphaFunc( e:Event ){

               if( e.target.alpha <= 0 ){

               e.target.removeEventListener( "enterFrame", alphaFunc );

var contador:int = 0;

for( var i:int = 0; i < boxs.length; i++ ){

	if( boxs[ i ].alpha <= 0 ){

	contador++;//Pra garantir que todos os boxs foram checados...
	( contador == boxs.length )? gotoAndStop(2):"";

       }

};

               } else {

                       e.target.removeEventListener( MouseEvent.MOUSE_OVER, anima);
                       e.target.alpha -= 0.1;

               }

       };

Compartilhar este post


Link para o post
Compartilhar em outros sites

:no: ... mas reconheço que estou no lucro.

 

 

Tive uma aula de mestre que irá me auxiliar imensamente.

 

 

Preciso trabalhar as idéias, tentar fazer a minha parte.

 

Talvez ativar a anima em grupos de mcs com um delay facilite a vida.

 

Nenhum cliente atormentando, é só estudo mesmo. Sei que tem suas ocupações.

 

 

Muito obrigada Roger! Tudo de bom pra você. :clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:no: ... mas reconheço que estou no lucro.

 

Não entendi... Você quis dizer que não funcionou ou que não era bem isso que você queria? rss

 

Nenhum cliente atormentando, é só estudo mesmo. Sei que tem suas ocupações.

 

Eu sei, mas tranquilo... É, agora, como acabou o feriado, vou dar uma sumidinha do imasters...

 

Mas quando der eu apareço de novo.... :)

 

Muito obrigada Roger! Tudo de bom pra você.

 

Obrigado, tudo de bom pra você também...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Remove os mcs mas não vai para o frame 2.

...

 

Ops, então você deve estar fazendo alguma coisa de errado pois o código está certinho... :)

 

Sugiro você criar um novo .fla e testar novamente...

 

Abs,

Compartilhar este post


Link para o post
Compartilhar em outros sites

êeeeee :clap: ... Valeu pela disposição Roger, eu já estava sem jeito (santa chacoalhada).

 

Usei o mesmo arquivo inicial, renomeado a cada modificação, tinha o mc exportado (MyMovie) com outro mc aninhado (stop no frame 1 e 20 + tween). Claro que o mc aninhado eu vi pela library, mas não lembrava da tween.

 

Nos testes anteriores não interferiu, mas neste, travou. Por isso eu não conseguia obter o trace(contador), nem por decreto.

Removi o que estava aninhado, e foi na boa.

 

Entendi a verificação que você criou. Vai render muito estudo, coisa boa.

O contador reinicia de '1' a cada mc acionado, nunca tinha visto desta forma.

Este trecho vou precisar mais atenção >> '? gotoAndStop(2):"";'.

Adicionei 'e.target.buttonMode = false;', em alphaFunc.

 

Ficou perfeito! Clique aqui

 

Agora é inventar um layout criativo, pra valorizar ainda mais.

 

 

Muitíssimo obrigada! ... que você receba sempre multiplicado.

 

 

Grande abraço Mestre :worship: ... Flash Forever!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Elektra,

 

Eu estava esperando o problema ser resolvido para postar, estava em dúvidas se eu a ajudaria ou atrapalharia. O fato é que, infelizmente, eu não posso ajudá-la com a ferramenta Flash, já que uso exclusivamente Linux e não existe um Flash para Linux. Porém, seu problema não é de Flash e sim de Actionscript e, nisso, eu posso ajudá-la (e muito), principalmente em relação à orientação a objetos.

 

A primeira coisa que você precisa compreender é que, após compilar seu .fla, você terá seus frames, MovieClips e toda sua biblioteca transformados em classes e, então, instanciados, ou seja, tudo se resume à orientação a objetos. Com isso, você terá que levar em consideração alguns princípios básicos e poderá utilizar alguns padrões de design para resolver seu problema.

 

Quando falamos em MovieClip, Sprite e outros, estamos na verdade falando sobre DisplayObject que, no fim das contas, trata-se de Composite:

 

Composite

 

Tipo:

Structural

Intenção:

Criar uma composição de objetos em uma árvore que representa a hierarquia parte-todo. Com Composite, você trabalhará da mesma forma com os vários tipos de objetos da composição, independente da forma que o objeto é implementado.

Motivação:

É comum, principalmente em aplicações gráficas, termos vários tipos de elementos que, juntos, compõem um elemento maior e até toda a interface gráfica de usuário. Esse agrupamento de elementos diferentes para formar elementos maiores pode ser muito problemática se cada elemento tiver uma interface própria e diferente, precisaríamos conhecer cada elemento e trabalhar especificamente na sua implementação.

 

Para resolver esse tipo de problema, podemos utilizar uma composição recursiva, onde todos os objetos da árvore são, na verdade, instâncias de um elemento de interface de usuário, objetos simples e objeto de composição que possuem a mesma interface e que permitem que trabalhemos com todos eles uniformemente, fazendo com que a aplicação se torne mais simples.

 

gallery_94216_5_14805.png

 

O flash.display.MovieClip e flash.display.Sprite são exemplos práticos de implementação do design pattern Composite, onde ambos são derivações de flash.display.DisplayObjectContainer que, por sua vez, é uma derivação de flash.display.DisplayObject. Tanto o MovieClip quanto o Sprite são objetos de composição, ou seja, eles aceitam outros objetos como filhos, enquanto o DisplayObject é um objeto simples, ou Leaf, que não aceita nenhum objeto como filho.

Aplicabilidade:

O padrão Composite pode ser utilizado quando se deseja representar uma hierarquia de elementos, como o XML, HTML e até MovieClip/Sprite/DisplayObject, ignorando a diferença entre os objetos da composição. Com Composite você será capaz de trabalhar com todos os elementos de uma forma única, independente da forma que a estrutura é representada.

 

Você pode utilizar Composite quando:

  • Deseja representar uma estrutura todo-parte.
  • Deseja trabalhar com os objetos ignorando as diferenças nas suas implementações; você poderá tratar todos os objetos uniformemente.

Estrutura:

gallery_94216_25_12129.png

Compreendido que estamos falando sobre Composite, vamos ao seu problema:

 

Atualmente obtenho o índice ao carregar os objetos do Array.

 

Preciso verificar se todas as instâncias executaram a Tween para depois chamar uma nova função.

 

O Tween é executado quando o usuário passa com o mouse sobre algum item do Grid, ou seja, temos duas camadas aqui:

  1. View (seu Grid e GridItems).
  2. Controller (o cara responsável por manipular a ação do usuário)

package com.imasters.forum.elektra {
import flash.display.Sprite;

public class Grid extends Sprite {
	public function Grid( rows :uint , cols :uint ) {
		super();

		for ( var i :uint = 0 , k :uint = 1 ; i < rows ; ++i ) {
			for ( var j :uint = 0 ; j < cols ; ++j ) {
				var gridItem :GridItem = new GridItem( 70 , 70 , 2 );

				gridItem.x = this.x + ( j * gridItem.width ) - ( 2 * j );
				gridItem.y = this.y + ( i * gridItem.height ) - ( 2 * i );

				addChild( gridItem );
			}
		}
	}
}
}

 

package com.imasters.forum.elektra {
import flash.display.Sprite;

public class GridItem extends Sprite {
	public function GridItem( width :uint , height :uint , lineWidth :uint = 2 ) {
		super();

		graphics.lineStyle( lineWidth , 0x660099 );
		graphics.beginFill( 0xE1C4C4 );
		graphics.drawRect( 0 , 0 , width - lineWidth , height - lineWidth );
		graphics.endFill();
	}
}
}

 

Um dos princípios mais básicos da orientação a é o S.R.P. ou Single Responsibility Principle ou, ainda, Princípio da Responsabilidade Única. Veja, cada item da grade deve ser responsável por seu desenho, a grade é responsável por organizar os itens visualmente, mas nenhum dos dois é responsável por lidar com a ação do usuário.

 

Nesse caso, precisamos ter:

  • View: Grid e GridItem
  • Controller: GridController

 

package com.imasters.forum.elektra {
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.events.Event;

public class GridController {
	private var numChildren :int;
	private var grid :Grid;

	public function GridController( grid :Grid ) {
		numChildren = grid.numChildren;
		this.grid = grid;

		for ( var i :int = 0 ; i < numChildren ; ++i ) {
			var item :DisplayObject = grid.getChildAt( i );

			if ( item is GridItem ) {
				item.addEventListener( MouseEvent.MOUSE_OVER , handleMouseOverEvent );
			}
		}
	}

	public function handleMouseOverEvent( e :MouseEvent ) :void {
		var gridItem :GridItem = e.target as GridItem;

		gridItem.hide();
		gridItem.removeEventListener( MouseEvent.MOUSE_OVER , handleMouseOverEvent );

		if ( --numChildren == 0 ) {
			grid.dispatchEvent( new Event( Event.COMPLETE ) );
		}
	}
}
}

 

Com o GridController tomando conta das ações do usuário, Grid precisa conhecê-lo:

 

package com.imasters.forum.elektra {
import flash.display.Sprite;

public class Grid extends Sprite {
	private var gridController :GridController;

	public function Grid( rows :uint , cols :uint ) {
		super();

		for ( var i :uint = 0 , k :uint = 1 ; i < rows ; ++i ) {
			for ( var j :uint = 0 ; j < cols ; ++j ) {
				var gridItem :GridItem = new GridItem( 70 , 70 , 2 );

				gridItem.x = x + ( j * gridItem.width ) - ( 2 * j );
				gridItem.y = y + ( i * gridItem.height ) - ( 2 * i );

				addChild( gridItem );
			}
		}

		gridController = new GridController( this );
	}
}
}

 

E GridItem fica assim:

 

package com.imasters.forum.elektra {
import flash.display.Sprite;

public class GridItem extends Sprite {
	public function GridItem( width :uint , height :uint , lineWidth :uint = 2 ) {
		super();

		graphics.lineStyle( lineWidth , 0x660099 );
		graphics.beginFill( 0xE1C4C4 );
		graphics.drawRect( 0 , 0 , width - lineWidth , height - lineWidth );
		graphics.endFill();
	}

	public function hide() :void {
		alpha = 0; //pode utilizar o Tween, a implementação não é relevante
	}
}
}

 

Para usar isso ai, basta fazer o seguinte:

 

package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import com.imasters.forum.elektra.Grid;

public class Elektra extends Sprite {
	public function Elektra() {
		super();

		stage.scaleMode = StageScaleMode.NO_SCALE;
		stage.align = StageAlign.TOP_LEFT;

		var grid :Grid = new Grid( 5 , 4 );
		grid.addEventListener( Event.COMPLETE , function() :void {
			//faça alguma coisa quanto todos os itens da grade
			//estiverem invisíveis
		} );

		addChild( grid );
	}
}
}

 

Muitas vezes, Elektra, quando estamos escrevendo algum código, o problema está na falta de design. Princípios e padrões de design ajudam a evitar e resolver problemas recorrentes e padrões de arquitetura ajudam na organização e delegação de responsabilidades. Lembre-se sempre, quanto mais coeso for a responsabilidade de um objeto, menor a probabilidade de você ter um problema de design.

 

Coloquei o código no github :seta: https://github.com/n...batista/elektra

 

Para fazer o clone do repositório:

 

git clone git://github.com/netojoaobatista/elektra.git

 

Se preferir, você pode fazer o download do código em: https://github.com/n...ektra/downloads Haverão dois botões, "Download as .tar.gz" e "Download as .zip", escolha o que for mais apropriado.

 

;)

 

PS: Espero não tê-la atrapalhado ou confundido, sei que não é um tema muito simples, mas é definitivamente um tema muito divertido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns, João!

 

Deu um show de OOP... :)

 

Eu, particularmente, gosto muito de OOP... Padrões são uma mão na roda, sem dúvidas, contudo, para alguns, não é algo tão simples de se entender... Deve ser, na minha opinião, um segundo passo após aprender os conceitos básicos de OOP...

 

Por isso sempre contribuo dentro do contexto(e quando tenho um tempinho)... Mas sua participação foi ótima, e certamente, contribuirá um pouco mais para usuários do nível avançado...

 

Agora, sobre o código em si, eu testei aqui em casa e vi que a versão que está no post não funciona como desejado, pois o segundo passo é executado antes do esperado. Já a versão que você disponibilizou para download, eu baixei e está funcionando perfeitamente... E como falei antes, pois não costumo usar a classe TweenMax, em vez de um removeChild, usar o evento COMPLETE(ou algo assim se houver) da classe citada, pois dependendo da aplicação, talvez o usuário não queira remover os objetos do palco...

 

Mas pra efeito de explicação está perfeito.

 

 

Elektra:

 

Até existe outras formas de se fazer, pois o for não ficou muito elegante no código que te passei... Peço desculpas porque escrevi em meio a minha correria...

 

Mas, se quiser, pode remover ele e inserir o contador no início. Deixando apenas a verificação da forma como está...

 

Tudo de bom pra você...

 

E um abraço ao meu amigo João Batista.

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.