なんちゃってセグウェイもどき
Box2Dでセグウェイもどき、もっとちゃんと作ったらいい感じ
はじめてのBox2D
サンプルをちょと変更してみた。
クリックしたらはじまる~。
マウスホイールで拡大縮小(うまく動かせてないw)
/**
* 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;
}
}