Forked from: shaktool's forked from: Box2D test diff:87 Box2D tutorial part 2 shaktool forked:1favorite:0lines:102license : All rights reserved modified : 2009-10-19 10:45:27 Embed Tweet // forked from shaktool's forked from: Box2D test package { import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Dynamics.Contacts.*; import flash.display.*; import flash.events.*; public class Box2DTutorial extends Sprite { private var world: b2World; private var characters: Array = []; public function Box2DTutorial(): void { stage.addEventListener(MouseEvent.CLICK, clickHandler); // Set the world boundaries: var worldAABB: b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100, -100); worldAABB.upperBound.Set(100, 100); // Set the rate of acceleration due to gravity: var gravity: b2Vec2 = new b2Vec2(0, 10); // Optionally stop simulating inactive bodies: var doSleep: Boolean = true; // Create a world to contain the bodies: world = new b2World(worldAABB, gravity, doSleep); // Create a body for the floor: var floorBodyDef: b2BodyDef = new b2BodyDef(); floorBodyDef.position.Set(2.5, 3); var floorBody: b2Body = world.CreateBody(floorBodyDef); // Create a shape for the floor: var floorShapeDef: b2PolygonDef = new b2PolygonDef(); floorShapeDef.SetAsBox(2, 0.1); floorBody.CreateShape(floorShapeDef); // Create a body for the box: var boxBodyDef: b2BodyDef = new b2BodyDef(); boxBodyDef.position.Set(2.5, 1); var boxBody: b2Body = world.CreateBody(boxBodyDef); // Associate the body with a character, and vice versa. var boxCharacter: Character = new Character(); boxCharacter.body = boxBody; boxBody.SetUserData(boxCharacter); characters.push(boxCharacter); // Create a shape for the box: var boxShapeDef: b2PolygonDef= new b2PolygonDef(); boxShapeDef.SetAsOrientedBox(0.3, 0.2, new b2Vec2(0, 0), 0.8); boxShapeDef.restitution = 0.4; // Make sure that the box has mass, so that it will be dynamic: boxShapeDef.density = 1; boxBody.CreateShape(boxShapeDef); boxBody.SetMassFromShapes(); // Use Box2D's internal rendering engine to display the simulation for now. var debugDraw: b2DebugDraw = new b2DebugDraw(); debugDraw.m_sprite = this; // = an empty container on the display list debugDraw.m_drawScale = 100; // 100 pixels per meter debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit; // draw shapes world.SetDebugDraw(debugDraw); var contactListener: MyContactListener = new MyContactListener(); world.SetContactListener(contactListener); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(event: Event):void { // The time passed, or the inverse of the framerate: var timeStep: Number = 1/30; // The quality of the simulation: var iterations: int = 10; world.Step(timeStep, iterations); } private function clickHandler(event: Event):void { for each (var character: Character in characters) { if (character.standingOnFloor) { character.body.ApplyImpulse(new b2Vec2(0,-1), character.body.GetWorldCenter()); } } /* var body: b2Body = world.GetBodyList(); for (; body != null; body = body.GetNext()) { if (body.GetUserData() == true) { body.ApplyImpulse(new b2Vec2(0,-1), body.GetWorldCenter()); } } */ } } } import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Dynamics.Contacts.*; import flash.display.*; import flash.events.*; class Character { public var sprite: Sprite = null; public var standingOnFloor: Boolean = false; public var body: b2Body = null; } class MyContactListener extends b2ContactListener { public function MyContactListener(...optionalArguments) {} // a simple but buggy way to detect floors override public function Add(point: b2ContactPoint): void { var body1: b2Body = point.shape1.GetBody(); var body2: b2Body = point.shape2.GetBody(); var userData1: Character = body1.GetUserData() as Character; var userData2: Character = body2.GetUserData() as Character; if (userData1 != null) { // point.normal is a vector pointing from body1 to body2. // is body2 is below body1? if (point.normal.y > 0.707) { // roughly sin(45) userData1.standingOnFloor = true; } } if (userData2 != null) { // point.normal is a vector pointing from body1 to body2. // is body1 is below body2? if (-point.normal.y > 0.707) { // roughly sin(45) userData2.standingOnFloor = true; } } } override public function Remove(point: b2ContactPoint): void { var body1: b2Body = point.shape1.GetBody(); var body2: b2Body = point.shape2.GetBody(); var userData1: Character = body1.GetUserData() as Character; var userData2: Character = body2.GetUserData() as Character; // not on floor anymore? if (userData1 != null) userData1.standingOnFloor = false; if (userData2 != null) userData2.standingOnFloor = false; } override public function Persist(point: b2ContactPoint): void {} override public function Result(point: b2ContactResult): void {} } Code Fullscreen Preview Fullscreen b2Body body2 body1 b2BodyDef b2PolygonDef b2Vec2 GetBody GetUserData b2DebugDraw Result SetContactListener Remove Persist b2World Add ApplyImpulse CreateBody SetUserData GetWorldCenter SetAsOrientedBox sort new page view favorite forked pv573 forked from: Box2D tutorial pa.. hypercas forked:1 favorite:0lines:102 (diff:2)