Home > ActionScript3.0 | Box2D > 円がレールの上を転がり落ちる

円がレールの上を転がり落ちる


以前にBOXがレールの上を滑り落ちるものを作りましたが、それを円がレールの上を転がり落ちる様に変更してみました。

マウスのクリックで、クリックした場所に円が作成され、レールに沿って下に落ちていきます。

JavaScriptを有効にしてご覧ください。

ソースはこんな感じ

package  {
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	import Box2D.Dynamics.*;
	import Box2D.Dynamics.Joints.*;
	import flash.display.*;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	//////////////////////////////////////////////////////////////
	//クリックしたところに円を作成し、レールを滑り落ちてくるFlash
	//////////////////////////////////////////////////////////////
				
	public class DropCircle extends Sprite {
		
		// 物理エンジンの管理クラス
		private var world:b2World;
		
		//コンストラクタ
		public function DropCircle():void {
			
			//外枠の作成
			var s:Sprite = new Sprite();
			s.graphics.lineStyle(3, 0x00FF00);
            s.graphics.moveTo(0, 0);
            s.graphics.lineTo(500, 0);
            s.graphics.lineTo(500, 375);
            s.graphics.lineTo(0, 375);
            s.graphics.lineTo(0, 0);
            this.addChild(s);
			
			//ステージの設定
			stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
			
			////////////////////////////////////////
			// 物理エンジンのセットアップ
			////////////////////////////////////////
			
			// 外枠を定義
			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);
			
			////////////////////////////////////////
			// 床の設置
			////////////////////////////////////////
			
			// 床1を左から1.5m、上から0.75mとする
			var floorBodyDef1:b2BodyDef = new b2BodyDef();
			floorBodyDef1.position.Set(1.5, 0.75);
			floorBodyDef1.angle = 15 * Math.PI / 180;

			// 床1の形を、幅1.5m、厚さ20cmとする
			// 指定するのはその半分の値
			var floorShapeDef1:b2PolygonDef = new b2PolygonDef();
			floorShapeDef1.SetAsBox(0.75, 0.1);
			
			// 床2を左から3m、上から1.65mとする
			var floorBodyDef2:b2BodyDef = new b2BodyDef();
			floorBodyDef2.position.Set(3, 1.65);
			floorBodyDef2.angle = -15 * Math.PI / 180;

			// 床2の形を、幅2m、厚さ20cmとする
			// 指定するのはその半分の値
			var floorShapeDef2:b2PolygonDef = new b2PolygonDef();
			floorShapeDef2.SetAsBox(1, 0.1);
			
			// 床3を左から3m、上から2mとする
			var floorBodyDef3:b2BodyDef = new b2BodyDef();
			floorBodyDef3.position.Set(1.5, 2.5);
			floorBodyDef3.angle = 15 * Math.PI / 180;

			// 床3の形を、幅2m、厚さ20cmとする
			// 指定するのはその半分の値
			var floorShapeDef3:b2PolygonDef = new b2PolygonDef();
			floorShapeDef3.SetAsBox(1, 0.1);

			// 床4を左から3.5m、上から3.5mとする
			var floorBodyDef4:b2BodyDef = new b2BodyDef();
			floorBodyDef4.position.Set(3.5, 3.5);
			floorBodyDef4.angle = 0;

			// 床4の形を、幅2.5m、厚さ20cmとする
			// 指定するのはその半分の値
			var floorShapeDef4:b2PolygonDef = new b2PolygonDef();
			floorShapeDef4.SetAsBox(1.25, 0.1);

			// 上記で設定した床を、それぞれ動かない物体として作成
			var floor1:b2Body = world.CreateStaticBody(floorBodyDef1);
			floor1.CreateShape(floorShapeDef1);
			
			var floor2:b2Body = world.CreateStaticBody(floorBodyDef2);
			floor2.CreateShape(floorShapeDef2);

			var floor3:b2Body = world.CreateStaticBody(floorBodyDef3);
			floor3.CreateShape(floorShapeDef3);
			
			var floor4:b2Body = world.CreateStaticBody(floorBodyDef4);
			floor4.CreateShape(floorShapeDef4);
			
			////////////////////////////////////////
			// 描画設定
			////////////////////////////////////////
			
			var debugDraw:b2DebugDraw = new b2DebugDraw();
			debugDraw.m_sprite = this;
			debugDraw.m_drawScale = 100; // 1mを100ピクセルにする
			debugDraw.m_fillAlpha = 0.75; // 不透明度
			debugDraw.m_lineThickness = 1; // 線の太さ
			debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
			world.SetDebugDraw(debugDraw);
			
			// イベントハンドラを登録する
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		private function clickHandler(event:MouseEvent):void {
						
			////////////////////////////////////////
			// 円の設置
			////////////////////////////////////////
			
			// 円の位置をマウスでクリックした箇所に出現させる
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.position.Set(event.stageX / 100, event.stageY / 100);
			
			// 円の設定(大きさ、バウンドの値など)
			var shapeDef:b2CircleDef= new b2CircleDef();
			shapeDef.radius = 0.25;
			shapeDef.density = 1;
			shapeDef.restitution = 0.25;
			
			// 円を動く物体として作る
			var body:b2Body = world.CreateDynamicBody(bodyDef);
			body.CreateShape(shapeDef);
			body.SetMassFromShapes();
			

		}
		
		private function enterFrameHandler(event:Event):void {
			if (world == null) {
				return;
			}
			// フレームレートを24fpsに設定
			world.Step(1 / 24, 10);
		}
	}
}

今回も『Box2DでActionScript物理プログラミング』(Gihyo.jp)さんの記事を参考にさせていただきました。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://flabaka.com/blog/wp-trackback.php?p=120
Listed below are links to weblogs that reference
円がレールの上を転がり落ちる from flabaka

Home > ActionScript3.0 | Box2D > 円がレールの上を転がり落ちる

Search
Feeds
Meta

flashDevelopスポンサー

Return to page top