terça-feira, 1 de maio de 2012

Um jogo simples em Flash e AS3.0

Agora para uma coisa totalmente diferente, um pouco de Flash e AS3.0.
Este jogo muito simples tem como principal objetivo introduzir um pouco de código que permite gerir eventos do teclado, controlar imagens (sprites) totalmente por código, definir eventos associados a temporizadores (timers) e ainda gerar números aleatoriamente.
O resultado final será qualquer coisa como isto:


Então vamos a isso...
Para começar vamos criar duas camadas (layers) na linha de tempo (Timeline) como se apresenta a seguir:

Uma camada vai servir para inserir os objetos, neste caso três Clipes de Filme (Movieclips): a nossa nave, o inimigo e um projetil.

Na outra camada vamos inserir o código que vamos utilizar.

O movieclip que representa o inimigo vai ter o nome inimigo, o nosso será a nave e o projetil chamasse bala.
O movieclip bala vai ficar invisível inicialmente, para isso utilizamos a propriedade alpha e definimos em 0.

Começamos por associar uma função ao que teclamos, para isso fazemos:
     stage.addEventListener(KeyboardEvent.KEY_DOWN,teclado);

Esta linha associa uma função chamada teclado aos eventos gerados pelas teclas que vamos premindo.
A função fica com este aspeto:

function teclado(e:KeyboardEvent):void{
if (e.keyCode == Keyboard.LEFT){
if(nave.x>30) nave.x -=5;
}
if (e.keyCode == Keyboard.RIGHT){
if(nave.x<500) nave.x +=5;
}
if (e.keyCode == Keyboard.UP){
if(nave.y>200) nave.y -=5;
}
if (e.keyCode == Keyboard.DOWN){
if(nave.y<370) nave.y +=5;
}
if (e.keyCode == Keyboard.SPACE){
if(estadobala==1) return;
estadobala=1;
bala.alpha=100;
bala.x=nave.x+nave.width/2+bala.width/2;
bala.y=nave.y;
}
}
Basicamente controlamos as teclas CIMA, BAIXO, ESQUERDA e DIREITA para movimentar a nave com base nas propriedades x e y que indicam a localização da nave no palco (stage).

As condições dentro de cada if evitam que a nave saia do stage.

Por fim controlamos a BARRA DE ESPAÇO para fazer disparar o projetil, para isso temos uma variável que indica o estado da bala, isto porque só vamos deixar disparar uma de cada vez, assim se a bala está a percorrer o palco não dispara outra, se dispara a bala então coloca o alpha da bala a 100 (torna a bala visível) e posicionamos a bala à frente da nave para esta iniciar o seu trajeto.

A variável estadobala é definida assim:

var estadobala:int=0;

Vamos ter ainda outras variáveis:
var velocidade_inimigo:int=10;
var velocidade_bala:int=15;
var pontuacao:int = 0;

A primeira e a segunda indicam a velocidade a que se movimentam o inimigo e a bala, respetivamente e por fim a pontuação do jogador.

Agora os eventos que controlam o inimigo e a bala, para isso temos de iniciar dois temporizadores para essa tarefa:
var timer_inimigo:uint =setInterval(moveinimigo,100);
var timer_bala:uint =setInterval(movebala,100);

As variáveis definidas permitem controlar os eventos, para este exemplo nãos as vamos utilizar e podiam não existir.

Por fim a 'inteligência' do inimigo:
function moveinimigo():void {
inimigo.x+=velocidade_inimigo;
if(inimigo.x>520 && velocidade_inimigo>0){
velocidade_inimigo*=-1;
inimigo.x+=velocidade_inimigo;
}
if(inimigo.x<30 && velocidade_inimigo<0){
velocidade_inimigo*=-1;
inimigo.x+=velocidade_inimigo;
}
}

Que se resume a mover de um lado para o outro, não saindo do palco.

E ainda a bala:
function movebala():void {
if(estadobala==0) return;
bala.y-=velocidade_bala;
/*testar colisão da bala com o inimigo*/
if(bala.hitTestObject(inimigo)){
estadobala=0;
inimigo.x=sortear(5,500);
bala.alpha=0;
pontuacao+=10;
label1=pontuacao.toString();
label.text = String("Pontuação: " + label1);
}
//A bala saiu do palco?
if(bala.y<0){
estadobala=0;
bala.alpha=0;
}
}

Antes que me esqueça o código que faz aparecer a pontuação:
var label:TextField = new TextField();
var label1:String = pontuacao.toString();
addChild(label);
label.text = String("Pontuação: " + label1);

O código que atualiza a pontuação está na função que movimenta a bala.

Por fim a função que sorteia a coluna onde o inimigo aparece quando lhe acertamos:
function sortear(low:Number=0, high:Number=1):Number
{
  return Math.floor(Math.random() * (1+high-low)) + low;
}


Sem comentários:

Enviar um comentário