APE parte II: WheelParticle y SpringConstraint

Etiquetas: APEngine addForce addGroup collideInternal RectangleParticle CircleParticle WheelParticle SpringConstraint addParticle addConstraint angularVelocity

Además de crear cuadrados y círculos (ver APE parte I), APE permite trabajar otros dos tipos de variables: WheelParticle (para crear "ruedas" con las que podemos interactuar) y SpringConstraint (para especificar las "limitaciones" que queramos en el modelo). Este es el ejemplo:

//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();

Comentarios:
Insane dijo:
Gracias
Dejar un comentario:
Tu nombre (obligatorio):

E-mail (obligatorio, no se mostrará):

Web: