Home > Flash | WEB > 物理エンジン Box2DFlashAS3 を使ってみる

物理エンジン Box2DFlashAS3 を使ってみる

■物理エンジン for Flash → http://box2dflash.sourceforge.net/

Box2DFlashで作られた引越し奉行というゲームみてから気になってた。
ちょくちょくいろんなところで、ゲームに使われている。
おもしろそうなので手を出してみた。

とりあえず参考にしたサンプルを、ちょっと改造して動かす。

最初に画面をクリックしてください。
床と円を2つ設置。「←」「↑」「→」キーで円に力が加わります。

物理エンジンをセットアップし,箱を落とすFlashを作る
ここのサンプルコードを元に改造しました。

Master of None
オワタの冒険のサンプルコードを参考にさせていただきました。

ドキュメント少ないですね・・・みなさん何みて作ってんだろ・・・
とりあえず。わかったのは、
worldとbox定義の仕方と、m_linearVelocityで力を加えられることくらいか。。

ACTIONSCRIPT:
  1. package src {
  2.     import Box2D.Collision.b2AABB;
  3.     import Box2D.Collision.Shapes.b2CircleDef;
  4.     import Box2D.Collision.Shapes.b2PolygonDef;
  5.     import Box2D.Common.Math.b2Vec2;
  6.     import Box2D.Dynamics.b2Body;
  7.     import Box2D.Dynamics.b2BodyDef;
  8.     import Box2D.Dynamics.b2DebugDraw;
  9.     import Box2D.Dynamics.b2World;
  10.     import flash.display.Sprite;
  11.     import flash.events.Event;
  12.     import flash.events.KeyboardEvent;
  13.     import flash.events.MouseEvent;
  14.     import flash.events.TextEvent;
  15.     import flash.text.TextField;
  16.     import flash.ui.Keyboard;
  17.    
  18.     /**
  19.     * @author okm
  20.     */
  21.     public class LabyrinsSuite extends Sprite{
  22.         private var world:b2World; 
  23.        
  24.         private var circle:b2Body;
  25.         private var testSp:Sprite;
  26.         private var m_sprite:Sprite;
  27.        
  28.         public function LabyrinsSuite() {   
  29.             var textField:TextField = new TextField;
  30.             textField.text = "click me ";
  31.             textField.x = 100;
  32.             textField.y = 100;
  33.            
  34.             textField.selectable = false;
  35.             this.addChild(textField);
  36.             stage.addEventListener(MouseEvent.CLICK, go);
  37.             stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
  38.             stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
  39.         }
  40.        
  41.         public function go(event:MouseEvent):void {    
  42.             ////////////////////////////////////////
  43.             // 物理エンジンのセットアップ
  44.            
  45.             // 外枠を定義する
  46.             var worldAABB:b2AABB = new b2AABB();
  47.             worldAABB.lowerBound.Set(-100, -100);
  48.             worldAABB.upperBound.Set(100, 100);
  49.            
  50.             // 重力を下方向に10m/s^2とする
  51.             var gravity:b2Vec2 = new b2Vec2(0, 10);
  52.            
  53.             // 外枠と重力を指定して、物理エンジン全体をセットアップする
  54.             world = new b2World(worldAABB, gravity, true);
  55.            
  56.             ////////////////////////////////////////
  57.             // 床の設置
  58.             // 床は画面の下のほうに設置します
  59.            
  60.             // 床の位置を左から2.5m、上から3mとする
  61.             var floorBodyDef:b2BodyDef = new b2BodyDef();
  62.             floorBodyDef.position.Set(2.5, 3);
  63.            
  64.             // 床の形を、幅4m、厚さ20cmとする
  65.             // 指定するのはその半分の値
  66.             var floorShapeDef:b2PolygonDef = new b2PolygonDef();
  67.             floorShapeDef.SetAsBox(2, 0.1);
  68.            
  69.             // 床を動かない物体として作る
  70.             var floor:b2Body = world.CreateBody(floorBodyDef);
  71.             floor.CreateShape(floorShapeDef);
  72.            
  73.             // 床その2
  74.             var floorBodyDef2:b2BodyDef = new b2BodyDef();
  75.             floorBodyDef2.position.Set(1.5, 2);
  76.            
  77.             var floorShapeDef2:b2PolygonDef = new b2PolygonDef();
  78.             floorBodyDef2.angle = 0.2;
  79.             floorShapeDef2.SetAsBox(1, 0.05);
  80.            
  81.             var floor2:b2Body = world.CreateBody(floorBodyDef2);
  82.             floor2.CreateShape(floorShapeDef2);
  83.            
  84.             // 壁
  85.             var floorBodyDef3:b2BodyDef = new b2BodyDef();
  86.             floorBodyDef3.angle = 0.45;
  87.             floorBodyDef3.position.Set(4, 2);
  88.            
  89.             var floorShapeDef3:b2PolygonDef = new b2PolygonDef();
  90.             floorShapeDef3.SetAsBox(4, 2);
  91.            
  92.             var floor3:b2Body = world.CreateBody(floorBodyDef3);
  93.             floor3.CreateShape(floorShapeDef2);
  94.            
  95.            
  96.             /// 円
  97.             var m_physScale:Number = 30;
  98.             var circleDef:b2CircleDef = new b2CircleDef;
  99.             circleDef.radius = 10/m_physScale;
  100.             circleDef.density = 10.0/m_physScale;
  101.             circleDef.friction = 1.0/m_physScale;
  102.             circleDef.restitution = 0.2/m_physScale;
  103.    
  104.             var circleBD:b2BodyDef = new b2BodyDef();
  105.             circleBD.position.Set(1,1);
  106.            
  107.             circle = world.CreateBody(circleBD);
  108.             circle.CreateShape(circleDef)
  109.            
  110.             // 力を加える
  111.             circle.m_linearVelocity.y = -5;
  112.             circle.m_linearVelocity.x = -0.1;
  113.            
  114.             circle.SetMassFromShapes();
  115.            
  116.             /// 円2
  117.             var circleDef2:b2CircleDef = new b2CircleDef;
  118.             circleDef2.radius = 10/m_physScale;
  119.             circleDef2.density = 10.0/m_physScale;
  120.             circleDef2.friction = 1.0/m_physScale;
  121.             circleDef2.restitution = 0.2/m_physScale;
  122.    
  123.             var circleBD2:b2BodyDef = new b2BodyDef();
  124.             circleBD2.position.Set(1,3);
  125.            
  126.             var circle2:b2Body = world.CreateBody(circleBD2);
  127.             circle2.CreateShape(circleDef2)
  128.             circle2.SetMassFromShapes();
  129.            
  130.             ////////////////////////////////////////
  131.             // 描画設定
  132.             var debugDraw:b2DebugDraw = new b2DebugDraw();
  133.             debugDraw.m_sprite = this;
  134.             debugDraw.m_drawScale = 100; // 1mを100ピクセルにする
  135.             debugDraw.m_fillAlpha = 0.3; // 不透明度
  136.             debugDraw.m_lineThickness = 1; // 線の太さ
  137.             debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
  138.             world.SetDebugDraw(debugDraw);
  139.            
  140.             this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  141.            
  142.         }
  143.        
  144.         private var m_InputL:Number = 0;
  145.         private var m_InputR:Number = 0;
  146.         private var m_InputU:Number = 0;
  147.         private var m_Dir:Number = 0;      
  148.        
  149.         // キーが押されたときの処理
  150.         private function keyDownHandler(event:KeyboardEvent):void {
  151.             circle.WakeUp();
  152.             if(event.keyCode == Keyboard.LEFT){
  153.                 m_InputL = 1;
  154.                 m_Dir = -1.0;
  155.             }
  156.             if(event.keyCode == Keyboard.RIGHT){
  157.                 m_InputR = 1;
  158.                 m_Dir = 1.0;
  159.             }
  160.             if(event.keyCode == Keyboard.UP){
  161.                 m_InputU = 1;
  162.             }
  163.         }
  164.         private function keyUpHandler(event:KeyboardEvent):void {
  165.             m_InputL = 0;
  166.             m_InputR = 0;
  167.             m_InputU = 0;
  168.         }
  169.        
  170.         private function enterFrameHandler(event:Event):void {
  171.             for (var bb:b2Body = world.m_bodyList; bb; bb = bb.m_next) {
  172.                 if (bb.m_userData is Sprite) {
  173.                     bb.m_userData.x = bb.GetPosition().x * 30;//;
  174.                     bb.m_userData.y = bb.GetPosition().y * 30;// * m_physScale;
  175.                     bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
  176.                 }
  177.             }
  178.            
  179.             if (m_InputU == 1) {
  180.                 circle.m_linearVelocity.y = -2;
  181.             }
  182.             if (m_InputL == 1) {
  183.                 circle.m_linearVelocity.x = -2;
  184.             }
  185.             if (m_InputR == 1) {
  186.                 circle.m_linearVelocity.x = +2;
  187.             }
  188.             if (world == null) {
  189.                 return;
  190.             }
  191.            
  192.             // Flashはデフォルトで秒間24フレームなので、
  193.             // 物理シミュレーションを1/24秒進める
  194.             world.Step(1 / 24, 10);
  195.         }
  196.     }
  197. }

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://parpue.net/web/31/trackback
Listed below are links to weblogs that reference
物理エンジン Box2DFlashAS3 を使ってみる from parpue.net

Home > Flash | WEB > 物理エンジン Box2DFlashAS3 を使ってみる

リンク
chocolataste-planner
millon

サーチ
Feeds
Meta
blog ranking ブログランキング・にほんブログ村へ
にほんブログ村 テクノラティのお気に入りに追加する

Return to page top