This is a discussion on Accelerazione angolare e spinta within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Abbiamo visto come applicare leggi fisiche ad Actionscript .
Come ad esempio la spring , spring e frizione , spring con frizione e ...
In questo tutorial vedremo come applicare la accelerazione angolaree la spinta, molto utili per sviluppare giochi.
Utilizzo un piccolo aereoplano al quale associo 3 controlli tramite tastiera:
rotazione sinistra
rotazione destra
spinta
Clicca sull' SWF e premi i tasti della tastiera: sinistra, destra o su per comandare l' aereoplano
Creo un FLA che salvo con nome "main.fla".
Nello stage ho una istanza MovieClip con nome "airplane_mc".
Creo la Document Class, un file AS che salvo con nome "Main.a", implementata nel seguente modo:
Code:
package
{
import flash.display.*;
import flash.events.*;
import flash.ui.*;
public class Main extends MovieClip
{
private var rotational_velocity:int=0;
private var thrust:Number=0;
private var velocity_x:Number=0;
private var velocity_y:Number=0;
public function Main()
{
addEventListener(Event.ADDED_TO_STAGE,init);
}
private function init(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
stage.frameRate=31;
airplane_mc.addEventListener(Event.ENTER_FRAME,moveAirplane);
stage.addEventListener(KeyboardEvent.KEY_DOWN,onDown);
stage.addEventListener(KeyboardEvent.KEY_UP,onUp);
}
private function onDown(evt:KeyboardEvent):void
{
switch(evt.keyCode)
{
case Keyboard.LEFT :
rotational_velocity=-5;
break;
case Keyboard.RIGHT :
rotational_velocity=5;
break;
case Keyboard.UP :
thrust=.2;
break;
default :
break;
}
}
private function onUp(evt:KeyboardEvent):void
{
rotational_velocity=0;
thrust=0;
}
private function moveAirplane(evt:Event):void
{
evt.target.rotation+=rotational_velocity;
var angle:Number=evt.target.rotation*Math.PI/180;
var acceleration_x:Number=Math.cos(angle)*thrust;
var acceleration_y:Number=Math.sin(angle)*thrust;
velocity_x+=acceleration_x;
velocity_y+=acceleration_y;
evt.target.x+=velocity_x;
evt.target.y+=velocity_y;
}
}
}
Aalizziamo il codice.
Proprietà
una variabile di tipo numerico che sarà la nostra accelerazione angolare
private var rotational_velocity:int=0;
una variabile di tipo numerico che sarà la nostra spinta
private var thrust:Number=0;
due variabili di tipo numerico che saranno la velocità sugli assi x e y.
Questo metodo controlla quale tasto della tastiera viene premuto associando dei valori di accelerazione angolare e spinta in base appunto al tasto premuto
switch(evt.keyCode)
{
case Keyboard.LEFT :
rotational_velocity=-5;
break;
case Keyboard.RIGHT :
rotational_velocity=5;
break;
case Keyboard.UP :
thrust=.2;
break;
default :
break;
}
onUp
riporto i valori di accelerazione angolare e spinta a zero
rotational_velocity=0;
thrust=0;
moveAirplane
Aumento la rotazione dell' aereo del valore di accelerazione angolare
evt.target.rotation+=rotational_velocity;
creo una variabile che contiene il valore in radianti dell' angolo di rotazione dell' aereoplano
var angle:Number=evt.target.rotation*Math.PI/180;
Creo le due accelerazioni in base al valore del seno e coseno dell' angolo
var acceleration_x:Number=Math.cos(angle)*thrust;
var acceleration_y:Number=Math.sin(angle)*thrust;
aggiungo le accelerazioni alle rispettive velocità
velocity_x+=acceleration_x;
velocity_y+=acceleration_y;
aggiungo le velocità alla x e y della MovieClip aereoplano