In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

なんちゃってセグウェイもどき

Box2Dでセグウェイもどき、もっとちゃんと作ったらいい感じ
はじめてのBox2D
サンプルをちょと変更してみた。
クリックしたらはじまる~。
マウスホイールで拡大縮小(うまく動かせてないw)
Get Adobe Flash player
by teageek 14 Jul 2009
/**
 * Copyright teageek ( http://wonderfl.net/user/teageek )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/k4aE
 */

package{
	/*
      Box2Dでセグウェイもどき、もっとちゃんと作ったらいい感じ
          はじめてのBox2D
          サンプルをちょと変更してみた。
          クリックしたらはじまる~。
          マウスホイールで拡大縮小(うまく動かせてないw)
        */
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	import Box2D.Dynamics.*;
	import Box2D.Dynamics.Joints.*;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.Graphics;
	import flash.events.Event;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.media.SoundMixer;
	import flash.net.URLRequest;

        [SWF(width="465", height="465", frameRate="30", backgroundColor="0x000000")]
	public class SelfBalance extends Sprite{
		public const PLOT_HEIGHT:int = 200;
		public const CHANNEL_LENGTH:int = 256;
		public function SelfBalance():void {
                        clickHandler();
 			stage.addEventListener(MouseEvent.CLICK, clickHandler);
			}

		public function clickHandler(event:MouseEvent=null):void{
			// Add event for main loop
			addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
			// 外枠を定義する
			var worldAABB:b2AABB = new b2AABB();
			worldAABB.lowerBound.Set(-100.0, -100.0);
			worldAABB.upperBound.Set(100.0, 100.0);
			
			//重力を下方向 10m/10m/s^2とする。
			var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
			
			// Allow bodies to sleep
			var doSleep:Boolean = true;
			
			//外枠と重力を指定して、物理エンジン全体をセットアップする
			m_world = new b2World(worldAABB, gravity, doSleep);
			
			var debugDraw:b2DebugDraw = new b2DebugDraw();
			debugDraw.m_sprite = this;
			debugDraw.m_drawScale =100;//= DRAW_SCALE= 100; // 1mを100ピクセルにする
			debugDraw.m_fillAlpha = 0.3; // 不透明度
			debugDraw.m_lineThickness = 1; // 線の太さ
			debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;
			m_world.SetDebugDraw(debugDraw);
			
			stage.addEventListener(MouseEvent.MOUSE_WHEEL,stageMouseWheelHandler);
			function stageMouseWheelHandler(e:MouseEvent):void{
   			 debugDraw.m_drawScale += e.delta*2;
			}

			// Vars used to create bodies
			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			
			
			////////////////////////////////////////
			// 床の設置
			
			// 床の位置を左から2.5m、上から3mとする
			var floorBodyDef:b2BodyDef = new b2BodyDef();
			floorBodyDef.position.Set(2.5, 3);
			 //floorBodyDef.angle=0.08;
			floorBodyDef.angle=0.04;
			// 床の形を、幅20m、厚さ20cmとする
			// 指定するのはその半分の値
			var floorShapeDef:b2PolygonDef = new b2PolygonDef();
			floorShapeDef.SetAsBox(20, 0.1);
			
			var floor:b2Body = m_world.CreateBody(floorBodyDef);
			floor.CreateShape(floorShapeDef);
			//2come
			floorBodyDef.position.Set(10.5, 6);
			floorBodyDef.angle=-0.08;
			
			var floor2:b2Body = m_world.CreateBody(floorBodyDef);
			floor2.CreateShape(floorShapeDef);
			
			//3come
			floorBodyDef.position.Set(40.5, 8);
			floorBodyDef.angle=-0.12;
			
			var floor3:b2Body = m_world.CreateBody(floorBodyDef);
			floor3.CreateShape(floorShapeDef);
			
			
			// 車体
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(2.8, 1);
			
			var bodyShape:b2PolygonDef = new b2PolygonDef();
			bodyShape.SetAsBox(0.1, 0.8);
			bodyShape.density = 1;
			
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(bodyShape);
			body.SetMassFromShapes();
			
			//タイヤを作る
			bodyDef.position.Set(2.8, 2);
			
			var wheelShape:b2CircleDef = new b2CircleDef();
			wheelShape.radius = 0.15;
			wheelShape.density = 10;
			
			var frontWheel:b2Body = m_world.CreateBody(bodyDef);
			frontWheel.CreateShape(wheelShape);
			frontWheel.SetMassFromShapes();
			
			// 車体とタイヤをつなぐ
			// ジョイントを定義するjointDef変数
			var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
			// つながれる2つの物体と、つなぐ位置(前輪の中央)を使って、定義を初期化する
			jointDef.Initialize(body, frontWheel, frontWheel.GetWorldCenter());
			// 回転速度の設定(6秒で1回転ぐらい)
			jointDef.motorSpeed = 1;
			// トルクの設定(大きいほど坂道に強くなる)
			jointDef.maxMotorTorque = 1;
			// 車輪を回すようにする
			jointDef.enableMotor = true;
			
			// 回転ジョイントを作る
			var frontJoint:b2RevoluteJoint = b2RevoluteJoint(m_world.CreateJoint(jointDef));
		}
 		public function Update(e:Event):void{
			//onE();
			m_world.Step(m_timeStep, m_iterations);
			//	for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){
			//普通なら上記で;;見たいのは決まってるので
				var bb:b2Body = m_world.m_bodyList;
                        //var dd:Number= bb.GetAngle()* (180/Math.PI);
                        //trace(dd);
				bb=bb.m_next;	
				var  d:Number= bb.GetAngle()* (180/Math.PI);
				ang.shift();
				trace(ang.length);
				ang.push(bb.GetAngle());
				var g:Number=bb.GetAngularVelocity();
				gyro.shift();gyro.push(g);
				var bj:b2Joint = m_world.m_jointList;
				//trace(b2RevoluteJoint(bj).m_motorSpeed); 
					 
				b2RevoluteJoint(bj).m_motorSpeed=d*15+g*15;
						 //d*100+g*100;
						 //(d+g*150)*10;
						 //g*150;
						 //(d+g*200)*10;
 
		}
		public var gyro:Array= new Array();
		public var ang:Array= new Array();
		public var m_world:b2World;
		public var m_iterations:int = 10;
		public var m_timeStep:Number = 1.0/30.0;
	}
}