Coronaの大きな特徴として、描写エンジンと同時にBox2Dによる物理エンジンを利用できることがある。物理エンジンを利用するためには、以下のように「physics」パッケージをrequireし、物理演算を開始するだけでよい。

・「main.lua」のコード

local physics = require "physics"

physics.start()  -- 物理演算を開始

 物理演算の対象となる「物体」は、画面上に作成した描写オブジェクトがそのまま利用できる。物理演算の対象としたい描写オブジェクトを、重さ、摩擦力、反発力などのパラメーターと共にphysicsに追加する。この簡単なサンプルからも、Coronaではアプリ開発時に記述しなければならないプログラムコードが、ごく少なくすむことが分かる。

・「main.lua」のコード

physics.addBody( textObject、{density = 1.0、friction = 0.3、bounce = 0.2} )
physics.addBody( circleObject、{density = 0.5、friction = 1.0、bounce = 0.7} )
physics.addBody( rectObject、{density = 0.7、friction = 0.5、bounce = 0.5} )

 物理エンジンが計算する重力は、標準で下方向に1G(9.8m/s2)となっており、物理演算の対象となる物体には、下方向へと向かう重力が作用する。描写オブジェクトのbodyType属性を変更とすることで、物理エンジンに対して物体の属性を知らせることができる。例えばbodyType属性を「static」とすれば、その物体は重力の影響を受けずに、物理エンジン内の世界で固定された物体として扱われる。

・「main.lua」のコード

rectObject.bodyType = "static"  -- 固定された物体にする

 以上がCoronaにおいて物理エンジンを組み込んだアプリケーションを作成する基本的な流れとなる。先ほど作成した描写オブジェクトを物理エンジンに追加し、アプリケーションを実行すると、以下のように描写オブジェクトが物理エンジン内の世界でシミュレートされ、画面上にその結果が表示される。

図11●物理エンジンを実行したところ
[画像のクリックで拡大表示]

 このように、描写エンジンと物理エンジンが共同して動作し、物理演算の結果がそのまま画面上の描写へと反映される点が、Coronaにおける物理エンジンの特徴となっている。

 上のスクリーンキャプチャで例示したアプリケーションの全ソースコードはわずか18行であり、コメントと空行を除けばたった12ステップしかない。

・「main.lua」のコード

local physics = require "physics"

physics.start()  -- 物理演算を開始

local textObject = display.newText( "Hello、World!"、100、250、nil、48 )  -- テキストオブジェクトを作成
textObject:setTextColor( 255、0、0 )  -- 文字色を設定

local circleObject = display.newCircle(300、450、50)  -- 円形オブジェクトを作成
circleObject:setFillColor(0、255、0)  -- 塗りつぶし色を設定

local rectObject = display.newRect(-100、700、600、400)  -- 矩形オブジェクトを作成
rectObject:setFillColor(0、0、255)  -- 塗りつぶし色を設定

-- 物体として追加
physics.addBody( textObject、{density = 1.0、friction = 0.3、bounce = 0.2} )
physics.addBody( circleObject、{density = 0.5、friction = 1.0、bounce = 0.7} )
physics.addBody( rectObject、{density = 0.7、friction = 0.5、bounce = 0.5} )
rectObject.bodyType = "static"  -- 固定された物体にする