Neste post algumas experiencias simples para o desenvolvimento de games com AS 3. Abra um novo arquivo no flash para AS 3.0 , insira duas camadas , chame uma de actions (todos os códigos nesta camada) e a bloqueie.Segue o código:
var ball:Ball = new Ball();
ball.x = stage.stageWidth/2;
ball.y = stage.stageHeight/2;
addChild(ball)var wall:Wall = new Wall();
wall.x=50;
wall.y=100;
addChild(wall);
A primeira coisa a fazer é criar um Movie Clip que será manipulado por ações realizadas no teclado. Em um game, este seria o personagem controlado pelo jogador. Ao criar este Movie Clip, marque a opção “export for actionScript” desta forma podemos chamar o mc direto da biblioteca. Neste caso o objeto é ball da classe Ball. Após a declaração, atribuímos valor para a posição x e y e adicionamos no stage.
No meu caso também criei um outro Movie Clip (wall) para testar algumas colisões.
var forca:Number = new Number(0.1)
var velocidadeX:Number = new Number(0);
var velocidadeY:Number = new Number(0);
var atrito:Number = new Number(0.92);
var gravidade:Number = new Number (0.2);
var empuxo:Number = new Number(0.5);
var vento:Number = new Number (0.2);
Agora temos algumas declarações que serão necessárias para simular as forças q atuam sobre o personagem. Resumidamente força (ganho de desolamento), VelocidadeX (velocidade no eixo X), VelocidadeY (velocidade no eixo Y) , atrito (força que vai se opor ao movimento), gravidade (força que vai tender o deslocamento para baixo), empuxo (força resistiva que vai tornar o movimento para cima mais pesado ou mais leve) e vento (força que inicia o movimento para um lado).
stage.addEventListener(Event.ENTER_FRAME, starts);
Ao adicionar o event listener enter frame no stage, a função starts será chamada sempre que se passar pelo frame. No código em questão criamos uma especie de loop.
Todo o restante do código se resume a função starts que podemos dividir em quatro blocos:
function starts (event:Event):void{
//-----------Mudança de Escala pela altura------
ball.scaleX=((ball.y*0.5)/stage.stageWidth)+0.5;
ball.scaleY=((ball.y*0.5)/stage.stageWidth)+0.5;
// ----------------- Colisão----------------------
if(ball.hitTestObject(wall)){
velocidadeX=0;
velocidadeX += 5;
}
if(ball.x>530){
velocidadeX=0;
velocidadeX -= 5;
}
if(ball.x<0){
velocidadex=0;
velocidadeX += 5;
}
if(ball.y>335){
velocidadeY=0;
velocidadeY -= 9;
}
if(ball.y<0){
velocidadey=0;
velocidadey+=1;
}// -----------------Rotina do Teclado----------------
stage.addEventListener(KeyboardEvent.KEY_DOWN,
keyHandler);
function keyHandler (e:KeyboardEvent):void{// 37 = LEFT
if (e.keyCode==37){
velocidadeX -= forca;
}//38 = UP
if (e.keyCode==38){
velocidadeY -= forca*empuxo;
}//39 = RIGHT
if (e.keyCode==39){
velocidadeX += forca;
}//40 = DOWN
if (e.keyCode==40){
velocidadeY += forca*empuxo;
}
}
//------Ação de forças-----------velocidadeX += vento;
velocidadeX *= atrito;
velocidadeY += gravidade;ball.x += velocidadeX;
ball.y += velocidadeY;
}
Mudança de Escala pela altura: Nesta parte o tamanho da bola é alterado conforme a altura pelo método scaleX. A equação para alterar as dimensões da bola foram obtidas a partir de uma regra de três simples (no pixel 400 o tamanho de ball é 1, no pixel 0 o tamanho é 0.5 )
Colisão: A colisão no flash pode ser feita de várias formas, sendo que existem classes prontas com efeitos de colisão bem realistas. Implementei dois tipos de colisão. A primeira usando hitTestObject que verifica a colisão entre dois objetos e retorna True ou false. Pela posição do meu objeto (wall) quando há uma colisão a velocidade no eixo X da bola passa a ser zero e em seqüência recebe um valor contrário ao movimento.
O segundo tipo de colisão ocorre nas bordas do stage onde não é possível usar o hitTestObject (a não ser que haja um mc para a borda).
Rotina do Teclado: Um listener é adicionado para o caso de uma tecla for pressionada. Todo o teclado é mapeado numericamente , e os códigos correspondentes para as direcionais são checados na função do listener. No help do flash estão os códigos das demais teclas.
Quando a tecla LEFT é pressionada por exemplo a velocidade no eixo X recebe o valor dado para força. Fácil notar que quanto maior a força, maior será o deslocamento para cada vez q se pressiona o botão. No caso da tecla UP , vemos que a velocidade no eixo Y recebe o valor da força multiplicado pelo empuxo, o que torna o movimento de subida mais pesado (lembre-se multiplicar por 0.5 é o mesmo que dividir por 2).
Ação das forças: Neste bloco a velocidade do eixo X e Y recebe a ação do vento (que vai somar valores a X constantemente), a ação do atrito (que vai diminuir o movimento , semelhante ao empuxo) e a gravidade ( que inicia o movimento no eixo Y para baixo) e após isso modifica a posição de ball.
Veja meu experimento funcionando. Note a ação do vento e gravidade sobre a bola. E ainda a colisão entre objetos e nas margens do stage (obs: ocorrem alguns bugs devido a maneira como o arquivo foi upado. ^^)



0 comentários:
Postar um comentário