Mais um pequeno jogo para demonstrar algumas das funcionalidades do AS3.0.
Para este exemplo vamos implementar uma versão do Pong.
Para este Pong vamos criar a possibilidade de acelerar a bola com a raqueta e, para tornar o jogo mais difícil, quando se atingir uma determinada pontuação fazemos aparecer uma parede no meio do campo de jogo.
O código é muito parecido com o jogo do post anterior, mas um pouco mais complicado.
Para controlar a nossa raqueta utilizamos a seguinte função:
function teclado(e:KeyboardEvent):void{
dir_j1=0;
if (e.keyCode == Keyboard.UP){
if(jogador1.y>0) jogador1.y -=5;
dir_j1=-5;
}
if (e.keyCode == Keyboard.DOWN){
if(jogador1.y<370) jogador1.y +=5;
dir_j1=5;
}
}
Agora está mais simples pois só percorremos as linhas, ou seja, a coluna nunca muda.
A raqueta que é controlada pelo computador depende do seguinte código:
function movepc():void {
if (bola.y>jogador2.y) jogador2.y = jogador2.y + velocidade_y;
if (bola.y<jogador2.y) jogador2.y = jogador2.y - velocidade_y;
}
Como é fácil de perceber sempre que a bola está acima da posição da raqueta esta move para cima, quando a bola está mais para baixo a raqueta move-se para baixo.
Para mostrar a pontuação utilizamos dois textfields, assim:
var lb_pontos1:TextField = new TextField();
lb_pontos1.x=400;
addChild(lb_pontos1);
lb_pontos1.text = pontos1.toString();
var lb_pontos2:TextField = new TextField();
lb_pontos2.x=20;
addChild(lb_pontos2);
lb_pontos2.text=pontos2.toString();
Por fim a parte mais complicada o código que controla a bola:
function movebola():void {
if(v_bolax>0){
if(v_bolax>v_bolamax){ v_bolax--; v_bolay--;}
}else{
if(v_bolax*(-1)>v_bolamax) {v_bolax++; v_bolay++;}
}
if(v_bolay>0){
if(v_bolay>v_bolamax){ v_bolax--; v_bolay--;}
}else{
if(v_bolay*(-1)>v_bolamax){ v_bolax++; v_bolay++;}
}
bola.x = bola.x + v_bolax;
bola.y = bola.y + v_bolay;
/*verifica limites do stage*/
if (bola.y<=0) v_bolay =5;// v_bolay * (-1);
if (bola.y>=400) v_bolay =-5;// v_bolay * (-1);
/*Saiu do palco*/
if (bola.x<=0){
pontos1 = pontos1 + 1;
lb_pontos1.text = pontos1.toString();
bola.x=200;
if (v_bolax>0)
v_bolax=v_bolamax;
else
v_bolax=v_bolamax*(-1);
if (v_bolay>0)
v_bolax=v_bolamax;
else
v_bolay=v_bolamax*(-1);
if(pontos1>5 && parede.alpha<=100) parede.alpha=100;
}
if (bola.x>=550){
pontos2 = pontos2 + 1;
lb_pontos2.text=pontos2.toString();
bola.x=200;
if (v_bolax>0)
v_bolax=v_bolamax;
else
v_bolax=v_bolamax*(-1);
if (v_bolay>0)
v_bolax=v_bolamax;
else
v_bolay=v_bolamax*(-1);
if(pontos2>5 && parede.alpha<=100) parede.alpha=100;
}
/*testar colisão */
if(bola.hitTestObject(jogador1)){
if (v_bolax>0) v_bolax = v_bolax * (-1);
if(v_bolay>0 && dir_j1>0){
v_bolax=-20;
v_bolay=20;
}
if(v_bolay<0 && dir_j1<0){
v_bolax=-20;
v_bolay=-20;
}
bola.x = bola.x + v_bolax;
}
if(bola.hitTestObject(jogador2)){
if (v_bolax<0) v_bolax = v_bolax * (-1);
bola.x = bola.x + v_bolax;
}
if(parede.alpha>0){
if(bola.hitTestObject(parede)){
v_bolax = v_bolax * (-1);
bola.x = bola.x + v_bolax;
}
}
}
Então vamos estudar esta função por partes.
A primeira parte da função serve para ver se a bola está acelerada, se sim, abranda:
if(v_bolax>0){
if(v_bolax>v_bolamax){ v_bolax--; v_bolay--;}
}else{
if(v_bolax*(-1)>v_bolamax) {v_bolax++; v_bolay++;}
}
if(v_bolay>0){
if(v_bolay>v_bolamax){ v_bolax--; v_bolay--;}
}else{
if(v_bolay*(-1)>v_bolamax){ v_bolax++; v_bolay++;}
}
Depois vem o código que atualiza a posição da bola e verifica se sai do palco para fazer ricochete:
bola.x = bola.x + v_bolax;
bola.y = bola.y + v_bolay;
/*verifica limites do stage*/
if (bola.y<=0) v_bolay =5;// v_bolay * (-1);
if (bola.y>=400) v_bolay =-5;// v_bolay * (-1);
O código que se segue serve para verificar o limite direito e esquerdo do palco para atribuir pontos aos jogadores:
if (bola.x<=0){
pontos1 = pontos1 + 1;
lb_pontos1.text = pontos1.toString();
bola.x=200;
if (v_bolax>0)
v_bolax=v_bolamax;
else
v_bolax=v_bolamax*(-1);
if (v_bolay>0)
v_bolax=v_bolamax;
else
v_bolay=v_bolamax*(-1);
if(pontos1>5 && parede.alpha<=100) parede.alpha=100;
}
if (bola.x>=550){
pontos2 = pontos2 + 1;
lb_pontos2.text=pontos2.toString();
bola.x=200;
if (v_bolax>0)
v_bolax=v_bolamax;
else
v_bolax=v_bolamax*(-1);
if (v_bolay>0)
v_bolax=v_bolamax;
else
v_bolay=v_bolamax*(-1);
if(pontos2>5 && parede.alpha<=100) parede.alpha=100;
}
Esta parte do código faz aparecer a parede quando algum jogador ultrapassa os 5 pontos.
Por fim verificamos a colisão com as raquetas e com a parede se ela estiver visível:
/*testar colisão */
if(bola.hitTestObject(jogador1)){
if (v_bolax>0) v_bolax = v_bolax * (-1);
if(v_bolay>0 && dir_j1>0){
v_bolax=-20;
v_bolay=20;
}
if(v_bolay<0 && dir_j1<0){
v_bolax=-20;
v_bolay=-20;
}
bola.x = bola.x + v_bolax;
}
if(bola.hitTestObject(jogador2)){
if (v_bolax<0) v_bolax = v_bolax * (-1);
bola.x = bola.x + v_bolax;
}
if(parede.alpha>0){
if(bola.hitTestObject(parede)){
v_bolax = v_bolax * (-1);
bola.x = bola.x + v_bolax;
}
}
O ficheiro fonte está aqui.E o jogo pode ser jogado aqui.Partilhar no Facebook