Box2DFlashAS3, uma poderosa Physics Engine
Na sequência do tour entre as Physics Engine Actionscript, segue o Box2DFlashAS3, uma versão AS3 pelo Matt Bush do Box2D, uma Physics Engine C++ por Erin Catto’s.
O Box2DFlashAS3 merece atenção, é uma entre duas (Motor2) Physics Engine que possui recursos suficiente para trabalhar em projetos profissionalmente.
Observações a respeito do Box2DFlashAS3: possui muitos métodos, propriedades, o que garante não nos deixar “na mão”; trabalha com metros, porém é facilmente contornado, a proporção entre pixel e metros é 1/30; a engine não possui uma documentação oficial, é um ponto chato, mas nada que atrapalhe; a primeira vista pode parecer complicado comparado ao APE, por exemplo, mas é apenas uma questão de entender a estrutura.
O Motor2 é mais uma Engine baseada no Box2D, entrará na sequência e devo finalizar nele, as outras engines existentes são muito básicas. Caso alguém conheça alguma outra engine além das três citadas que seja bacana, por favor, comente a respeito. =)
Segue um exemplo bem simples, tentei deixar o script mais compacto possível para tornar fácil a comparação entre as engines.
package { import flash.events.*; import flash.display.*; import flash.utils.*; import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class baseBox2D extends Sprite { private var world:b2World; public function baseBox2D():void { btnStart.addEventListener(MouseEvent.CLICK, onClick); } private function onClick(evt:MouseEvent):void { removeChild(evt.currentTarget as DisplayObject); this.init(); } private function init():void { var floorWidth:Number = (stage.stageWidth - 50), floorHeight:Number = 6; var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100.0, -100.0); worldAABB.upperBound.Set(100.0, 100.0); world = new b2World(worldAABB, new b2Vec2(0.0, 10.0), true); var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set(((floorWidth + 50) / 30) * .5, (stage.stageHeight - 30) / 30); bodyDef.angle = .08; var boxDef:b2PolygonDef = new b2PolygonDef(); boxDef.SetAsBox((floorWidth * .5) / 30, (floorHeight * .5) / 30); boxDef.friction = .3; boxDef.density = 0; bodyDef.userData = new objFloor(); bodyDef.userData.width = floorWidth; bodyDef.userData.height = floorHeight; addChild(bodyDef.userData); var body:b2Body = world.CreateBody(bodyDef); body.CreateShape(boxDef); body.SetMassFromShapes(); var t:Timer = new Timer(1000); t.addEventListener(TimerEvent.TIMER, function(){ addObject(); }); t.start(); addEventListener(Event.ENTER_FRAME, this.onLoop); } private function addObject():void { var objDef:*; var v:Number = Math.round(Math.random() * 2) + 1; var dWidth:Number = (Math.random() * 30) + 60, dHeight:Number = dWidth / 1.5; var box:Object = {w: (dWidth * .5) / 30, h: (dHeight * .5) / 30}; var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((Math.random() * stage.stageWidth) / 30, 0); bodyDef.userData = (v == 1) ? new samara() : ((v == 2)) ? new regiane() : new axl(); bodyDef.userData.width = dWidth; bodyDef.userData.height = (v == 3) ? dHeight : dWidth; bodyDef.userData.x = bodyDef.userData.y = -500; if(v != 2) { objDef = new b2PolygonDef(); objDef.SetAsBox(box.w, (v == 3) ? box.h : box.w); } else { objDef = new b2CircleDef(); objDef.radius = box.w; } objDef.density = 1; objDef.friction = .3; objDef.restitution = .3; addChild(bodyDef.userData); var body:b2Body = world.CreateBody(bodyDef); body.CreateShape(objDef); body.SetMassFromShapes(); } private function onLoop(evt:Event):void { world.Step(1 / 30, 10); for (var bb:b2Body = world.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); } } } } }
Coloquei três formas diferentes, quadrado (samara), retângulo(axl) e elipse (regiane).




April 28th, 2009 at 16:48
Show o exemplo Erick !
Parabéns.
April 29th, 2009 at 12:18
Valeu Tiago. =)
May 5th, 2009 at 9:22
Muito bom cara, não conhecia o Box 2D.
January 6th, 2010 at 9:19
belo exemplo, principalemnte pelo axl no retangulo ahuahuAhuahua
May 14th, 2013 at 23:03
I like it very much!`Thank you for your sharing!`