プレイヤーごとに異なる位置を表示する
広いフィールドの一部を画面に表示するようなゲームの場合、マルチプレイではプレイヤーごとに異なる場所を表示したくなることが考えられます。そのような場合のために、Akashic Engine は g.Camera
を提供しています。
カメラ
カメラは、インターフェース g.Camera
で表現されます。現在の Akashic Engine が実装を提供する唯一のカメラは g.Camera2D
です。これは 2D ゲーム用途のカメラであり、次のように生成することができます。
var camera = new g.Camera2D({ game: g.game });
生成されたカメラは、そのままでは描画に影響を与えません。カメラを g.Game#focusingCamera
に設定することで、ゲーム画面の描画に対してカメラの設定を適用することができます。
g.game.focusingCamera = camera;
g.game.modified = true;
Game#focusingCamera
の値を変更した場合、 Game#modified
に真を設定する必要があります。 (他クラスの同名の値と異なり、 Game#modified
は関数ではなく boolean
であることに気をつけてください。これは歴史的経緯によるものです。)
この状態で camera
のプロパティを変更することで、ゲーム画面全体の描画内容を制御することができます。
Camera2D
は Object2D
を実装しており、x
, y
によって描画位置のオフセットや、scaleX
, scaleY
によって描画結果の拡大率を設定できます。たとえば以下のような記述により、画面全体を 30 度傾けることができます。
camera.angle = 30;
camera.modified();
Camera2D
のオフセットや回転角度は、エンティティとは逆方向に作用することに注意してください。すなわち、たとえば X 座標のオフセット Camera2D#x
を 10 に設定した場合、移動するのは描画される範囲です。その中で描画されるエンティティの描画位置は元の位置から (右ではなく) 左に 10 ピクセルずれます。
エンティティなどと同様、カメラの値の変更後には modified()
を呼び出す必要があります。なお Game#focusingCamera
に対して modified()
を呼び出した場合は、上述の game.modified
への真の代入は省略できます。 Game#focusingCamera
の既定値は undefined
です。
カメラの transform の無視
現在の Akashic Engine は、カメラの transform(x
, y
による描画位置オフセットなど)を無視する方法を直接には提供していません。すべてのエンティティは Game#focusingCamera
のオフセットや拡大の影響を受けます。
画面中央に自機を固定したい場合や、「現在のスコア」のようなカメラの影響を受けないエンティティを作成したい場合は、ゲーム開発者が自力でカメラのオフセットなどを引いた(逆変換した)位置に置く必要があります。
別の方法としては、描画処理 E#renderSelf()
をオーバーライドしてこの逆変換するエンティティ (E
) の派生クラスを作り、それを使うこともできます。この方法の実装例としては akashic-engine の DefaultLoadingScene
のソースコードを参照してください。ただし将来的には、この仕様は変更される可能性があります。