測試 syntaxhighlighter_2.1.364 效果:
↓-----------------------------------------------↓
↓-----------------------------------------------↓
package
{
import Box2D.Collision.Shapes.b2CircleShape;
import Box2D.Collision.Shapes.b2PolygonShape;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2DebugDraw;
import Box2D.Dynamics.b2FixtureDef;
import Box2D.Dynamics.b2World;
import fl.controls.Button;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* @author laqu
*/
public class Index extends Sprite
{
const WIDTH : uint = 400;
const HEIGHT : uint = 300;
const OBJ_NUM : uint = 20;
private var _world : b2World;
private var _fixtureDef : b2FixtureDef;
private var _m_physScale : uint = 100;
private var _m_sprite : Sprite;
private var _m_iterations : int = 10;
private var _m_timeStep : Number = 1 / 30;
private var _m_positionIterations : uint = 10;
private var _objArr : Array = [];
private var _btn:Button;
public function Index()
{
init();
}
private function init() : void
{
var i : uint;
var gravity : b2Vec2 = new b2Vec2(0, 10);
_world = new b2World(gravity, true);
_fixtureDef = new b2FixtureDef();
var bodyDef : b2BodyDef = new b2BodyDef();
//壁・上下左右
var wallBody : b2Body;
var wallDef : b2PolygonShape = new b2PolygonShape();
var wallWidth : Array = [WIDTH / 2,5];
var wallHeight : Array = [5,HEIGHT / 2];
var wallX : Array = [WIDTH / 2,0 ,WIDTH / 2,WIDTH];
var wallY : Array = [0,HEIGHT / 2,HEIGHT,HEIGHT / 2];
_fixtureDef.density = 1;
_fixtureDef.friction = 1;
_fixtureDef.shape = wallDef;
for(i = 0;i < 4;i++)
{
bodyDef.position.Set(wallX[i] / _m_physScale, wallY[i] / _m_physScale);
wallDef.SetAsBox(wallWidth[i % 2] / _m_physScale, wallHeight[i % 2] / _m_physScale);
wallBody = _world.CreateBody(bodyDef);
wallBody.CreateFixture(_fixtureDef);
}
//Circle
var circleDef : b2CircleShape = new b2CircleShape();
_fixtureDef.friction = 10;
_fixtureDef.density = 10;
_fixtureDef.restitution = 0.9;
_fixtureDef.shape = circleDef;
bodyDef.type = b2Body.b2_dynamicBody;
for(i = 0;i < OBJ_NUM;i++)
{
var radius : uint = Math.random() * 20 + 10;
circleDef.SetRadius(radius / _m_physScale);
bodyDef.position.Set(Math.random() * WIDTH / _m_physScale, Math.random() * HEIGHT / _m_physScale);
var circleBody : b2Body = _world.CreateBody(bodyDef);
circleBody.CreateFixture(_fixtureDef);
_objArr.push(circleBody);
}
//Box
var boxDef : b2PolygonShape = new b2PolygonShape();
_fixtureDef.friction = 1;
_fixtureDef.density = 1;
_fixtureDef.restitution = 0.1;
_fixtureDef.shape = boxDef;
bodyDef.type = b2Body.b2_dynamicBody;
for(i = 0;i < OBJ_NUM;i++)
{
var boxWidth : uint = Math.random() * 20 + 5;
var boxHeight : uint = Math.random() * 20 + 5;
boxDef.SetAsBox(boxWidth / _m_physScale, boxHeight / _m_physScale);
bodyDef.position.Set(Math.random() * WIDTH / _m_physScale,Math.random() * HEIGHT / _m_physScale);
var boxBody:b2Body = _world.CreateBody(bodyDef);
boxBody.CreateFixture(_fixtureDef);
_objArr.push(boxBody);
}
//DebugDraw
_m_sprite = new Sprite();
addChild(_m_sprite);
var debugDraw : b2DebugDraw = new b2DebugDraw();
debugDraw.SetSprite(_m_sprite);
debugDraw.SetFillAlpha(0.3);
debugDraw.SetDrawScale(_m_physScale);
debugDraw.SetLineThickness(1);
debugDraw.SetFlags(b2DebugDraw.e_shapeBit);
_world.SetDebugDraw(debugDraw);
addEventListener(Event.ENTER_FRAME, update);
//Btn
_btn = new Button();
_btn.label = "Button";
_btn.x = _btn.y = 20;
_btn.addEventListener(MouseEvent.CLICK, btnClick);
addChild(_btn);
}
//ボタンをクリックしたら上方向に力を加える
private function btnClick(e : MouseEvent) : void
{
for(var i : uint = 0;i < OBJ_NUM*2;i++)
{
var body:b2Body = _objArr[i] as b2Body;
body.SetLinearVelocity(new b2Vec2(0,-Math.random()*10));
//SetAwakeしないと全てのオブジェクトが静止した場合に動かない
body.SetAwake(true);
}
}
//レンダリング
private function update(e : Event) : void
{
_world.Step(_m_timeStep, _m_iterations, _m_positionIterations);
_world.ClearForces();
_world.DrawDebugData();
}
}
}