2011-12-01

Box2D(Titanium)サンプルコードを読み下してみよう 第3編 world.js

■ いざ、world.js

いよいよ、最後です。マークの部分で重要なことを書いていますので拾い読みしてください。
Titanium向けBox2DのサンプルであるTiBallの3つめのファイルworld.jsのソースコードを読んでいきたいと思います。


1. world.jsでもui.jsと同じく、まず即時関数でapp.worldのオブジェクトを作ります。あとはここにボディなどを順次載せていきます。


2. まずゲームの世界をつくります。ここではcreateWorldという(カッコイイ)関数だけを使います。引数にはゲーム本体を載せるViewであるgameBoardを、返り値にはworldをもたせます。このworldとは、box2d.createWorldとなっていることからも分かるように、box2dのモジュールの恩恵を受けることのできる重要な部分です。重力/摩擦/衝突などの物理計算をするための設定をしていきます。難しい計算はすべてBox2Dがやってくれます!



3. ゲームの世界を作り込んでいきます。Box2Dらしい大切な要素としては、setGravityという重力を導入できるメソッドや、先述したボディの独特な生成の仕方などがあります。以下に列挙してみます。


Ti.API.info(e); すれば分かりますが、”collision”イベントでは以下の通りの値が返ってきています。
[INFO] {
a = "[object TiBox2dBody]";
b = "[object TiBox2dBody]";
phase = begin;
source = "[object TiBox2dWorld]";
type = collision;
}
つまり、if(e.phase == "begin") {switch(e.a) { … }} で書けば、衝突のpaseが"begin"(始まった時)で、かつ、そのボディ(e.a)ごとに処理を記述できます。e.aとは、具体的には、TiBallのサンプルでは case app.world.hole : で、ゲームの画面底にボールが当たった時の処理が書かれています。

【ToDo】touchmoveイベントで動的なボディに衝突させまくっていると以下のエラーを吐いて落ちる
Assertion failed: (m_world->IsLocked() == false), function SetTransform, file /Users/~/appcelerator-titanium_modules-4e7c145/box2d/mobile/ios/Box2D/Box2D/Dynamics/b2Body.cpp, line 398.


以上です。