flash on 2013-2-24
♥0 |
Line 129 |
Modified 2013-02-24 20:48:20 |
MIT License
archived:2017-03-20 14:06:27
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/wpUH
*/
package
{
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.utils.Dictionary;
import org.papervision3d.view.*;
import org.papervision3d.objects.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Common.Math.*;
import org.papervision3d.lights.PointLight3D;
import Box2D.Collision.Shapes.b2PolygonDef;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.parsers.DAE;
import org.papervision3d.view.BasicView;
[SWF(backgroundColor="#000000", width="475", height="475")]
public class Test extends BasicView
{
private var worldWidth : Number;
private var worldHeight : Number;
private var m_iterations : int;
private var m_wallWidth : Number;
private var m_wallHeight : Number;
private var m_timeStep : Number;
private var m_physScale : Number;
private var m_world : b2World;
private var rootNode : DisplayObject3D;
private var cubeSize : int;
private var pv3d_height : Number;
public function Test()
{
super(475, 475, false);
var aabb : b2AABB = new b2AABB();
aabb.lowerBound.Set(-512, -512);
aabb.upperBound.Set(512, 512);
//var g : b2Vec2 = new b2Vec2(0., -10.0);
stage.scaleMode = "noScale";
stage.align = "TL";
cubeSize = 100;
pv3d_height = 80;
rootNode = scene.addChild(new DisplayObject3D("rootNode"));
//camera.zoom = 100 / camera.focus + 1;
//camera.target = DisplayObject3D.ZERO;
//camera.y = 300;
var light : PointLight3D = new PointLight3D(true);
light.z = -200;
light.y = 300;
worldWidth = stage.stageWidth;
worldHeight = stage.stageHeight;
m_iterations = 30;
m_timeStep = 1 / 20;
m_physScale = 30;
var worldAABB : b2AABB = new b2AABB;
worldAABB.lowerBound.Set(-1000.0, -1000.0);
worldAABB.upperBound.Set(1000.0, 1000.0);
var gravity : b2Vec2 = new b2Vec2(0.0, 10.0);
var doSleep : Boolean = true;
m_world = new b2World(worldAABB, gravity, doSleep);
var wallShapeDef : b2PolygonDef = new b2PolygonDef();
var wallBodyDef : b2BodyDef = new b2BodyDef();
var wall : b2Body;
m_wallWidth = 500;
m_wallHeight = 300;
wallShapeDef.SetAsBox(10 / m_physScale, m_wallHeight / 2 / m_physScale);
wallBodyDef.position.Set(0, m_wallHeight / 2 / m_physScale);
wall = m_world.CreateBody(wallBodyDef);
wall.CreateShape(wallShapeDef);
wallBodyDef.position.Set(m_wallWidth / m_physScale, m_wallHeight/2/m_physScale);
wall = m_world.CreateBody(wallBodyDef);
wall.CreateShape(wallShapeDef);
wallShapeDef.SetAsBox(m_wallWidth / 2 / m_physScale, 10 / m_physScale);
wallBodyDef.position.Set(m_wallWidth / 2 / m_physScale, 0);
wall = m_world.CreateBody(wallBodyDef);
wall.CreateShape(wallShapeDef);
wallBodyDef.position.Set(m_wallWidth / 2 / m_physScale, m_wallHeight/m_physScale);
wall = m_world.CreateBody(wallBodyDef);
wall.CreateShape(wallShapeDef);
wall.SetMassFromShapes();
var colorArray : Array = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xffffff];
for (var i : int = 0; i < 5; i++)
{
var mat : FlatShadeMaterial = new FlatShadeMaterial(light, colorArray[i] as uint);
mat.interactive = true;
var matList : MaterialsList = new MaterialsList({all:mat});
var cube : Cube = new Cube(matList, cubeSize, cubeSize, cubeSize);
cube.extra = {width : cubeSize / 2, height : cubeSize / 2, arrayPos : i};
cube.x = (i * 150) - 300;
cube.y = 10;
rootNode.addChild(cube);
var boxShape : b2PolygonDef = new b2PolygonDef();
boxShape.SetAsBox(cubeSize / 2 / m_physScale, cubeSize / 2 / m_physScale);
boxShape.density = 8;
boxShape.friction = 8;
boxShape.restitution = 0.5;
var bodyDef : b2BodyDef = new b2BodyDef();
bodyDef.position.Set((cube.x + worldWidth / 2) / m_physScale, (cube.y + worldHeight/2)/m_physScale);
var body : b2Body = m_world.CreateBody(bodyDef);
body.CreateShape(boxShape);
body.SetUserData(cube);
body.SetMassFromShapes();
var vec : b2Vec2 = body.GetLinearVelocity();
if (i == 3) vec.Set(50, 0);
}
var dbgDraw : b2DebugDraw = new b2DebugDraw();
dbgDraw.m_sprite = this;
dbgDraw.m_drawScale = 10.0;
dbgDraw.m_fillAlpha = 0.8;
dbgDraw.m_lineThickness = 0.3;
dbgDraw.m_alpha = 0.3;
dbgDraw.m_xformScale = 1.0
dbgDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
m_world.SetDebugDraw(dbgDraw);
//var dae : DAE = new DAE(true, null, true);
//dae.load("http://yumekikaku.dip.jp/obj/miku_run.dae");
//dae.y = -1;
//scene.addChild(dae);
//var boxShape1 : b2PolygonDef = new b2PolygonDef();
//boxShape1.SetAsBox(cubeSize / 2 / m_physScale, cubeSize / 2 / m_physScale);
//boxShape1.density = 8;
//boxShape1.friction = 8;
//boxShape1.restitution = 0.5;
//var bodyDef1 : b2BodyDef = new b2BodyDef();
//bodyDef1.position.Set((dae.x + worldWidth / 2) / m_physScale, (dae.y + worldHeight/2)/m_physScale);
//var body1 : b2Body = m_world.CreateBody(bodyDef1);
//body1.CreateShape(boxShape1);
//body1.SetUserData(dae);
//body1.SetMassFromShapes();
//dae.play();
startRendering();
}
protected override function onRenderTick(e : Event = null) : void
{
super.onRenderTick(e);
m_world.Step(m_timeStep, m_iterations);
for (var bb : b2Body = m_world.GetBodyList(); bb; bb = bb.GetNext())
{
if (bb.GetUserData() is DisplayObject3D)
{
bb.GetUserData().x = bb.GetPosition().x * m_physScale - worldWidth / 2;
bb.GetUserData().y = -bb.GetPosition().y * m_physScale + worldHeight / 2 + pv3d_height;
bb.GetUserData().rotationZ = -bb.GetAngle() * (180 / Math.PI);
}
}
}
}
}