LoginSignup
2
2

More than 5 years have passed since last update.

enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル(11)物理演算スプライトを使う

Last updated at Posted at 2015-01-25

ここでは、「game01」というディレクトリ内で作業しているという前提で説明しています。

※enforceの現在のバージョンでは、tmlib.jsで物理演算スプライトが使えません。

box2dを使った物理演算スプライトを使う

enchant.jsには、box2dライブラリを使った専用のライブラリがあります。
enforceでは標準で物理演算ライブラリが読み込まれますので、システム側で特になにかする必要はありません。

地面を表示する

物理演算スプライトは、動的属性を付けた場合は重力によって延々と下へ落ちていってしまうため、地面となるオブジェクトを生成します。
まずは地面に使うスプライト画像をプリロード一覧に追加します。
environ.coffee」を開き、

    bear    : 'media/picture/chara1.png'

の下に、

    ground  : 'media/picture/controlplane.png'

を追記してください。
この「controlplane.png」は、スマートフォンでタッチ操作を受け取るプレーンに使用する透明な画像なのですが、とりあえずはこれを使っておきます。
 次に「enforceMain.coffee」を開き、「constructor」メソッドの最後に下記を追記してください。

        box2dGround = addObject
            image: 'ground'
            width: SCREEN_WIDTH
            height: 32
            x: SCREEN_WIDTH / 2 
            y: SCREEN_HEIGHT
            rigid: true
            kind: STATIC_BOX
            animlist: [
                [100, [0]]
            ]   

表示に使用する画像として、先ほどプリロード一覧に追加した「ground」を使っています。
ここで注目するのは、

            rigid: true
            kind: STATIC_BOX

です。
スプライト生成の際に「rigid」パラメータを「true」にすることで、物理演算スプライトになります。
物理演算スプライトには4種類あり、

  1. DYNAMIC_BOX
  2. DYNAMIC_CIRCLE
  3. STATIC_BOX
  4. STATIC_CIRCLE

という定数で「kind」パラメータで指定します。
DYNAMIC」で始まるものは、重力の影響を受け下に落ちていきます。
STATIC」で始まるものは、重力の影響を受けないので、その場に静止しています。
STATIC」で始まる物理演算スプライトは、見た目は通常のスプライトと同じですが、通常のスプライトは物理演算スプライトとの物理衝突処理が行われません。
 「enforceMain.coffee」に追記し、コンパイルされましたらWebブラウザをリロードしてみてください。
画面再下段に赤い枠が出て、物理演算スプライトが生成されているのが分かります。

物理演算キャラを生成する

次に、「gameControl.coffee」の「when 1」の最後にある「@nextjob()」の直前に、下記のコードを追記してください。

                for i in [0...5]
                    box2dObj = addObject
                        image: 'bear'
                        motionObj: enemy01
                        width: 32
                        height: 32
                        x: SCREEN_WIDTH / 2 + (rand(6) - 3)
                        y: 0
                        rigid: true
                        kind: DYNAMIC_BOX
                        density: 1.0
                        friction: 0.1
                        restitution: 0.9
                        animlist: [
                            [50, [0, 1, 2, 1]] 
                        ] 

 今度は、「DYNAMIC_BOX」で物理演算スプライトを生成しています。
動きを定義するクラスとして「enemy01」を指定していますので、画面の左右を越えてしまう時の対処が行われるので、画面外に消えることはありません。
density」で質量、「friction」で摩擦係数、「restitution」で反発力を指定します。

 それでは、保存しコンパイルし、Webブラウザをリロードしてみてください。
「z」キーを押してゲームを開始すると上から5匹のクマが落ちて来ると思います。
そして、最初に生成した地面の物理演算スプライトに衝突すると弾け飛びます。

チュートリアル(10) <--- ⬛︎ ---> チュートリアル(12)


enforceチュートリアル一覧

2
2
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
2
2