おいしいAS3 -30ページ目

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のなかで
完結させなきゃいけないみたいになるようです




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();})

Box2D基本

おいしいAS3-Box2D基本


Box2Dのお勉強を開始しました

とりあえずBox2Dの基本的な使い方の構成

衝突判定となる形状はBox2Dのb2Shapeで
オーサリングとかで描いた形状を
そのままBox2Dでつかうということはできないみたい

その衝突判定の形状となるb2Shapeをつくるにしても
b2Vecっていう点のオブジェクトの配列から作ったりと
もとがC++なだけあってAS3のクラスを全然使ってないです

正直b2VecについてはPointクラスでいいだろうって
カンジなんですが全く自己完結してますね
このBox2Dってライブラリは

Matrixを使う時には…

最近まで知らなくて損してたこと

ある座標を中心に回転する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の拡張クラスでいろいろ簡単にいじれるようになってるクラスです