Convertendo Código Simples em Classe!

Depois de realizar uns movimentos básicos no Flash via teclado, chegou a hora de incrementar um pouco mais aquele código! Que tal colocá-lo em uma classe, para que possa ser reutilizado inúmeras vezes…? E quando digo inúmeras vezes, significa várias vezes em projetos diferentes ou no mesmo projeto! Primeiro, você vai precisar do código escrito naquela dica ( “Movimentos básicos no Flash via teclado” ). Descompacte-o e em seguida, crie uma pasta onde está o seu FLA para acomodar suas classes. Eu decidi chamá-la de actionScript.

O nome da pasta é importante!

O nome da pasta é importante!

Abra o Flash, vá no menu File, escolha New e finalmente, escolha ActionScript File. O nome do seu arquivo também importa na programação – eu decidi chamar o meu de basicGame.as - e agora, vamos começar a programar!

Primeiro, identifique o pacote de classes com o nome da pasta que você criou e crie a classe com o mesmo nome do seu arquivo “.AS“. Seu arquivo deve ficar mais ou menos assim:

package actionScript {
  public class basicGame {
    // Vamos inserir o código do outro arquivo aqui!
  }
}

Diferente de se programar na timeline, é necessário cuidar da importação de bibliotecas quando se está trabalhando com uma classe. Vou importar 3 bibliotecas básicas - Event, MouseEvent e KeyboardEvent – e mesmo que eu não esteja usando MouseEvent neste momento, eu pretendo usá-la em breve. Então o código fica assim:

package actionScript {
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent;
   import flash.events.Event;
  public class basicGame {
    // Vamos inserir o código do outro arquivo aqui!
  }
}

Depois, copie o código criado no FLAmovimentospeloteclado.fla” dentro da sua classe. Mas se você tentar rodar agora, vários erros de compilação irão surgir. O código copiado tem algumas ações realizadas em tempo de execução, o que é impossível para uma classe. Devemos passar estes códigos para uma função construtora, que é chamada automaticamente no momento de criação da instância da classe.

Basta nomear uma função com o mesmo nome da classe, para ela ser uma função construtora!

package actionScript {
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent;
   import flash.events.Event;
  public class basicGame {
    public function basicGame():void {
      // Conteúdo da Função!
    }
  }
}

 Vamos recapitular algumas coisas… O nosso código original adicionava três Listeners ao StageUm para detectar o “pressionar” de um botão do teclado, outro para detectar o “soltar” de um botão do teclado e o outro iria ser executado na velocidade do framerate, com a missão de realizar as ações necessárias ) e controlava um MovieClip chamado bodyMovie, movendo-o de acordo com as setas do teclado. Mas a nossa classe não tem stage, e dentro dela, também não há um MovieClip chamado bodyMovie, pois ele está na timeline do Flash. Como resolver isto…?

Vamos adicionar dois parâmetros na função construtora. O primeiro parâmetro será a referência do MovieClip a ser controlado, e o segundo, a referência do stage. Depois de recebê-los como parâmetro, devemos guardá-los em variáveis privadas que toda a classe possa enxergar, à qualquer momento. O código fica mais ou menos assim:

package actionScript {

 import flash.events.KeyboardEvent;
 import flash.events.MouseEvent;
 import flash.events.Event;  

public class basicGame {

  private var myChar:Object;
  private var myRoot:Object;

  public function basicGame(c:Object,s:Object):void {
   myChar = c;
   myRoot = s;
  }

 }

} 

Na hora de completar a nossa classe com o código original do artigo anterior, você não pode esquecer de trocar toda a referência à bodyMovie pela variável myChar e toda referência ao stage pela variável myRoot. O código completo desta dica fica assim: 

package actionScript {

 import flash.events.KeyboardEvent;
 import flash.events.MouseEvent;
 import flash.events.Event;  

public class basicGame {

  private var myChar:Object;
  private var myRoot:Object;
  private var pressLeft:Boolean = new Boolean(false);
  private var pressUp:Boolean = new Boolean(false);
  private var pressRight:Boolean = new Boolean(false);
  private var pressDown:Boolean = new Boolean(false);

  public function basicGame(c:Object,s:Object):void {
   myChar = c;
   myRoot = s;
   myRoot.addEventListener(KeyboardEvent.KEY_DOWN, pressButtonDown);
   myRoot.addEventListener(KeyboardEvent.KEY_UP, pressButtonUp);
   myRoot.addEventListener(Event.ENTER_FRAME, runIt);
  }

  private function pressButtonDown(event:KeyboardEvent):void {
   switch (event.keyCode) {
    case 37 : //ESQUERDA;
     pressLeft = true;
     break;
    case 38 : //CIMA;
     pressUp = true;
     break;
    case 39 : //DIREITA;
     pressRight = true;
     break;
    case 40 : //BAIXO;
     pressDown = true;
     break;
   }
  }

  private function pressButtonUp(event:KeyboardEvent):void {
   switch (event.keyCode) {
    case 37 : //ESQUERDA;
     pressLeft = false;
     break;
    case 38 : //CIMA;
     pressUp = false;
     break;
    case 39 : //DIREITA;
     pressRight = false;
     break;
    case 40 : //BAIXO;
     pressDown = false;
     break;
   }
  }

  private function runIt(e:Event):void {
   if (pressLeft) {
    if (myChar.x > 0) {
     myChar.x -= 5;
    }
   }
   if (pressRight) {
    if (myChar.x < 400) {
     myChar.x += 5;
    }
   }
   if (pressUp) {
    if (myChar.y > 0) {
     myChar.y -= 5;
    }
   }
   if (pressDown) {
    if (myChar.y < 300) {
     myChar.y += 5;
    }
   }
  }

 }

} 

Agora é só importar a sua classe no Flash e criar uma instância dela! Então, na timeline do seu arquivo FLA, faça o seguinte:

import actionScript.basicGame;
var obj:basicGame = new basicGame(this.bodyMovie,stage);

Desta forma, o seu Flash com classe estará fazendo exatamente a mesma coisa do Flash do exemplo anterior. Mas agora, você pode instanciá-lo facilmente, quantas vezes você quiser. Apenas como exemplo, dupliquei o nosso MovieClip, pintei ele de diversas cores com a propriedade Tint e redimensionei aleatoriamente. Agora, é fácil controlar os novos MovieClips, em poucas linhas:

import actionScript.basicGame;

var obj1:basicGame = new basicGame(this.bodyMovie1,stage);
var obj2:basicGame = new basicGame(this.bodyMovie2,stage);
var obj3:basicGame = new basicGame(this.bodyMovie3,stage);
var obj4:basicGame = new basicGame(this.bodyMovie4,stage);

Para experimentar, clique no Flash abaixo ( para o Browser dar foco ao Flash ) e use as setas do teclado para controlar os 4 MovieClips. Note que os MovieClips se mexem juntos, até que eles encontrem o limite nos cantos do Flash.

 

Se desejar, clique aqui e baixe este exemplo completo, salvo em Flash CS3. E até a próxima dica!

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>