- 2010-01-19 (火) 13:08
- Box2D
Box2DFlashAS3(ver2.0.2)を使って物理エンジンを体験する
複雑な物理計算を処理してくれるライブラリーとして注目を浴びているのが、Box2DFlashAS3です。
とても便利なライブラリーでFlash、ActionScriptの世界を楽しくさせてくれますが、その反面Box2Dを使いこなすまでには、一筋縄ではいかなく中々難しいのが現状です。
しかし覚えて損はしないライブラリーなのは間違いないので、理解するよりまずは使っていくことにしました。
まずはBox2Dのライブラリーをダウンロードしてきて、解凍したフォルダ内のBox2Dフォルダ、Generalフォルダ、TestBedフォルダ(要らないかも)をflaファイルまたはasファイルと同じ階層に置き、アクションスクリプトにインポートさせます。
その前にBox2Dを体験したい場合は解凍したフォルダ内のHelloWorld.swf、PhysTest.swfなどを開くと体験することができます。
//インポート import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Dynamics.Joints.*; import General.*;
ここからはザクっとBox2Dを使うための簡単な説明を。。。
Flashの中にBox2Dと言う世界を作ります。
地面、左右の壁、天井などを設定することにより、世界を大きさ、サイズを決めることができます。
またその中に物体を作ることにより、重力、反発、摩擦などが発生します。
Box2Dの世界をつくる
//外枠の定義 var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100, -100); worldAABB.upperBound.Set(100, 100); //重力の定義 var gravity:b2Vec2 = new b2Vec2(0, 10); //エンジンのセットアップ world = new b2World(worldAABB, gravity, true);
地面をつくる
//物体の定義 var floorBodyDef:b2BodyDef = new b2BodyDef(); floorBodyDef.position.Set(2.5, 3); // 床の位置 floorBodyDef.angle = Math.PI / 24; //角度を指定 //物体の形の定義 var floorShapeDef:b2PolygonDef = new b2PolygonDef(); floorShapeDef.SetAsBox(3, 0.1); //物体のサイズ floorShapeDef.friction = 0.3; floorShapeDef.density = 0; //物体を作る var floor:b2Body = world.CreateBody(floorBodyDef); floor.CreateShape(floorShapeDef);
落下物をつくる
for (var i:uint = 0; i < 20; i++) {
// 物体の定義を作る (x 座標と角度はランダム)
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set((300 * Math.random()) / SCALE, 0);
bodyDef.angle = Math.PI / 2 * Math.random();
// 物体を作る
body = world.CreateBody(bodyDef);
// 形の定義を作る
var bodyShape:b2CircleDef = new b2CircleDef();
bodyShape.radius = Math.random()*0.3+0.05;
bodyShape.density = 0.5;
bodyShape.friction = 1;
bodyShape.restitution = 0.3;
// 形を物体に追加する
body.CreateShape(bodyShape);
// 重さ・重心を計算する
body.SetMassFromShapes();
}
基本は上記の世界の設定、床など(固定物)の設定、落下物の設定が必要で、さらにエンターフレームやデバックドローの設定をするとBox2Dの世界が開けます。
以下はカスタムクラスでのコードになりますので、Flashを使う場合はflaファイルのドキュメントプロパティーにカスタムクラス名を指定して下さい。
package {
//インポート
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import Box2D.Dynamics.*;
import Box2D.Dynamics.Joints.*;
import General.*;
import flash.display.Sprite;
import flash.events.Event;
/**************************
* ADD CHILD = AS3
* http://www.addchild.net/
* Tatsuya Nishino
***************************/
//コンスラクタ
public class Box2D1 extends Sprite {
//インスタンスプロパティー
private const SCALE:Number = 100; // 物理エンジン内の1mを表すためのピクセル数
private var world:b2World; // 物理エンジンの管理クラス
private var body:b2Body; // 本体
// メソッド
public function Box2D1() {
// 初期化
init();
createObject();
// 毎フレームの処理
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
// init
private function init():void {
/*************************
*物理エンジンのセットアップ
**************************/
//外枠の定義
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100, -100);
worldAABB.upperBound.Set(100, 100);
//重力の定義
var gravity:b2Vec2 = new b2Vec2(0, 10);
//エンジンのセットアップ
world = new b2World(worldAABB, gravity, true);
/*************************
*床を作る
**************************/
//物体の定義
var floorBodyDef:b2BodyDef = new b2BodyDef();
floorBodyDef.position.Set(2.5, 3); // 床の位置
floorBodyDef.angle = Math.PI / 24; //角度を指定
//物体の形の定義
var floorShapeDef:b2PolygonDef = new b2PolygonDef();
floorShapeDef.SetAsBox(3, 0.1); //物体のサイズ
floorShapeDef.friction = 0.3;
floorShapeDef.density = 0;
//物体を作る
var floor:b2Body = world.CreateBody(floorBodyDef);
floor.CreateShape(floorShapeDef);
/*************************
*DebugDraw を有効にする
**************************/
var m_sprite:Sprite = new Sprite();
var debugDraw:b2DebugDraw = new b2DebugDraw();
debugDraw.m_sprite = m_sprite;
debugDraw.m_drawScale = SCALE;
debugDraw.m_fillAlpha = 0.5;
debugDraw.m_lineThickness = 1;
debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
world.SetDebugDraw(debugDraw);
addChild(m_sprite);
}
private function createObject():void {
/*************************
*落下物のセットアップ
**************************/
for (var i:uint = 0; i < 20; i++) {
// 物体の定義を作る (x 座標と角度はランダム)
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set((300 * Math.random()) / SCALE, 0);
bodyDef.angle = Math.PI / 2 * Math.random();
// 物体を作る
body = world.CreateBody(bodyDef);
// 形の定義を作る
var bodyShape:b2CircleDef = new b2CircleDef();
bodyShape.radius = Math.random()*0.3+0.05;
bodyShape.density = 0.5;
bodyShape.friction = 1;
bodyShape.restitution = 0.3;
// 形を物体に追加する
body.CreateShape(bodyShape);
// 重さ・重心を計算する
body.SetMassFromShapes();
}
}
//enterFrameHandler
private function enterFrameHandler(event:Event):void {
world.Step(1 / 24, 10);
}
}
}
- Newer: Box2DFlashAS3を使ってマウス操作する[Box2D-2]
- Older: 物理エンジン[Box2D]を使ったの作品紹介
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://www.addchild.net/as3-middle/box2d-as3-middle/407.html/trackback
- Listed below are links to weblogs that reference
- Box2DFlashAS3を使ってみる[Box2D-1] from ADD CHILD = AS3