Box2D FLASH その1
会社の勉強会でBox2Dについて発表することになったので
まとめのついでに書き込んでみる。
初めてさわったのはけっこう前だけど、サンプル見ても
bdBodyとかb2BodyDefとかb2BoxDefとか・・・何がなんだか
分からなくて放っておいた。。
でも最近久々にやってみたらなんか分かってきました。
といってもちゃんとは理解してないし間違ってることも
多そうだけど一応動くから全然間違ってはいないはず。
とりあえずはBOXを1個作ってみます。
●Box2Dのステージを作成
まずは下記でBox2Dの初期設定。
//Box2Dのステージを作成 var worldAABB:b2AABB = new b2AABB(); worldAABB.minVertex.Set(-1000.0, -1000.0); worldAABB.maxVertex.Set(1000.0, 1000.0); var gravity:b2Vec2 = new b2Vec2(0.0, 100.0); //重力(X方向、Y方向) var doSleep:Boolean = false; //これまだ不明。。 m_world = new b2World(worldAABB, gravity, doSleep);
minVertexとmaxVertexはBox2Dのステージの範囲ですかね。
オブジェクトがこの領域から出ると動かなく(計算されなく)なります。
gravityは重力。X方向、Y方向それぞれに設定できます。
doSleepは中身も見たけど分からず。。これはなんだろ?
●BOXの作成
b2BoxDefとb2BodyDef、見た目似てるからよく間違う。。
Box2Dはb2BoxDef(四角)、b2CircleDef(丸)、b2PolyDef(多角)を使って
オブジェクトを作ります。
でももうちょい複雑な形を作りたい場合もあります。
その場合は複数のb2BoxDef、b2CircleDef、b2PolyDefを「b2BodyDef」で
1つのオブジェクトとしてまとめることができます。
オブジェクトが1つの場合でも「b2BodyDef」でまとめます。
今回の例でも1つだけです。
//BOXの作成
var boxDef:b2BoxDef = new b2BoxDef();
boxDef.extents.Set(40, 20);
boxDef.density = 0.2;
boxDef.friction = 0.8;
boxDef.restitution = 0.6;
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.AddShape(boxDef);
bodyDef.position.x = 200;
bodyDef.position.y = 200;
bodyDef.userData = { };
bodyDef.userData.fillColor = 0xFFCC00;
var body:b2Body = m_world.CreateBody(bodyDef);
これでBOXが1つ作成されます。
これだけじゃ動きませんが、長くなるので今回はこれくらいで。
次回以降、他の部分も書きます。
一応下記のスクリプトで動きます。
BOXが落ちていきます。今回はそれだけです。
package {
import flash.display.Sprite;
import flash.events.Event;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Common.Math.*;
public class Box2D0430Test01 extends Sprite {
public var m_world:b2World;
public var m_iterations:int = 1;
public var m_timeStep:Number = 1/60;
public var m_sprite:Sprite;
public var m_physScale:Number = 1;
function Box2D0430Test01() {
init();
}
public function init():void {
//Box2D 計算&描画用のENTER_FRAMEの設定
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
//シェイプ描画用のSpriteを作成
m_sprite = new Sprite();
addChild(m_sprite);
//Box2Dのステージを作成
var worldAABB:b2AABB = new b2AABB();
worldAABB.minVertex.Set(-1000.0, -1000.0);
worldAABB.maxVertex.Set(1000.0, 1000.0);
var gravity:b2Vec2 = new b2Vec2(0.0, 100.0); //重力(X方向、Y方向)
var doSleep:Boolean = false; //これまだ不明。。
m_world = new b2World(worldAABB, gravity, doSleep);
//BOXの作成
var boxDef:b2BoxDef = new b2BoxDef();
boxDef.extents.Set(40, 20);
boxDef.density = 0.2;
boxDef.friction = 0.8;
boxDef.restitution = 0.6;
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.AddShape(boxDef);
bodyDef.position.x = 200;
bodyDef.position.y = 200;
bodyDef.userData = { };
bodyDef.userData.fillColor = 0xFFCC00;
var body:b2Body = m_world.CreateBody(bodyDef);
}
public function Update(e:Event):void {
//Box2Dに計算をさせる
m_world.Step(m_timeStep, m_iterations);
//シェイプを全て削除
this.m_sprite.graphics.clear();
//シェイプの描画
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
for (var s:b2Shape = bb.GetShapeList(); s != null; s = s.GetNext()) {
drawShape(s, bb.m_userData.fillColor);
}
}
}
public function drawShape(_shape:b2Shape, _fillColor:int = 0xFFFFFF):void {
//シェイプの描画 このへんはコピペで。。
var i:int;
var v:b2Vec2;
var poly:b2PolyShape = _shape as b2PolyShape;
var tV:b2Vec2 = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
m_sprite.graphics.beginFill(_fillColor, 1);
m_sprite.graphics.lineStyle(0, 0, 0);
m_sprite.graphics.moveTo(tV.x * m_physScale, tV.y * m_physScale);
for (i = 0; i < poly.m_vertexCount; ++i){
v = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
m_sprite.graphics.lineTo(v.x * m_physScale, v.y * m_physScale);
}
m_sprite.graphics.lineTo(tV.x * m_physScale, tV.y * m_physScale);
m_sprite.graphics.endFill();
}
}
}
| 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/183790/20482355
この記事へのトラックバック一覧です: Box2D FLASH その1:
コメント