Skip to content

Sceneの使用方法

a3.Sceneは3D仮想空間を管理するクラスです。オブジェクトの 追加・削除のほか、毎フレームの更新処理(位置計算・物理 シミュレーション・衝突検知)もこのクラスが行っています。

どのViewにも生成時にシーンが1つ入っていて(view.scene)、 普段はそれにadd()するだけで使えます。

  • scene.add(obj) — オブジェクトをシーンに追加します。物理エンジン が有効な場合は物理ワールドへの登録も自動的に行われます。
  • scene.remove(obj) — オブジェクトをシーンから取り除きます。
  • scene.removeAll() — すべてのオブジェクトを取り除きます。

画面(シーン)の切り替え

ゲームでは「スタート画面」「メイン画面」「ゲームオーバー画面」の ように、画面をまるごと切り替えたいことがあります。オブジェクトを 1つずつ入れ替えるのではなく、画面ごとにシーンを作っておいて シーンごと切り替えるのが簡単です。

以下のサンプルでは3つのシーンを用意して、OKボタンとタイマーで 順に切り替えています。

js
import * as a3 from 'a3js';

await a3.initFont('/a3js/assets/M-PLUS-1_Bold.json.zip');
const view = new a3.Window(600,300);

// Viewに最初から入っているシーンをスタート画面として使う
const gameStart = new a3.Text3D('Start Game');
view.scene.add(gameStart);

// メイン画面用のシーンを別に作っておく
const gameMainScene = new a3.Scene();
const obj = await new a3.Acerola3D('/a3js/assets/stk_tux.a3').ready;
gameMainScene.add(obj);

// ゲームオーバー画面用のシーンも作っておく
const gameOverScene = new a3.Scene();
const gameOver = new a3.Text3D('Game Over');
gameOverScene.add(gameOver);

await view.alert('ゲームの準備ができたら「OK」ボタンを押して下さい。');

view.replaceScene(gameMainScene); // メイン画面に切り替え

await a3.asyncSleep(3000);

view.replaceScene(gameOverScene); // ゲームオーバー画面に切り替え

シーンの切り替えは一瞬で終わるので、あらかじめ必要なオブジェクトを 各シーンに読み込んでおけば、画面の切り替えでユーザーを待たせる ことがありません。実際のゲームでは、スタート画面を表示している間に メイン画面用の重いモデルを読み込んでおく、という使い方をします (その実例はサンプルプログラムheavyInit()の解説を参照してください)。

View.replaceScene()

Viewが表示するシーンを切り替えるメソッドです。

js
const oldScene = view.replaceScene(newScene);
  • 引数に渡した新しいシーンの表示がすぐに始まります。カメラは 自動的に新しいシーンへ付け替えられます。
  • 返り値としてそれまで表示していた古いシーンが返ります。古い シーンの中身はそのまま残っているので、またreplaceScene()で 戻れば続きから表示できます。

知っておくと役立つポイントが2つあります。

  • 表示されていないシーンは更新されません。 シーンの更新 (アニメーションや物理シミュレーション)はViewが表示中の シーンにだけ行われるので、切り替え前のシーンは時間が止まった 状態で保存されていると考えてください。
  • 物理ワールドはシーンごとに独立しています。 シーンを作った 時点で(initPhysics()済みなら)そのシーン専用の物理ワールドが 作られます。シーンをまたいだ衝突は起こりません。

詳細はAPIドキュメントを 参照してください。