Box2Dという物理エンジンを使ったActionScript3プログラミングをすれば、難解な数学や物理法則を理解する必要なくて実装できませね。Box2DをFlashで利用できるようにするため、「Box2DFlashAS3」というオープンソースのActionScript 3のライブラリが開発されました。

実際にどれだけ威力があるかというのはデモを見ればわかるほどの出来栄えで、ピタゴラスイッチ風なものとか、ドミノ倒しとか、いろいろなことができます。

  1. 世界の作成
  2. 床の作成
  3. 積み木の作成
  4. シミュレーションの開始
  5. 描画

の様の流れで、Box2DFlashAS3 の単純なサンプルと使い方を解説するチュートリアルを参考できます。

box2dflashas300_m

開発用エンジンですから、利用方法は例を参考すればどうしても分かれるともいますね。

以下はにとよんさんが作られたサンプルです。

  1. package {
  2.     import Engine.Dynamics.*;
  3.     import Engine.Collision.*;
  4.     import Engine.Collision.Shapes.*;
  5.     import Engine.Common.Math.*;
  6.     import flash.events.Event
  7.     import flash.display.*;
  8.     import flash.text.TextField;
  9.  
  10.     [SWF(backgroundColor="#ffffff", width="350", height="200")]
  11.     public class Box2dSimpleSample extends Sprite {
  12.         private var m_world:b2World;
  13.         private var m_physScale:Number = 10;
  14.         private var count:int = 0// loop counter
  15.  
  16.         public function Box2dSimpleSample() {
  17.             stage.scaleMode = "noScale";
  18.             stage.align = "TL";
  19.  
  20.             var text:TextField = new TextField();
  21.             text.text = "CLICK TO START!!!";
  22.             text.x = text.y = 100;
  23.             addChild(text);
  24.  
  25.             stage.addEventListener("click", function(event:Event):void {
  26.                 text.visible = false;
  27.                 init();
  28.             });
  29.             addEventListener("enterFrame", function(event:Event):void {
  30.                 Update();
  31.             });
  32.         }
  33.  
  34.         private function init():void {
  35.             count = 0;
  36.  
  37.             // Construct a world object
  38.             var worldAABB:b2AABB = new b2AABB();
  39.             worldAABB.minVertex.Set(-100.0, -100.0);
  40.             worldAABB.maxVertex.Set(100.0, 100.0);
  41.             var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
  42.             m_world = new b2World(worldAABB, gravity, true);
  43.  
  44.             // Create floor
  45.             var wallSd:b2BoxDef = new b2BoxDef();
  46.             wallSd.extents.Set(300 / m_physScale / 2, 10 / m_physScale);
  47.             wallSd.localRotation = Math.random() * Math.PI / 8;
  48.             var wallBd:b2BodyDef = new b2BodyDef();
  49.             wallBd.position.Set(300 / m_physScale / 2, 250 / m_physScale);
  50.             wallBd.AddShape(wallSd);
  51.             m_world.CreateBody(wallBd);
  52.  
  53.             // Add bodies
  54.             var sd:b2BoxDef = new b2BoxDef();
  55.             sd.density = 1;
  56.             sd.friction = 0.2;
  57.             var bd:b2BodyDef = new b2BodyDef();
  58.             bd.AddShape(sd);
  59.             for (var i:int = 0; i < 10; i++) {
  60.                 sd.extents.Set(30 / m_physScale, 10 / m_physScale);
  61.                 bd.position.Set(100 / m_physScale, (160 - 40 - i * 20) / m_physScale);
  62.                 m_world.CreateBody(bd);
  63.             }
  64.         }
  65.  
  66.         public function Update():void {
  67.             if(!m_world) {
  68.                 return;
  69.             }
  70.  
  71.             // Update physics
  72.             count++;
  73.             if(count > 300) {
  74.                 init();
  75.             }
  76.             m_world.Step(1 / 30, 10);
  77.  
  78.             // Render
  79.             graphics.clear();
  80.             for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
  81.                 for (var s:b2Shape = bb.GetShapeList(); s != null; s = s.GetNext()) {
  82.                     DrawShape(s);
  83.                 }
  84.             }
  85.         }
  86.  
  87.         public function DrawShape(shape:b2Shape):void {
  88.             if(shape.m_type == b2Shape.e_polyShape) {
  89.                 var poly:b2PolyShape = shape as b2PolyShape;
  90.                 var tV:b2Vec2 = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
  91.  
  92.                 graphics.beginFill(0x999999, count > 290 ? (300 - count) / 10.0 : 1);
  93.                 graphics.lineStyle(1,0xffffff,1);
  94.                 graphics.moveTo(tV.x * m_physScale, tV.y * m_physScale);
  95.  
  96.                 for (var i:int = 0; i < poly.m_vertexCount; ++i) {
  97.                     var v:b2Vec2 = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
  98.                     graphics.lineTo(v.x * m_physScale, v.y * m_physScale);
  99.                 }
  100.                 graphics.lineTo(tV.x * m_physScale, tV.y * m_physScale);
  101.  
  102.                 graphics.endFill();
  103.             }
  104.         }
  105.     }
  106. }

関連情報

  1. Flashで物理演算シミュレーションを可能にする「Box2DFlashAS3」
  2. Box2DFlashAS3 の単純なサンプルと使い方
  3. Box2DでActionScript物理プログラミング
  4. 物理演算ライブラリ「Box2DFlashAS3」を活用する
  5. Box2DFlashAS3での衝突判定
  6. 物理エンジンライブラリ Box2DFlashAS3(基本)
  7. 共振フラフラこんにちわ
  8. 最後は公式サイト
メインコンテンツEND ■
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted on Thursday, 28th January 2010 by admin

Tags: , , ,
Posted in ActionScript, Flash Project | Comments (0) | 1,783 views

Leave a Reply