Box2D基本
Box2Dの基本
まずはベースになるb2Worldオブジェクトを作らなきゃ始まりません
そしてそのb2Worldに何らか形状を加えたいときは
まず形状をb2Shapeでつくっておいて
それをb2WorldにCreateBodyでb2BodyDefから
作ったb2BodyのCreateFixture2で
b2BodyのFixtureにしてやる
というようなカンジにやります
Box2Dの基本のパーツの
オブジェクトになるb2Bodyは
b2Body全体の初期座標や運動と
動くものなのかのタイプを決めるb2BodyDefと
構成するパーツの形状と比重や摩擦を決めるb2Fixutureを
それぞれにもっています
形状はb2Shapeで作られたものじゃなきゃだめなので
オーサリングで描いたものやgraphicsで描いたものを
使いまわすことは基本的にできないようです
しかもこのb2Shapeを作るにしても
基本的に頂点がPointじゃなくb2Vec2という
Box2DにおけるPointクラスみたいなやつなので
形状の作成から全部Box2Dのなかで
完結させなきゃいけないみたいになるようです
まずはベースになるb2Worldオブジェクトを作らなきゃ始まりません
そしてそのb2Worldに何らか形状を加えたいときは
まず形状をb2Shapeでつくっておいて
それをb2WorldにCreateBodyでb2BodyDefから
作ったb2BodyのCreateFixture2で
b2BodyのFixtureにしてやる
というようなカンジにやります
Box2Dの基本のパーツの
オブジェクトになるb2Bodyは
b2Body全体の初期座標や運動と
動くものなのかのタイプを決めるb2BodyDefと
構成するパーツの形状と比重や摩擦を決めるb2Fixutureを
それぞれにもっています
形状はb2Shapeで作られたものじゃなきゃだめなので
オーサリングで描いたものやgraphicsで描いたものを
使いまわすことは基本的にできないようです
しかもこのb2Shapeを作るにしても
基本的に頂点がPointじゃなくb2Vec2という
Box2DにおけるPointクラスみたいなやつなので
形状の作成から全部Box2Dのなかで
完結させなきゃいけないみたいになるようです
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Dynamics.Contacts.*;
import Box2D.Common.*;
import Box2D.Common.Math.*;
//縮小率
var scl=1/5
//ワールドオブジェクト生成
var worldAABB:b2AABB
var wld:b2World
worldAABB= new b2AABB();
worldAABB.lowerBound.Set(-1000.0, -1000.0);
worldAABB.upperBound.Set(1000.0, 1000.0);
wld= new b2World(new b2Vec2(0.0, 10.0),false);
//デバッグ用に可視化
var dbgDraw:b2DebugDraw
dbgDraw= new b2DebugDraw();
dbgDraw.SetSprite(addChild(new Sprite())as Sprite);
dbgDraw.SetDrawScale(1/scl);
dbgDraw.SetFillAlpha(0.3);
dbgDraw.SetLineThickness(1.0);
dbgDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
wld.SetDebugDraw(dbgDraw);
//壁作り
for(var i=0;i<4;i++){
var bdDef=new b2BodyDef()
bdDef.position.Set([5,275,545,275][i]*scl,[200,5,200,395][i]*scl)
wld.CreateBody(bdDef).CreateFixture2(b2PolygonShape.AsBox([5,275][i%2]*scl,[200,5][i%2]*scl))
}
//10個□を作る
for(i=0;i<10;i++){
bdDef=new b2BodyDef()
with(bdDef){
position.Set((i*50+50)*scl,(Math.random()*100+100)*scl)
bdDef.type=b2Body.b2_dynamicBody
angle=Math.random()*Math.PI
linearVelocity=new b2Vec2(Math.random()*400-200,Math.random()*-800)
linearDamping=1/10
}
wld.CreateBody(bdDef).CreateFixture2(b2PolygonShape.AsBox(20*scl,20*scl),1)
}
//フレーム毎にb2WorldにStep、DrawDebugDataさせる
addEventListener(Event.ENTER_FRAME,function(e){wld.Step(0.1,10,10);wld.DrawDebugData();})
Matrixを使う時には…
最近まで知らなくて損してたこと
ある座標を中心に回転するMatrixを作る時
わざわざMatrixのrotateを使ってから
中心にしたい点をtransformPointしたのを
元の点からsubtractしてその分だけtranslate…
とかやってたんですがこれ
fl.motion.MatrixTransformer使えば一発なんですね
知らなくて損してました
↓
回転以外の変形でもある点の座標を原点に変形したようにしたい時も、変形Matrixを作った後
fl.motion.MatrixTransformer.matchInternalPointWithExternal(マトリックス、原点、原点)
とやればマトリックスを、原点として指定した点は変化しないようにできます
これにおなじくfl.motion.Colorもわりと知らずに損してる人いるかも…
こっちはColorTransformの拡張クラスでいろいろ簡単にいじれるようになってるクラスです
ある座標を中心に回転するMatrixを作る時
わざわざMatrixのrotateを使ってから
中心にしたい点をtransformPointしたのを
元の点からsubtractしてその分だけtranslate…
とかやってたんですがこれ
fl.motion.MatrixTransformer使えば一発なんですね
知らなくて損してました
var myMatrix:Matrix=new Matrix()
var originPoint:Point=new Point(275,200)
myMatrix.rotate(45)
var vec=originPoint.subtract(myMatrix.transformPoint(originPoint))
mtx.translate(vec.x,vec.y)
↓
var myMatrix:Matrix=new Matrix()
fl.motion.MatrixTransformer.rotateAroundExternalPoint(myMatrix,275,200,45)
回転以外の変形でもある点の座標を原点に変形したようにしたい時も、変形Matrixを作った後
fl.motion.MatrixTransformer.matchInternalPointWithExternal(マトリックス、原点、原点)
とやればマトリックスを、原点として指定した点は変化しないようにできます
これにおなじくfl.motion.Colorもわりと知らずに損してる人いるかも…
こっちはColorTransformの拡張クラスでいろいろ簡単にいじれるようになってるクラスです
