Curso AS3

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).

This movie requires Flash Player 8.

5 Responses to “Box2DFlashAS3, uma poderosa Physics Engine”

  1. Tiago Preto Says:

    Show o exemplo Erick !

    Parabéns.

  2. Erick Souza Says:

    Valeu Tiago. =)

  3. André D´Angelo Says:

    Muito bom cara, não conhecia o Box 2D.

  4. André Says:

    belo exemplo, principalemnte pelo axl no retangulo ahuahuAhuahua

  5. louis vuitton outlet Says:

    I like it very much!`Thank you for your sharing!`

Leave a Reply