【enchant.js】Hello Physical World vol.4【box2d】

4月は更新できずに申し訳ありません。
「Hello Physical World」第4回目は、インスタンス生成時の最後の引数、isSleeping についてです。

isSleeping について、まずリファレンスを確認してみましょう。

 {Boolean} isSleeping Optional
    Spriteが初めから物理演算を行うか.

う~ん、ちょっとイメージしづらいですね。
それなら実際にコードを書いて実験してみましょう。

まずは isSleeping を true にしたパターン。

はい、すーっと落ちてゆきますね。
今度は isSleeping を false に変えて実行してみましょう。

var box = new PhyBoxSprite(96, 16, enchant.box2d.DYNAMIC_SPRITE, 1.0, 0.2, 0.0, false);

……どうなりましたか?
さっきは落ちていったブロックが動かなくなりましたね。
はい、isSleeping はゲーム開始時から物理演算を適用するかどうか指定する引数なんですね。*1

それでは、この Sprite に物理演算を適用させるにはどうすればいいのでしょうか。
ちょっと下のコードを書き足した後、Sprite をタップしてみて下さい。

bar.ontouchstart = function() {
	this.setAwake(true);
};

タップすると Sprite が落ちるようになりましたね。
ここで利用した setAwake 関数は、引数で物理演算の適用を ON/OFF するものなんです。

物理シミュレーションされていない時、物理シミュレーションを行う(sleep時は動かなくなるので)
Parameters:
{Boolean} flag
    物理シミュレーションを行うかどうか

Sprite に物理演算を適用させる方法はもうひとつあります。
今度は下のコードを書き足して実行してみて下さい。

var box = new PhyBoxSprite(16, 16, enchant.box2d.DYNAMIC_SPRITE, 1.0, 0.2, 0.0, true);
box.image = core.assets[MAP2];
box.x = (320 - 16) / 2;
box.y = 16;
core.rootScene.addChild(box);

はい、他の Sprite がぶつかると自動的に物理演算が適用されるようになるんですね。


こうなってくると、Sprite の物理演算適用状態を調べる方法も知りたくなりますよね。
リファレンスを見てみると、その名も sleep というプロパティが紹介されています。

sleep
物理シミュレーションされているか

ちょっと見てみましょう。

var sleep = new Label(String(bar.sleep));
core.rootScene.addChild(sleep);
// onenterframeの中に記述
sleep.text = String(bar.sleep);

……変わらないですね。ずっと true のまま。
ざっとソースコードを確認したところ、原因はbox2dwebの側にあるです。
ちょっと手が出ない(というか出したくない)領域ですね。
他の方法を模索してみましょう。

まずぱっと浮かぶのが、Sprite の速度が格納されている vx 及び vy を調べる方法です。

vx == 0 && vy == 0

ふたつの加速が0であれば Sprite は静止状態にある――つまり物理演算の影響を受けていないと見なすことができます。

そしてもうひとつ―― setAwake があるなら isAwake もあるのではと思った方、鋭い!
isAwake は私も『チョコレート・ドロップ』で使用した関数で、sleep とは異なり Sprite は静止状態をきちんと確認できます。
ただ、残念なことに isAwake にアクセスするには、長い回廊を下らなければなりません。こんな感じです。

Sprite.body.m_body.IsAwake();

今回でインスタンス生成時の引数については終りです。
次回は Sprite に動きを加える関数について説明したいと思います。

*1:isSleeping(寝ているか?)なんだから、true と false が逆でもいいような気がします。