//Importo las clases necesarias
import org.cove.ape.*;
import flash.events.*;
import flash.display.Sprite;
//Variable de tipo grupo. Va a almacenar todas las partículas y constrains del escenario APE
var grupoColisiones:Group;
//Inicializa la escena
function Empezar(){
//Creo el motor
CrearAPE();
//Añado los elementos APE al escenario
CrearEscenario();
//Añado un listener para que ejecute la función Run, que se encarga de realizar los
// cálculos y mover todas las partículas incluidas en el grupoColisiones
addEventListener(Event.ENTER_FRAME, Run);
}
//Crea el escenario APE
function CrearAPE(){
APEngine.init(1/4);
var contenedor:MovieClip = new MovieClip()
APEngine.container = contenedor;
addChild(contenedor);
APEngine.addForce(new VectorForce(false,0,2));
grupoColisiones = new Group();
APEngine.addGroup(grupoColisiones);
grupoColisiones.collideInternal = true;
}
//Crea los elementos del escenario
function CrearEscenario(){
//Añado un visor de FPS
var FPS:FrameRate = new FrameRate();
FPS.setPosition(20,15);
addChild(FPS);
//Creo un suelo y dos paredes
CrearRectangulo(350,395,700,10,0,true,1,0.1,0);
CrearRectangulo(0,200,10,400,Math.PI,true,1,0.1,0);
CrearRectangulo(700,200,10,400,Math.PI,true,1,0.1,0);
//Creo bolas "movibles" en el suelo
for(var i = 0; i<40; i++){
CrearCirculo(i*20 + 6,-100,8,false,1,0.4,0);
}
//Creo la "bici" con la que va a interactuar el usuario
CrearBici()
}
/*
CrearRectangulo()
Esta función crea un rectángulo. Los rectángulos tienen los siguientes atributos:
-x,y,ancho,alto y rotación(en radianes)
-fixed:Boolean, indica si la partícula es fija o no. En este ejemplo las rampas y paredes
tienen fixed = true y lo círculos fixed = false;
-mass: masa
-elasticity:elasticidad. El valor predeterminado es 0.3, un valor mayor significa más elasticidad.
-friction: fricción
*/
function CrearRectangulo(X,Y,ancho,alto,rot,est,masa,ela,fri){
var rp:RectangleParticle = new RectangleParticle(X,Y,ancho,alto,rot,est,masa,ela,fri);
grupoColisiones.addParticle(rp);
}
/*
Crea un círculo
Esta función crea un círculo. Los círculos tienen los siguientes atributos:
-x,y,radio
-fixed:Boolean, indica si la partícula es fija o no. En este ejemplo las rampas y paredes
tienen fixed = true y lo círculos fixed = false;
-mass: masa
-elasticity:elasticidad. El valor predeterminado es 0.3, un valor mayor significa más elasticidad.
-friction: fricción
*/
function CrearCirculo(X,Y,radio,est,masa,ela,fri){
var circ = new CircleParticle(X,Y,radio,est,masa,ela,fri);
grupoColisiones.addParticle(circ);
}
//Hace una bici
function CrearBici(){
/*
Creo dos variables del tipo WheelParticle. La sintaxis de la defición es:
WheelParticle(x:Number, y:Number, radius:Number, fixed:Boolean = false, mass:Number = 1
,elasticity:Number = 0.3, friction:Number = 0, traction:Number = 1)
*/
var rueda1 = new WheelParticle(200,0,20,false,1,0.3,0.1,0.5);
var rueda2 = new WheelParticle(240,0,5,false,1,0.3,0.1,0.5);
/*Creo una variable del tipo SpringConstraint. Los constraints son "limitaciones" que imponemos
en el modelo. Por ejemplo, en este caso creamos un constraint entre las dos ruedas
que va a hacer que estas siempre estén a la misma distancia. La sintaxis es:
SpringConstraint(p1:AbstractParticle, p2:AbstractParticle, stiffness:Number = 0.5
, collidable:Boolean = false, rectHeight:Number = 1, rectScale:Number = 1
, scaleToLength:Boolean = false)
*/
var lim = new SpringConstraint(rueda1, rueda2,1,false, 1, 1,false)
//Añado el constraint y las dos ruedas al grupoColisiones
grupoColisiones.addParticle(rueda1);
grupoColisiones.addParticle(rueda2);
grupoColisiones.addConstraint(lim);
//Pongo el foco en el escenario para que funcione el teclado
stage.focus = this;
//Creo las funciones que se van a ejecutar al pulsar las teclas izquierda y derecha del teclado.
//Al pulsarlas modifico el parámetro "angularVelocity" de las ruedas.
function Mover(e:KeyboardEvent){
if(e.keyCode == 39){;
rueda1.angularVelocity = 3;
rueda2.angularVelocity = 3;
}else
if(e.keyCode == 37){;
rueda1.angularVelocity = -3;
rueda2.angularVelocity = -3;
}
}
function Parar(e:KeyboardEvent){
if((e.keyCode == 37) ||(e.keyCode == 39)){;
rueda1.angularVelocity = 0;
rueda2.angularVelocity = 0;
}
}
addEventListener(KeyboardEvent.KEY_DOWN,Mover);
addEventListener(KeyboardEvent.KEY_UP,Parar);
//Añado listeners para que se pueda mover con el ratón
function MoverIzq(e:MouseEvent){
rueda1.angularVelocity = -3;
rueda2.angularVelocity = -3;
}
function MoverDer(e:MouseEvent){
rueda1.angularVelocity = 3;
rueda2.angularVelocity = 3;
}
function PararRaton(e:MouseEvent){
rueda1.angularVelocity = 0;
rueda2.angularVelocity = 0;
}
Izquierda_bt.addEventListener(MouseEvent.MOUSE_DOWN,MoverIzq);
Izquierda_bt.addEventListener(MouseEvent.MOUSE_UP,PararRaton);
Derecha_bt.addEventListener(MouseEvent.MOUSE_DOWN,MoverDer);
Derecha_bt.addEventListener(MouseEvent.MOUSE_UP,PararRaton);
}
//Ejecuta el APEngine. La ejecuto cada enterFrame
function Run(e:Event):void {
APEngine.step();
APEngine.paint();
}
//Empezamos
Empezar();
|