forked from: forked from: flash on 2009-7-30
♥0 |
Line 93 |
Modified 2013-02-28 08:08:48 |
MIT License
archived:2017-03-20 14:05:25
ActionScript3 source code
/**
* Copyright ohisama ( http://wonderfl.net/user/ohisama )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/mdJy
*/
// forked from hacker_ou_yl3sc's forked from: flash on 2009-7-30
// forked from yumgsta's flash on 2009-7-30
package
{
import Box2D.Collision.Shapes.b2CircleDef;
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Collision.b2AABB;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2World;
import flash.events.Event;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
[SWF(width="475", height="475", backgroundColor="#000000", frameRate="60")]
public class Box2DFlashWithPapervision3D extends BasicView
{
private var WORLD_SCALE : Number = 30;
private var WIDTH : Number = 475;
private var HEIGHT : Number = 475;
private var world : b2World;
private var iterations : int = 10;
private var timeStep : Number = 1.0 / 30.0;
public function Box2DFlashWithPapervision3D()
{
setupPapervision3D();
createWorld();
createFloor();
createShapes();
startRendering();
}
private function setupPapervision3D() : void
{
camera.focus = 10;
camera.zoom = 70;
}
private function createWorld() : void
{
var worldBounds : b2AABB = new b2AABB();
worldBounds.lowerBound = new b2Vec2( 0, 0 );
worldBounds.upperBound = new b2Vec2(WIDTH / WORLD_SCALE, HEIGHT/WORLD_SCALE);
var gravity : b2Vec2 = new b2Vec2(0, 10);
var sleep : Boolean = true;
world = new b2World(worldBounds, gravity, sleep);
}
private function createFloor() : void
{
var floorShapeDef : b2PolygonDef = new b2PolygonDef();
var floorBodyDef : b2BodyDef = new b2BodyDef();
var floor : b2Body;
floorShapeDef.SetAsBox((WIDTH + 40) / WORLD_SCALE / 2, 100 / WORLD_SCALE);
floorBodyDef.position = new b2Vec2(WIDTH / WORLD_SCALE / 2, (HEIGHT + 95) / WORLD_SCALE-1);
floor = world.CreateBody(floorBodyDef);
floor.CreateShape(floorShapeDef);
floor.SetMassFromShapes();
}
private function createShapes() : void
{
for (var i : Number = 0; i < 1; i++)
{
var radius : Number =30;
var bodyDef : b2BodyDef = new b2BodyDef();
var dx : Number = Math.random() * WIDTH / WORLD_SCALE;
bodyDef.position = new b2Vec2(8, Math.random() * 50 /WORLD_SCALE);
var body : b2Body = world.CreateBody(bodyDef);
var shapeDef : b2CircleDef = new b2CircleDef();
shapeDef.radius = radius / WORLD_SCALE;
shapeDef.density = 1;
shapeDef.friction = .7;
shapeDef.restitution = .7;
body.CreateShape(shapeDef);
body.SetMassFromShapes();
var sphere : Sphere = new Sphere(null, radius);
scene.addChild(sphere);
body.m_userData = sphere;
}
}
override protected function onRenderTick(event : Event = null) : void
{
world.Step(timeStep, iterations);
for (var bb : b2Body = world.m_bodyList; bb; bb = bb.m_next)
{
if (bb.m_userData is DisplayObject3D)
{
bb.m_userData.x = bb.GetPosition().x * WORLD_SCALE - WIDTH * .5;
bb.m_userData.y = -bb.GetPosition().y * WORLD_SCALE + HEIGHT * .5;
bb.m_userData.rotationZ = -bb.GetAngle() * (180/Math.PI);
break;
}
}
renderer.renderScene(scene, camera, viewport);
}
}
}