b2BodyをTweenerでコントロール
予測がつかない動きもBox2Dの楽しいところなんだけど、ある程度コントロールしたいところも出てきたりする。
たぶんいろんなアプローチがあるんだと思うけど、ライブラリソース見てもいまいち理解できなかったので、b2Bodyのメソッド、SetXForm()を利用してTweenerで動かす方法を考えてみた。
b2Bodyを継承したmyBodyというオブジェクトを、現在地から右方向へ1(Box2Dの世界換算で)トゥイーンしたい、とした時
var nPotision:b2Vec2 = myBody.GetPosition(); myBody.WakeUP(); Tweener.addTween(nPotision, { x:nPotision+1, time:1, onUpdateParams:[myBody], onUpdate:function( targetBody:b2Body ){ targetBody.SetXForm(this, 0); });
とする。
Tweenerの部分を整理すると
ちなみにfor(){}で囲っても動いたので、複数のオブジェクトを一斉にトゥイーンすることもできる。ProgressionのDocumentEventをほかのキャストで利用する
CastDocumentクラスのresizeCompleteを、CastSpriteとかCastMovieClipで使いたいと思ってやってみた。
最初は
package { import jp.progression.casts.*; import jp.progression.commands.*; import jp.progression.events.*; import jp.progression.loader.*; import jp.progression.*; import jp.progression.scenes.*; import jp.nium.events.DocumentEvent; public class Hoge extends CastMovieClip { public function Thumbnails( initObject:Object = null ) { super( initObject ); } protected override function _onCastAdded():void { addEventListener( DocumentEvent.RESIZE_COMPLETE , onResizeComplete); } protected override function _onCastRemoved():void { removeEventListener( DocumentEvent.RESIZE_COMPLETE, onResizeComplete); } function onResizeComplete( eve:DocumentEvent ):void { // リサイズ完了 } } }
みたいにやってみたけどこれはダメだった。
考えてみればCastMovieClipにDocumentEventがないんだから当たり前なわけで、
addEventListener( DocumentEvent.RESIZE_COMPLETE , onResizeComplete); removeEventListener( DocumentEvent.RESIZE_COMPLETE , onResizeComplete);
の部分を
CastDocument.addEventListener( DocumentEvent.RESIZE_COMPLETE , onResizeComplete); CastDocument.removeEventListener( DocumentEvent.RESIZE_COMPLETE , onResizeComplete);
に変更したら無事動いた。
も一回CastDcumentクラスを継承して書き直しか?とか思ったけど大丈夫で一安心。Progression柔軟だなー。
Box2DのDistanceJoint
box2dでオブジェクト同士を距離ジョイントで接続したとき、デフォルトでは硬い棒のようなもので接続されているかのように動くけど、プロパティをいじることで2つの反応を遅らせたり、減退率を調整できたりできる。
↓参考
http://tinyboat.net/actionscript/box2d-b2distancejoint%E3%82%AF%E3%83%A9%E3%82%B9.html
あと、ジョイントしたオブジェクト同士はデフォルトでは衝突判定が行われない。これが衝突判定するようにするにはジョイントのプロパティcollideConnectedをtrueにすればオッケー。