Box2Dという物理エンジンを使ったActionScript3プログラミングをすれば、難解な数学や物理法則を理解する必要なくて実装できませね。Box2DをFlashで利用できるようにするため、「Box2DFlashAS3」というオープンソースのActionScript 3のライブラリが開発されました。
実際にどれだけ威力があるかというのはデモを見ればわかるほどの出来栄えで、ピタゴラスイッチ風なものとか、ドミノ倒しとか、いろいろなことができます。
- 世界の作成
- 床の作成
- 積み木の作成
- シミュレーションの開始
- 描画
の様の流れで、Box2DFlashAS3 の単純なサンプルと使い方を解説するチュートリアルを参考できます。
開発用エンジンですから、利用方法は例を参考すればどうしても分かれるともいますね。
以下はにとよんさんが作られたサンプルです。
- package {
- import Engine.Dynamics.*;
- import Engine.Collision.*;
- import Engine.Collision.Shapes.*;
- import Engine.Common.Math.*;
- import flash.events.Event
- import flash.display.*;
- import flash.text.TextField;
- [SWF(backgroundColor="#ffffff", width="350", height="200")]
- public class Box2dSimpleSample extends Sprite {
- private var m_world:b2World;
- private var m_physScale:Number = 10;
- private var count:int = 0; // loop counter
- public function Box2dSimpleSample() {
- stage.scaleMode = "noScale";
- stage.align = "TL";
- var text:TextField = new TextField();
- text.text = "CLICK TO START!!!";
- text.x = text.y = 100;
- addChild(text);
- stage.addEventListener("click", function(event:Event):void {
- text.visible = false;
- init();
- });
- addEventListener("enterFrame", function(event:Event):void {
- Update();
- });
- }
- private function init():void {
- count = 0;
- // Construct a world object
- var worldAABB:b2AABB = new b2AABB();
- worldAABB.minVertex.Set(-100.0, -100.0);
- worldAABB.maxVertex.Set(100.0, 100.0);
- var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
- m_world = new b2World(worldAABB, gravity, true);
- // Create floor
- var wallSd:b2BoxDef = new b2BoxDef();
- wallSd.extents.Set(300 / m_physScale / 2, 10 / m_physScale);
- wallSd.localRotation = Math.random() * Math.PI / 8;
- var wallBd:b2BodyDef = new b2BodyDef();
- wallBd.position.Set(300 / m_physScale / 2, 250 / m_physScale);
- wallBd.AddShape(wallSd);
- m_world.CreateBody(wallBd);
- // Add bodies
- var sd:b2BoxDef = new b2BoxDef();
- sd.density = 1;
- sd.friction = 0.2;
- var bd:b2BodyDef = new b2BodyDef();
- bd.AddShape(sd);
- for (var i:int = 0; i < 10; i++) {
- sd.extents.Set(30 / m_physScale, 10 / m_physScale);
- bd.position.Set(100 / m_physScale, (160 - 40 - i * 20) / m_physScale);
- m_world.CreateBody(bd);
- }
- }
- public function Update():void {
- if(!m_world) {
- return;
- }
- // Update physics
- count++;
- if(count > 300) {
- init();
- }
- m_world.Step(1 / 30, 10);
- // Render
- graphics.clear();
- for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
- for (var s:b2Shape = bb.GetShapeList(); s != null; s = s.GetNext()) {
- DrawShape(s);
- }
- }
- }
- public function DrawShape(shape:b2Shape):void {
- if(shape.m_type == b2Shape.e_polyShape) {
- var poly:b2PolyShape = shape as b2PolyShape;
- var tV:b2Vec2 = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
- graphics.beginFill(0x999999, count > 290 ? (300 - count) / 10.0 : 1);
- graphics.lineStyle(1,0xffffff,1);
- graphics.moveTo(tV.x * m_physScale, tV.y * m_physScale);
- for (var i:int = 0; i < poly.m_vertexCount; ++i) {
- var v:b2Vec2 = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
- graphics.lineTo(v.x * m_physScale, v.y * m_physScale);
- }
- graphics.lineTo(tV.x * m_physScale, tV.y * m_physScale);
- graphics.endFill();
- }
- }
- }
- }
関連情報
- Flashで物理演算シミュレーションを可能にする「Box2DFlashAS3」
- Box2DFlashAS3 の単純なサンプルと使い方
- Box2DでActionScript物理プログラミング
- 物理演算ライブラリ「Box2DFlashAS3」を活用する
- Box2DFlashAS3での衝突判定
- 物理エンジンライブラリ Box2DFlashAS3(基本)
- 共振フラフラこんにちわ
- 最後は公式サイト
メインコンテンツEND ■
Posted on Thursday, 28th January 2010 by admin
Tags: Box2DFlashAS3, オープンソース, ライブラリ, 物理演算
Posted in ActionScript, Flash Project | Comments (0) | 1,783 views
