Home > Flash | WEB > Box2Dで 四角の一人ボール遊び

Box2Dで 四角の一人ボール遊び

前回に引き続きBox2DFlashAS3で遊んでいます。
四角の一人ボール遊びです。

画面をクリックした後、「←」「→」で左右移動、「s」キーでジャンプです。
「s」キー連打で多段ジャンプ可w

前回より、ちゃんと部屋のサイズとか考えて作りました。天井は吹き抜けですが。

四角を右と左に動かす際、加速の感じを出すために、
イーズアウト・イーズインの公式を使いました。

といっても見つけてきただけです。
■イージングの公式いろいろ
http://www.actionscript.org/forums/showthread.php3?t=42833
■Flash Tweener の イージングパターン
http://hosted.zeh.com.br/tweener/docs/en-us/misc/transitions.html

easeInOutQuadの式

ACTIONSCRIPT:
  1. /**
  2.          * t = time
  3.          * b = beginning value
  4.          * c = change in value
  5.          * d = duration
  6.          */
  7.         public function easeInOutQuad(t:Number, b:Number, c:Number, d:Number):Number {
  8.             if ((t/=d/2) <1) return c/2*t*t + b;
  9.             return -c/2 * ((--t)*(t-2) - 1) + b;
  10.         };

この関数を使ってm_linearVelocityで与える力の加減を計算しています。
キーを離したときの減速は、Box2Dの摩擦計算に任せているので何もしないでOK。ラクチン。

昔の人はこういうライブラリなしで、ファミコン容量でゼロからマリオとか作ったわけよね。

スゲー!

↓ ソース全部

ACTIONSCRIPT:
  1. package src {
  2.     import Box2D.Collision.b2AABB;
  3.     import Box2D.Collision.b2ContactID;
  4.     import Box2D.Collision.Shapes.b2CircleDef;
  5.     import Box2D.Collision.Shapes.b2PolygonDef;
  6.     import Box2D.Common.Math.b2Vec2;
  7.     import Box2D.Dynamics.b2Body;
  8.     import Box2D.Dynamics.b2BodyDef;
  9.     import Box2D.Dynamics.b2DebugDraw;
  10.     import Box2D.Dynamics.b2World;
  11.     import Box2D.Dynamics.Contacts.b2ContactEdge;
  12.     import flash.display.Sprite;
  13.     import flash.events.Event;
  14.     import flash.events.KeyboardEvent;
  15.     import flash.events.MouseEvent;
  16.     import flash.events.TextEvent;
  17.     import flash.text.TextField;
  18.     import flash.ui.Keyboard;
  19.    
  20.     /**
  21.     * @author okm
  22.     */
  23.     public class LabyrinsSuite extends Sprite{
  24.         private var world:b2World;
  25.         private var square:b2Body;
  26.        
  27.         public function LabyrinsSuite() {
  28.             var textField:TextField = new TextField;
  29.             textField.text = "click me ";
  30.             textField.x = 100;
  31.             textField.y = 100;
  32.            
  33.             textField.selectable = false;
  34.             this.addChild(textField);
  35.            
  36.             stage.addEventListener(MouseEvent.CLICK, go);
  37.         }
  38.        
  39.         public function go(event:MouseEvent):void {
  40.             stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
  41.             stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
  42.             ////////////////////////////////////////
  43.             // 物理エンジンのセットアップ
  44.            
  45.             // 縦横200メートルの世界を作成
  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.             // 部屋の作成 横幅 12M 高さ 8M の部屋を作成
  58.             /////////////////////////////////////////////
  59.             // 床
  60.             // 天井の高さは 8M 床の 中心X座標は 7.5M(真ん中)
  61.             var floorBodyDef:b2BodyDef = new b2BodyDef();
  62.             floorBodyDef.position.Set(6, 8);
  63.            
  64.             // 床の形を、幅12m、厚さ20cmとする
  65.             // 指定するのはその半分の値
  66.             var floorShapeDef:b2PolygonDef = new b2PolygonDef();
  67.             floorShapeDef.friction = 0.1;
  68.             floorShapeDef.SetAsBox(6, 0.1);
  69.            
  70.             // 床を動かない物体として作る
  71.             var floor:b2Body = world.CreateBody(floorBodyDef);
  72.             floor.CreateShape(floorShapeDef);
  73.            
  74.             // 両端の壁 高さは 8M 幅 10cm
  75.             // 左壁
  76.             var leftWallBodyDef:b2BodyDef = new b2BodyDef();
  77.             leftWallBodyDef.position.Set(0.05, 4);
  78.             var wallShapeDef:b2PolygonDef = new b2PolygonDef();
  79.             wallShapeDef.friction = 0;
  80.             wallShapeDef.SetAsBox(0.05, 4);
  81.            
  82.             var leftWall:b2Body = world.CreateBody(leftWallBodyDef);
  83.             leftWall.CreateShape(wallShapeDef);
  84.            
  85.             // 右壁
  86.             var rightWallBodyDef:b2BodyDef = new b2BodyDef();
  87.             rightWallBodyDef.position.Set(11.95, 4);
  88.             var rightWall:b2Body = world.CreateBody(rightWallBodyDef);
  89.             rightWall.CreateShape(wallShapeDef);
  90.            
  91.             ////////////////////////////////////////
  92.             // 箱生命体
  93.             ////////////////////////////////////////
  94.            
  95.             // 箱の位置を左から2.5m、上から1mとする
  96.             var boxBodyDef:b2BodyDef = new b2BodyDef();
  97.             boxBodyDef.position.Set(2.5, 1);
  98.            
  99.             // 箱の幅 60cm 高さ 1M 重さは 30kg とする
  100.             var boxShapeDef:b2PolygonDef= new b2PolygonDef();
  101.             //boxShapeDef.SetAsOrientedBox(0.3, 0.2, new b2Vec2(0, 0), 0.8);
  102.             boxShapeDef.SetAsBox(0.6, 1);
  103.             boxShapeDef.density = 50;        // 密度 [kg/m^2] 30/0.6*1
  104.             boxShapeDef.friction = 0.2;      // 摩擦係数
  105.             boxShapeDef.restitution = 0.3;   // 反発係数、通常は0~1
  106.            
  107.             // 箱を動く物体として作る
  108.             var boxBody:b2Body = world.CreateBody(boxBodyDef);
  109.             boxBody.CreateShape(boxShapeDef);
  110.             // SetMassFromShapes で重力が有効になる
  111.             boxBody.SetMassFromShapes();
  112.             square = boxBody;
  113.            
  114.             // ボール
  115.             var circleDef:b2CircleDef = new b2CircleDef;
  116.             circleDef.radius = 0.5;
  117.             circleDef.density = 0.5;
  118.             circleDef.friction = 0.5;
  119.             circleDef.restitution = 0.5;
  120.             var circleBD:b2BodyDef = new b2BodyDef();
  121.             circleBD.position.Set(2.7,0.5);
  122.             var circle:b2Body = world.CreateBody(circleBD);
  123.             circle.CreateShape(circleDef)
  124.             circle.SetMassFromShapes();
  125.            
  126.             ////////////////////////////////////////
  127.             // 描画設定
  128.             var debugDraw:b2DebugDraw = new b2DebugDraw();
  129.             debugDraw.m_sprite = this;
  130.             debugDraw.m_drawScale = 45; // 1mを45ピクセルにする
  131.             debugDraw.m_fillAlpha = 0.3; // 不透明度
  132.             debugDraw.m_lineThickness = 1; // 線の太さ
  133.             debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
  134.             world.SetDebugDraw(debugDraw);
  135.            
  136.             this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  137.            
  138.         }
  139.        
  140.         private var m_InputL:Number = 0;
  141.         private var m_InputR:Number = 0;
  142.         private var m_InputS:Number = 0;
  143.         private var m_Dir:Number = 0;
  144.         private var moveTime:Number = 0;
  145.        
  146.         // キーが押されたときの処理
  147.         private function keyDownHandler(event:KeyboardEvent):void {
  148.             square.WakeUp();
  149.             if(event.keyCode == Keyboard.LEFT && m_InputL != 1){
  150.                 m_InputL = 1;
  151.                 m_InputR = 0;
  152.                 m_Dir = -1.0;
  153.                 moveTime = 0;
  154.             }
  155.             if(event.keyCode == Keyboard.RIGHT && m_InputR != 1){
  156.                 m_InputR = 1;
  157.                 m_InputL = 0;
  158.                 m_Dir = 1.0;
  159.                 moveTime = 0;
  160.             }
  161.             if(event.keyCode == 83){ // s
  162.                 m_InputS = 1;
  163.             }
  164.         }
  165.         private function keyUpHandler(event:KeyboardEvent):void {
  166.             if(event.keyCode == Keyboard.LEFT){
  167.                 m_InputL = 0;
  168.             }
  169.             if(event.keyCode == Keyboard.RIGHT){
  170.                 m_InputR = 0;
  171.             }
  172.             if(event.keyCode == 83){ // s
  173.                 m_InputS = 0;
  174.             }
  175.         }
  176.  
  177.         private function enterFrameHandler(event:Event):void {
  178.             if (m_InputS == 1) {
  179.                 square.m_linearVelocity.y = -4;
  180.             }
  181.             if (m_InputL> 0) {
  182.                 var leftForce:Number = this.easeInOutQuad(moveTime, 0.5, 6, 30);
  183.                 if (moveTime <30) moveTime++;
  184.                 square.m_linearVelocity.x = -leftForce;
  185.             }
  186.             if (m_InputR> 0) {
  187.                 var rightForce:Number = this.easeInOutQuad(moveTime, 0.5, 6, 30);
  188.                 if (moveTime <30) moveTime++;
  189.                 square.m_linearVelocity.x = rightForce;
  190.             }
  191.             if (world == null) {
  192.                 return;
  193.             }
  194.            
  195.             // Flashはデフォルトで秒間24フレームなので、
  196.             // 物理シミュレーションを1/24秒進める
  197.             world.Step(1 / 24, 10);
  198.         }
  199.        
  200.         /**
  201.          * t = time
  202.          * b = beginning value
  203.          * c = change in value
  204.          * d = duration
  205.          */
  206.         public function easeInOutQuad(t:Number, b:Number, c:Number, d:Number):Number {
  207.             if ((t/=d/2) <1) return c/2*t*t + b;
  208.             return -c/2 * ((--t)*(t-2) - 1) + b;
  209.         };
  210.     }
  211. }

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://parpue.net/web/33/trackback
Listed below are links to weblogs that reference
Box2Dで 四角の一人ボール遊び from parpue.net

Home > Flash | WEB > Box2Dで 四角の一人ボール遊び

リンク
chocolataste-planner
millon

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

Return to page top