LoginSignup
4
5

More than 5 years have passed since last update.

box2d.enchant.js で 距離ジョイントを動かすの巻

Posted at

こんばんは。
あいも変わらず広く浅く技術つまみ食いをしています。

最近はenchant.jsに物理エンジンBox2dWebをぶっこんで
動かすことにハマっとります。
↓を参考にしつつ。
【enchant.js】Hello Physical World vol.1【box2d】 - 416番地

↓を聞きながらちんたらちんたらと。
ザ・シネマハスラー 「この空の花-長岡花火物語」 オススメです! - YouTube

いやー、宇多丸さんは本当に映画詳しいし、
何よりあ、これ見ようという気にさせますよね!ね!
特にこの、この空の花のレビューは秀逸で、
大林監督作品のカルト臭い映画を実際に
見てみたくなりますもんね!ね!まだ見てないけどね!

で、box2d.enchant.js で Box2d の距離ジョイント(でいいのかな?)を使用するコードが
探してもあんまり無かったように思うんで晒しておきます。

すみません、テキトーに組んでいるので
メモリリークとか有り得なくないと思いますので
その辺はご了承ください。。。

index.html
<html>
  <head>
    <title>JOINT</title>
    <script type="text/javascript" src="../lib/enchant.js"></script>
    <script type="text/javascript" src="../lib/Box2dWeb-2.1.a.3.js"></script>
    <script type="text/javascript" src="../lib/box2d.enchant.js"></script>
    <script type="text/javascript" src="main.js"></script>
  </head>
  <body>
    <br><br><br><br><br>
    <div id="enchant-stage"></div>
    <br><br><br><br><br>
  </body>
</html>
main.js
var WINDOW_WIDTH  = 320;
var WINDOW_HEIGHT = 320;

enchant();

window.onload = function(){
    var core = enchant.Core( WINDOW_WIDTH, WINDOW_HEIGHT );
    core.onload = function(){
        //物理世界を作成
        var _world = new PhysicsWorld( 0.0, 9.8 );

        //オブジェクトA
        objA = new PhyBoxSprite( 10, 10, enchant.box2d.STATIC_SPRITE,
                                 1.0, 0.5, 0.8, true );
        objA.image = new Surface( 10, 10 );
        objA.image.context.strokeRect( 0, 0, 10, 10 );
        objA.position = { x:160, y:100 };
        core.rootScene.addChild( objA );

        //オブジェクトB
        objB = new PhyBoxSprite( 10, 10, enchant.box2d.DYNAMIC_SPRITE,
                                 1.0, 0.5, 0.8, true );
        objB.image = new Surface( 10, 10 );
        objB.image.context.strokeRect( 0, 0, 10, 10 );
        objB.position = { x:200, y:200 };
        core.rootScene.addChild( objB );

        //距離ジョイント
        var jointDef = new Box2D.Dynamics.Joints.b2DistanceJointDef();
        jointDef.Initialize( objA.body.m_body,
                             objB.body.m_body,
                             objA.body.m_body.GetWorldCenter(),
                             objB.body.m_body.GetWorldCenter()
                             );
        joint = _world.CreateJoint( jointDef );

        //世界を動かす
        core.rootScene.onenterframe = function(e){
            _world.step( core.fps );
        };
    };
    core.start();
};

んで、box2d.enchant.jsのクラスにメソッドを追加します。

box2d.enchant.js
//PhysicsWorldクラス
enchant.box2d.PhysicsWorld = enchant.Class.create({
//中略
//CreateJoint関数を追加。
CreateJoint: function( jointDef ){
    world.CreateJoint( jointDef );
}
});

を追加。

これでぷらぷらぷらーんと動く。はず。(^^;
ちなみにjavascriptとかhtmlは最近触り出したので、
なんかおかしいとこがあるかも知れませんが許してください。。

以上です。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5