Mi Primer mundo para BOX2D en Actionscript 3
Dentro del lo motores fisicos que mencione en un post anterior esta BOX2D que para mi es el mejor y con el cual he empezado a desarrollar proyectos, la idea ante todo es conocer muy bien su funcionamiento y saber donde esta la documentacion para de esta forma saber todas las posibilidades que nos ofrece. La wiki de BOX2D la puede encontrar aqui. La libreria de flash se puede descargar aqui. El primer elemento, o prime paso que se sebe realizar es la creacion del mundo, que es donde los elementos van a interactuar. lo que vamos a realizar se puede ver a continuacion. Bodies y Shapes (cuerpos y formas) En este mundo todas las particulas de Box2D son cuerpos rigidos es decir tienen un cuerpo y una forma asociada; el cuerpo tiene unas propiedades como lo son la masa, la posición, el factor de amortiguamiento en cambio la forma maneja las colisiones, la fricción, la densidad entre otras variables. Teniendo todos estos datos, box2d puede llevara cabo los calculos necesarios para darle el realismo necesario a nuestro mundo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
/**************************************************** TUTORIAL DE BOX2D Creado por: César Eduardo Suárez T. www.waspgroup.com blog.waspgroup.com Si tiene alguna pregunta puede contactarme csuarez@waspgroup.com ****************************************************/ package{ import flash.display.*; import flash.events.*; //Importamos la librerias necesarias de BOX2D import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class miMundo extends Sprite{ //Creamos una variables tipo cuerpo shape para crear nuestra caja var cuerpoCajaDef:b2BodyDef; var cajaDef:b2PolygonDef; var cajita:b2Body; var piso:b2Body; var m_sprite:Sprite; var debugvar:Boolean=false; //create world variable public var m_Mundo:b2World; //creamos la variable que permite el render //esta variable no dira que tan frecuente se actualizara nuestro mundo. 1/30 significa 1/30 de un segundo, o en otras palabras 30 veces por segundo. //las interaciones le dan la presicion a los calculos fisicos a menos iteraciones menor da una menor presicion y mas rapidez //a mayor iteracion mayor presicion pero mas tiempo de calculo los expertos recomienda un valor de 10. public var m_timeStep:Number = 1/30; public var m_iterations:int = 10; //Funcion de contruccion public function miMundo(){ //2bAABB crea una caja es una la cual es necesaria para la creacion de el entorno //Si un objeto tiene una tamaño mayor a el del mundo quedara congelado. var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100.0, -100.0); worldAABB.upperBound.Set(100.0, 100.0); //this defines the gravity of world. The first parameter is horizontal force, and the second is verticle force. var gravity:b2Vec2 = new b2Vec2(0.0, 10.0); // Allow bodies to sleep, this effects performance, leave it set to true. var doSleep:Boolean = true; //Build the world m_Mundo = new b2World(worldAABB, gravity, doSleep); //Ahora que creamos el mundo vamos a agregar los elementos. Debemos tener en cuenta que //1. Cada objeto tiene dos partes el bodyDef y el shapeDef (boxDef, circleDef...) //2. Estos objetos son como una relacion de padre/hijo la forma sera aplicada como hijo del cuerpo //El piso del scenario var boxDef:b2PolygonDef; var bodyDef:b2BodyDef; bodyDef = new b2BodyDef(); bodyDef.position.Set(9,10); //le asociamos un cuerpo (movie clip previamente creado) var mesita:mesax=new mesax(); bodyDef.userData=mesita; addChild(bodyDef.userData); //definimos uss propiedades fisicas a traves de una definicion de forma; boxDef = new b2PolygonDef(); boxDef.SetAsBox(7,1.5); boxDef.friction =0.3; boxDef.density=0; //creamos el cuerpo como tal en nuestro mundo; piso = m_Mundo.CreateBody(bodyDef); piso.CreateShape(boxDef); //Creamos el Cuerpo (la caja wasp) //le asociamos un cuerpo (movie clip previamente creado) var boxmovie:cajax=new cajax(); cuerpoCajaDef = new b2BodyDef(); cuerpoCajaDef.position.Set(5,0); cuerpoCajaDef.userData = boxmovie; cuerpoCajaDef.userData.width =6*30 ; cuerpoCajaDef.userData.height = 6*30; addChild(cuerpoCajaDef.userData); cajita = m_Mundo.CreateBody(cuerpoCajaDef); //create the shape cajaDef = new b2PolygonDef(); cajaDef.SetAsBox(2.0, 2.0); cajaDef.density = 1.0; cajaDef.friction = 0.3; cajita.CreateShape(cajaDef); cajita.SetMassFromShapes(); //El boton para activar el debug var bot:btnCodigo=new btnCodigo(); addChild(bot); bot.x=380; bot.y=30; bot.addEventListener(MouseEvent.CLICK,verCodigo); addEventListener(Event.ENTER_FRAME, Update, false, 0, true); } public function verCodigo(eve:MouseEvent){ if(debugvar==false){ debugvar=true; m_sprite = new Sprite(); addChild(m_sprite); var dbgDraw:b2DebugDraw = new b2DebugDraw(); var dbgSprite:Sprite = new Sprite(); m_sprite.addChild(dbgSprite); dbgDraw.m_sprite=m_sprite; dbgDraw.m_drawScale=30; dbgDraw.m_alpha = 1; dbgDraw.m_fillAlpha=0.9 dbgDraw.m_drawScale =30.0; dbgDraw.m_lineThickness=1; dbgDraw.m_drawFlags=b2DebugDraw.e_shapeBit|b2DebugDraw.e_jointBit|b2DebugDraw.e_centerOfMassBit; m_Mundo.SetDebugDraw(dbgDraw); }else{ debugvar=false; removeChild(m_sprite); } } //Esta funcion sera activada cada vez que se entra al frame public function Update(e:Event):void{ //pasos para hacer el render de BOX2D m_Mundo.Step(m_timeStep, m_iterations); //Realiza la actualizacion de todos los objetos for (var bb:b2Body =m_Mundo.m_bodyList; bb; bb = bb.m_next){ if (bb.m_userData is Sprite){ bb.m_userData.x = bb.GetPosition().x * 30; bb.m_userData.y = bb.GetPosition().y * 30; bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI); } } } } } |
