APE parte II: WheelParticle y SpringConstraint

APE parte II: WheelParticle y SpringConstraint

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

Imagen en reemplazo de flash
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:

  1. //Importo las clases necesarias
  2. import org.cove.ape.*;
  3. import flash.events.*;
  4. import flash.display.Sprite;
  5.  
  6. //Variable de tipo grupo. Va a almacenar todas las partículas y constrains del escenario APE
  7. var grupoColisiones:Group;
  8.  
  9. //Inicializa la escena
  10. function Empezar(){
  11. 	//Creo el motor
  12. 	CrearAPE();
  13. 	//Añado los elementos APE al escenario
  14. 	CrearEscenario();
  15. 	//Añado un listener para que ejecute la función Run, que se encarga de realizar los
  16. 	// cálculos  y mover todas las partículas incluidas en el grupoColisiones
  17. 	addEventListener(Event.ENTER_FRAME, Run);
  18.  
  19. }
  20.  
  21. //Crea el escenario APE
  22. function CrearAPE(){
  23. 	APEngine.init(1/4);
  24. 	var contenedor:MovieClip = new MovieClip()
  25. 	APEngine.container = contenedor;
  26. 	addChild(contenedor);
  27. 	APEngine.addForce(new VectorForce(false,0,2));
  28. 	grupoColisiones = new Group();
  29. 	APEngine.addGroup(grupoColisiones);
  30. 	grupoColisiones.collideInternal = true;
  31. }
  32.  
  33. //Crea los elementos del escenario
  34. function CrearEscenario(){
  35. 	//Añado un visor de FPS
  36. 	var FPS:FrameRate = new FrameRate();
  37. 	FPS.setPosition(20,15);
  38. 	addChild(FPS);
  39. 	//Creo un suelo y dos paredes
  40. 	CrearRectangulo(350,395,700,10,0,true,1,0.1,0);
  41. 	CrearRectangulo(0,200,10,400,Math.PI,true,1,0.1,0);
  42. 	CrearRectangulo(700,200,10,400,Math.PI,true,1,0.1,0);
  43. 	//Creo bolas "movibles" en el suelo
  44. 	for(var i = 0; i<40; i++){
  45. 		CrearCirculo(i*20 + 6,-100,8,false,1,0.4,0);
  46. 	}
  47. 	//Creo la "bici" con la que va a interactuar el usuario
  48. 	CrearBici()
  49.  
  50.  
  51. }
  52.  
  53. /*
  54. CrearRectangulo()
  55. Esta función crea un rectángulo. Los rectángulos tienen los siguientes atributos:
  56. 	-x,y,ancho,alto y rotación(en radianes)
  57. 	-fixed:Boolean, indica si la partícula es fija o no. En este ejemplo las rampas y paredes
  58. 		tienen fixed = true y lo círculos fixed = false;
  59. 	-mass: masa
  60. 	-elasticity:elasticidad. El valor predeterminado es 0.3, un valor mayor significa más elasticidad.
  61. 	-friction: fricción
  62. */
  63.  
  64. function CrearRectangulo(X,Y,ancho,alto,rot,est,masa,ela,fri){
  65. 	var rp:RectangleParticle = new RectangleParticle(X,Y,ancho,alto,rot,est,masa,ela,fri);
  66. 	grupoColisiones.addParticle(rp);
  67. }
  68.  
  69. /*
  70. Crea un círculo
  71. Esta función crea un círculo. Los círculos tienen los siguientes atributos:
  72. 	-x,y,radio
  73. 	-fixed:Boolean, indica si la partícula es fija o no. En este ejemplo las rampas y paredes 
  74. 		tienen fixed = true y lo círculos fixed = false;
  75. 	-mass: masa
  76. 	-elasticity:elasticidad. El valor predeterminado es 0.3, un valor mayor significa más elasticidad.
  77. 	-friction: fricción
  78. */
  79.  
  80. function CrearCirculo(X,Y,radio,est,masa,ela,fri){
  81. 	var circ = new CircleParticle(X,Y,radio,est,masa,ela,fri);
  82. 	grupoColisiones.addParticle(circ);
  83. }
  84.  
  85. //Hace una bici
  86. function CrearBici(){
  87. 	/*
  88. 	Creo dos variables del tipo WheelParticle. La sintaxis de la defición es:
  89. 	WheelParticle(x:Number, y:Number, radius:Number, fixed:Boolean = false, mass:Number = 1
  90. 					,elasticity:Number = 0.3, friction:Number = 0, traction:Number = 1)
  91. 	*/
  92. 	var rueda1 = new WheelParticle(200,0,20,false,1,0.3,0.1,0.5);
  93. 	var rueda2 = new WheelParticle(240,0,5,false,1,0.3,0.1,0.5);
  94. 	/*Creo una variable del tipo SpringConstraint. Los constraints son "limitaciones" que imponemos 
  95. 	en el modelo. Por ejemplo, en este caso creamos un constraint entre las dos ruedas 
  96. 	que va a hacer  que estas siempre estén a la misma distancia. La sintaxis es:
  97. 	SpringConstraint(p1:AbstractParticle, p2:AbstractParticle, stiffness:Number = 0.5
  98. 					, collidable:Boolean = false, rectHeight:Number = 1, rectScale:Number = 1
  99. 					, scaleToLength:Boolean = false)
  100. 	*/
  101. 	var lim = new SpringConstraint(rueda1, rueda2,1,false, 1, 1,false)
  102.  
  103. 	//Añado el constraint y las dos ruedas al grupoColisiones
  104. 	grupoColisiones.addParticle(rueda1);
  105. 	grupoColisiones.addParticle(rueda2);
  106. 	grupoColisiones.addConstraint(lim);
  107. 	//Pongo el foco en el escenario para que funcione el teclado
  108. 	stage.focus = this;
  109. 	//Creo las funciones que se van a ejecutar al pulsar las teclas izquierda y derecha del teclado. 
  110. 	//Al pulsarlas modifico el parámetro "angularVelocity" de las ruedas. 
  111. 	function Mover(e:KeyboardEvent){
  112. 		if(e.keyCode == 39){;
  113. 			rueda1.angularVelocity = 3;
  114. 			rueda2.angularVelocity = 3;
  115. 		}else
  116. 		if(e.keyCode == 37){;
  117. 			rueda1.angularVelocity = -3;
  118. 			rueda2.angularVelocity = -3;
  119. 		}
  120. 	}
  121. 	function Parar(e:KeyboardEvent){
  122. 		if((e.keyCode == 37) ||(e.keyCode == 39)){;
  123. 			rueda1.angularVelocity = 0;
  124. 			rueda2.angularVelocity = 0;
  125. 		}
  126. 	}
  127. 	addEventListener(KeyboardEvent.KEY_DOWN,Mover);
  128. 	addEventListener(KeyboardEvent.KEY_UP,Parar);
  129. 	//Añado listeners para que se pueda mover con el ratón
  130. 	function MoverIzq(e:MouseEvent){
  131. 		rueda1.angularVelocity = -3;
  132. 		rueda2.angularVelocity = -3;
  133. 	}
  134. 	function MoverDer(e:MouseEvent){
  135. 		rueda1.angularVelocity = 3;
  136. 		rueda2.angularVelocity = 3;
  137. 	}
  138. 	function PararRaton(e:MouseEvent){
  139. 		rueda1.angularVelocity = 0;
  140. 		rueda2.angularVelocity = 0;
  141. 	}
  142. 	Izquierda_bt.addEventListener(MouseEvent.MOUSE_DOWN,MoverIzq);
  143. 	Izquierda_bt.addEventListener(MouseEvent.MOUSE_UP,PararRaton);
  144. 	Derecha_bt.addEventListener(MouseEvent.MOUSE_DOWN,MoverDer);
  145. 	Derecha_bt.addEventListener(MouseEvent.MOUSE_UP,PararRaton);
  146.  
  147. }
  148.  
  149. //Ejecuta el APEngine. La ejecuto cada enterFrame
  150. function Run(e:Event):void {
  151.     APEngine.step();
  152.     APEngine.paint();
  153. }
  154.  
  155. //Empezamos
  156. Empezar();

Descargar archivos

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

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

Web:

Comentario: