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の部分を整理すると

  1. まずnPotisionのプロパティ.xをトゥイーンするようにする。
  2. でその.xが更新される度に(onUpdate)、myBodyを引数にして(onUpdateParams)*1、SetXForm()が実行される*2

ちなみにfor(){}で囲っても動いたので、複数のオブジェクトを一斉にトゥイーンすることもできる。

*1:myBodyを引数にしているのは、こうしないとmyBodyを参照できないから。

*2:SetXForm(this, 0)のthisは、nPotision自身を指してる(0は角度の指定)。

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にすればオッケー。