トップ | 前 | 次
ユーザー入力またはグラフィックを画面に表示するインタラクティブなアプリケーションを作るためには、入力 / 出力機能をサポートするように IRIS/IRIS++ を拡張する必要があります。IRIS/IRIS++ はこのような機能を搭載していませんが、仮想マシン側で入力 / 出力をサポートするエンジンを搭載させることができます。では IRIS/IRIS++ をどのように拡張すればよいでしょうか ?マクロの使用で説明した通り、コンパイル時変換機能を使用して仮想マシン上に実装されたオブジェクトおよびコマンドの定義をします。Ulysses Records が提供する仮想マシン (ulyvm.exe) は UlyGL という基本的なゲーム開発をサポートするゲーム ライブラリが実装されています。
ゲーム エンジンの実装方法は、アプリケーションのアーキテクチャによって 2 通りあります : (1) 実行バイナリに直接埋め込み、または (2) スクリプト ベース。最初の方法はゲーム エンジンを実行バイナリまたは動的ライブラリに実装します。この場合、スクリプトはゲーム エンジンの補助的な役割を果たします (例 : キャラクターのダイアログ メッセージ、デフォルト位置の座標など、リテラル データの定義および呼び出し)。RPG を例にしてみましょう。プレーヤーがフィールドを歩き回り、敵とエンカウントした場合、実行バイナリに実装されたゲーム エンジンの機能が呼び出され、バトル シーンに移行します。(2) の場合、バトル システムを直接実行バイナリに埋め込まずにスクリプトで実装します。
開発者がゲーム エンジンをどのようにデザインしたいのかに左右されるので、どちらの方法が正しいとは一概には言えません。(1) の良いところは、実行バイナリにゲーム エンジンを実装した方が、スクリプトで実装するよりも簡単なことです。ゲーム エンジンをスクリプトで実装する場合、スクリプトは沢山の入力 / 出力機能をサポートする必要があり、高速に実行させる必要があります。ただし、スクリプト ベースのゲーム エンジンにも良い点はあります。一つは、簡単に変更ができるということです。ゲーム エンジンが肥大化すると、実行バイナリのコンパイルにとても時間がかかりますが、スクリプトのコンパイルは数秒で完了します。もう一つの利点は移植性です。スクリプトを一度書いてしまえば、そのコードを変更しなくとも Windows から Linux のように異なるプラットフォームに移行できます。唯一開発が必要なのは入力 / 出力ライブラリだけを実装した仮想マシンです。その反面、実行バイナリにゲーム エンジンを搭載した場合、異なるプラットフォームへの移植のためにゲーム エンジンのコードの見直しが必要になる場合があります。
IRIS/IRIS++ は拡張性に優れ、高速に実行できるように設計されているため、(2) スクリプト ベースのアーキテクチャを選択しました。この項では、仮想マシンに搭載されたすべての拡張機能を参照することができます。
IRIS/IRIS++ は仮想マシンのオブジェクトを参照するメカニズムが備わっています。スクリプトで使用されるオブジェクトは、厳密に言うとオブジェクトではありません。これらはコマンドですが、オブジェクトとして表現した方が直感的に理解しやすいのでそのように進めます。
各オブジェクトには "コマンド" と呼ばれる指示セットがあります。コマンドはオブジェクトの振る舞いを管理するために呼び出されます。オブジェクトは、名前の前に下線があり、子オブジェクトは :: によって分離されます (例 : _screen::_red::set(0);)。コマンドには単一のパラメータを指定することができるものがあります。パラメータは丸括弧の中に数値、文字列またはレジスタとして指定できます。パラメータが省略された場合、仮想マシンが管理する内部文字列バッファの内容がコマンドに自動的に割り当てられます。
最上層の親オブジェクトが仮想マシンを制御します。オブジェクト名は表示されず、:: で表されます。
例 :
// アプリケーション タイトルを指定 _identifier::set("IRIS DEMO"); // メイン画面の幅と高さを指定 _screen::_width::set(640); _screen::_height::set(480); // ゲーム エンジンの初期化 ::initialize();
アプリケーションの ID を制御します。
UlyGL ゲーム エンジンは data/ext ディレクトリ内の外部 XML ファイルの読み込みを可能にします。初期化の際に、ゲーム エンジンは data/ext ディレクトリ内のすべての XML ファイルを検索して、ファイル名を extension オブジェクトの配列に格納します。取得されたファイルは xml オブジェクトの関数を使用して読み込むことができます。extension オブジェクトは 256 個までの XML ファイル名を格納することができます。
[例 : XML ファイルの内容] <?xml version="1.0"?> <iga> <extension> <title>ILLUSION GARDEN</title> <author>TOMOHIRO KADONO</author> <img>illusiongarden\\illusiongarden.bmp</img> <init_script>illusiongarden_init.bin</init_script> </extension> </iga> [サンプル : IRIS/IRIS++ コード] // すべての外部ファイルを事前に読み込む function open_extension_file() { // 外部ファイルが存在するか確認 let $_rgb = _extension::count(); if($_rgb == 0) { return; } let $_rga = 0; do { // インデックス 0 は settings.xml が使用しているため、インクリメント let $_rga++; _xml::use($_rga); let $_rga--; // 外部ファイル名を取得 CLB _extension::seek($_rga); // 外部ファイル名を内部文字列バッファに格納 _extension::get(); // 内部文字列バッファの外部ファイルを開く _xml::open(); let $_rga++; } until $_rga == $_rgb loop; // 読み込み完了後、必ず settings.xml を読み込む様に指定する _xml::use(0); return; }
xml オブジェクトは XML ファイルの入力 / 出力操作およびドキュメントのデータ検索を可能にします。属性を含むタグはサポートされていません。また、単一行に記述された複数タグは認識できない場合があります。つまり、各終了タグの後には改行を入れる必要があります。
// XML ファイルを開く _xml::open("data\\settings.xml"); // XML パスを指定 _xml::_path::set("iga::settings::is_window"); // この時点で、$_ret は iga::settings::is_window の値を格納する let $_ret = _xml::read();
xml::path オブジェクトは XML ファイルに読み書き用の xml パスを格納します。
memory オブジェクトはアプリケーションの初期化時に仮想マシンに割り当てられた静的メモリを管理します。memory オブジェクトは自由に使用できる 4096 個の 32 ビット整数値を含みます。例えば、コード内でメモリ スペースを 8 個の 512 ユニット メモリとしてセグメントを分けることもできます。これらのメモリ データはデータ ファイルに保存またはメモリに読み込むことができます。さらに、データは指定された暗号キーにより XOR で暗号化することもできます。
// すべてのメモリ値を 0 に設定 _memory::initialize(); // 暗号キーを設定 _memory::encrypt(61827); // 内部文字列バッファをクリアして、読み込むデータ ファイルを指定 CLB ATB "data\\save\\save.data" // データ ファイルの名前をバッファから読み込み、値をメモリに保存 _memory::read(); // アドレス 0 までシークして、レジスタ A に取得した値を代入 _memory::seek(0); let $_rga = _memory::get();
内部文字列バッファを管理するオブジェクトです (注意 : 描画バッファは管理しません)。screen::text の補助的な役割として使用することができます。
screen オブジェクトは画面に表示されるすべてのオブジェクトを管理します。screen オブジェクトまたはその子オブジェクトを使用する前に、screen オブジェクトを初期化する必要があります。
// 画面のロード _screen::load(); // 画面の色を黒に設定 _screen::_red::set(0); _screen::_green::set(0); _screen::_blue::set(0); // 画面の更新 _screen::refresh(); // 画面を黒でクリア _screen::clear(); // 描画開始 _screen::begin(); // 画像またはテキストを表示 _screen::end(); // メモリを開放するためにアンロード _screen::unload();
通常 60 FPS の秒間フレームの値情報を保持するオブジェクトです。
// 現在のフレーム カウントを取得 let $_rga = _screen::_frame::get(); // 毎回フレーム カウントが 10 に到達したら、次のステートメントを実行 if($_rga == 10) { // 何かする }
フル スクリーンまたはウィンドウ化されているか、ウィンドウの状態に関する情報を保持するオブジェクトです。
ウィンドウの幅に関する情報を保持するオブジェクトです。
ウィンドウの高さに関する情報を保持するオブジェクトです。
画面の赤色値に関する情報を保持するオブジェクトです。
画面の緑色値に関する情報を保持するオブジェクトです。
画面の青色値に関する情報を保持するオブジェクトです。
高速な描画のためにフォント スプライトを使用したテキスト表示を管理するオブジェクトです。仮想マシンは 2 つの内部文字列バッファを保持することに注意してください。一つ目のバッファは多種類の文字列を操作するために IRIS によって管理されています。もう一つは描画バッファとしてゲーム ライブラリの Screen クラスのインスタンスが管理しています。通常、画面にテキストを描く場合は、内部文字列バッファの内容を描画バッファに転送する必要があります。screen::text オブジェクトのコマンドはこの操作を自動的に行います。しかし、screen::text::buffer を使用して文字列を直接的に描画バッファに転送したい場合もあります。例えば CLB 指示セットで内部文字列バッファをクリアした後に内容を描画バッファに転送したい場合などです。
// 2 つのフォント スプライトを作成 _screen::_text::create(2); // 小さいサイズのフォントをロード _screen::_text::use(0); _screen::_text::_size::set(1024); _screen::_text::load("font_small.lfd"); // 大きいサイズのフォントをロード _screen::_text::use(1); _screen::_text::_size::set(2048); _screen::_text::load("font_normal.lfd"); // 小さいサイズのフォントを使用 _screen::_text::use(0); // アニメーション テキストを X=0、Y=0 の位置に表示 _screen::_text::_x::set(0); _screen::_text::_y::set(0); _screen::_text::set("ANIMATED TEXT"); _screen::_text::play(10); // 大きいサイズのフォントを使用 _screen::_text::use(0); // X=248、Y=352 の位置にテキストを表示 _screen::_text::_x::set(248); _screen::_text::_y::set(352); _screen::_text::set("NEW GAME\n\nCONTINUE"); _screen::_text::show(0); // テキストのアンロード _screen::_text::unload(); [注意 : IRIS の仕様制限のため、空の文字列は割り当てられません。] [つまり、CLB を使用して内部バッファをクリアしてから描画バッファに転送する必要があります。] // 内部文字列バッファをクリア CLB // 内部文字列バッファを描画バッファに転送 _screen::_text::buffer();
フォント スプライトの 0 から 255 までのアルファ値 (透過) の情報を保持するオブジェクトです。
テキストの X 座標位置の値の情報を保持するオブジェクトです。
テキストの Y 座標位置の値の情報を保持するオブジェクトです。
フォント スプライトのサイズの情報を保持するオブジェクトです。多数のフォント画像をサポートするにはサイズを増やしてください。
スプライト (画像) の表示を管理するオブジェクトです。UlyGL にはスクリプトから制御できるスプライト マネージャが搭載されています。スプライトは移動やサイズの変更などができる 3D サーフェイス上に描画されたテクスチャです。
// 2 つのスプライトを作成 _screen::_sprite::create(2); _screen::_sprite::use(0); _screen::_sprite::load("background.bmp"); _screen::_sprite::_x::set(0); _screen::_sprite::_y::set(0); _screen::_sprite::_width::set(512); _screen::_sprite::_height::set(256); _screen::_sprite::_left::set(0); _screen::_sprite::_top::set(0); _screen::_sprite::_right::set(512); _screen::_sprite::_bottom::set(256); _screen::_sprite::_alpha::set(255); _screen::_sprite::use(1); _screen::_sprite::load("image.bmp"); _screen::_sprite::_x::set(0); _screen::_sprite::_y::set(0); _screen::_sprite::_width::set(640); _screen::_sprite::_height::set(480); _screen::_sprite::_left::set(0); _screen::_sprite::_top::set(0); _screen::_sprite::_right::set(640); _screen::_sprite::_bottom::set(480); _screen::_sprite::_alpha::set(200);
スプライトの 0 から 255 までのアルファ値 (透過) の情報を保持するオブジェクトです。
スプライトの X 座標位置の値の情報を保持するオブジェクトです。
スプライトの Y 座標位置の値の情報を保持するオブジェクトです。
スプライトの幅の情報を保持するオブジェクトです。
スプライトの高さの情報を保持するオブジェクトです。
スプライト画像の表示対象の開始上位置の情報を保持するオブジェクトです。
スプライト画像の表示対象の開始左位置の情報を保持するオブジェクトです。
スプライト画像の表示対象の右位置の情報を保持するオブジェクトです。右位置は座標ではなく、左位置からの幅です。
スプライト画像の表示対象の下位置の情報を保持するオブジェクトです。下位置は座標ではなく、上位置からの高さです。
スプライト アニメーションを再生する場合のウェイト タイミングの情報を保持するオブジェクトです (例 : ウェイト タイミングの情報を使用して次のアニメーション フレームの再生タイミングを確定する、など)。
スプライトが所持するアニメーション画像の数の情報を保持するオブジェクトです。sequence が最大ウェイト タイミングと共に設定されていた場合、スプライトは自動的にアニメーションを開始します。画像はすべて同じサイズでベース画像の上から下に連なっている必要があることに注意してください。
スプライトのフェード状態の情報を保持するオブジェクトです。フェードを true に設定すると、フェード フラグが 1 に変わり、false の場合 0 になります。このオブジェクト自体を使用してもフェード イン / フェード アウト効果は得られません。このオブジェクトを使用してフェード ルーチンをコーディングする必要があります。
// IRIS による (ライブラリとしてインクルード可能にするために) フェード イン / フェード アウト機能の例 // スプライト画像のフェード アウト // $_rga : スプライト ID // $_rgb : フェード量 @fade_out_sprite_img: _screen::_sprite::use($_rga); REG $_rga _screen::_sprite::_fade::get(); SKE 1 RET _screen::_sprite::_alpha::get(); SKN 0 RET // フェード アウト SBT $_rgb _screen::_sprite::_alpha::set($_rga); SKE 0 RET _screen::_sprite::_alpha::set(0); _screen::_sprite::_fade::set(0); RET // スプライト画像のフェード イン // $_rga : スプライト ID // $_rgb : フェード量 @fade_in_sprite_img: _screen::_sprite::use($_rga); REG $_rga _screen::_sprite::_fade::get(); SKE 1 RET _screen::_sprite::_alpha::get(); SKN 255 RET // フェード イン SUM $_rgb _screen::_sprite::_alpha::set($_rga); SKL 256 RET _screen::_sprite::_alpha::set(255); _screen::_sprite::_fade::set(0); RET
コマンド カーソルは 3 つの異なるオブジェクトから構成されています。一つはあるコマンドを指すスプライト画像です。二つ目はユーザー入力のためのデバイス入力です。三つ目はユーザー入力の際にカーソルが鳴らす効果音です。IRIS/IRIS++ でのコマンド カーソルの機能をコーディングするのは複雑になるため、UlyGL はコマンド カーソルの振る舞いを管理する cursor オブジェクトを用意しています。通常は、初期化、ユーザー入力の取得およびコマンド カーソルの移動のためのライブラリを作成します。利用可能なライブラリ 関数については UlyGL ゲーム エンジンの cmd_cursor.iris スクリプトを参照してください。
コマンド カーソルのスプライト オブジェクトを管理します。カーソル スプライトは sprite オブジェクトを継承しています (例 : カーソル スプライトのアルファ値を設定した場合、screen::cursor::sprite::alpha を使用します)。
カーソルの水平面プロパティの情報を保持するオブジェクトです。
カーソルの垂直プロパティの情報を保持するオブジェクトです。
カーソルの水平面における最大移動ステップの許容範囲の情報を保持するオブジェクトです。
カーソルの垂直における最大移動ステップの許容範囲の情報を保持するオブジェクトです。
カーソルの単一のステップで移動可能な水平面における最大距離 (ピクセル) の情報を保持するオブジェクトです。
カーソルの単一のステップで移動可能な垂直における最大距離 (ピクセル) の情報を保持するオブジェクトです。
現在カーソルが設置された場所の水平面ステップ情報 (ステップ単位) を保持するオブジェクトです。
現在カーソルが設置された場所の垂直ステップ情報 (ステップ単位) を保持するオブジェクトです。
各コマンド カーソル入力間のウェイト タイミング情報を保持するオブジェクトです (フレーム単位)。
コマンド カーソルのユーザー入力状態の有効または無効を制御するオブジェクトです。0=無効、1=有効。
3D モデルを管理するオブジェクトです。
3D モデルの x 座標オブジェクトを管理するオブジェクトです。
3D モデルの y 座標オブジェクトを管理するオブジェクトです。
3D モデルの z 座標オブジェクトを管理するオブジェクトです。
3D モデルの x 軸のスケールを管理するオブジェクトです。
3D モデルの y 軸のスケールを管理するオブジェクトです。
3D モデルの z 軸のスケールを管理するオブジェクトです。
3D モデルの x 軸の角度を管理するオブジェクトです。
3D モデルの y 軸の角度を管理するオブジェクトです。
3D モデルの z 軸の角度を管理するオブジェクトです。
3D モデルの x 軸の位置を管理するオブジェクトです。
3D モデルの y 軸の位置を管理するオブジェクトです。
3D モデルの z 軸の位置を管理するオブジェクトです。
3D シーン カメラを管理するオブジェクトです。
カメラの x 座標オブジェクトを管理するオブジェクトです。
カメラの y 座標オブジェクトを管理するオブジェクトです。
カメラの z 座標オブジェクトを管理するオブジェクトです。
カメラの x 軸の角度を管理するオブジェクトです。
カメラの y 軸の角度を管理するオブジェクトです。
カメラの z 軸の角度を管理するオブジェクトです。
カメラの x 軸の位置を管理するオブジェクトです。
カメラの y 軸の位置を管理するオブジェクトです。
カメラの z 軸の位置を管理するオブジェクトです。
効果音および音楽のようなメディア オブジェクトを管理します。
効果音の再生を管理するオブジェクトです。
// メディアのロード _media::load(); // BGM 用に 1 つの効果音をロード _media::_sound::create(1); // BGM をロードおよびループ再生 _media::_sound::use(0); _media::_sound::load("my_bgm.ogg"); _media::_sound::play(1); ... // 効果音のアンロード _media::_sound::unload(); // メディアのアンロード _media::unload();
midi を使用した音楽再生を管理するオブジェクトです。
キーボードおよびゲーム パッドなどの外部デバイスを管理するオブジェクトです。通常、これらのオブジェクトを管理するライブラリを書くべきです。利用可能なライブラリ 関数については UlyGL ゲーム エンジンの device_input.iris スクリプトを参照してください。
キーボード入力を管理するオブジェクトです。
キーボードのキーを管理するオブジェクトです。0 から 7 の範囲の 8 個のキー オブジェクトを使用することができます。例えば、'Z' キーを key オブジェクトの 0、'X' を key オブジェクトの 1 に割り当てることができます。
キーボードのキーの状態を管理するオブジェクトです。キーがアクティブの場合 (例 : 押された) 1 を返し、それ以外の場合は 0 を返します。
ジョイ スティック入力を管理するオブジェクトです。通常、これらのオブジェクトを管理するライブラリを書くべきです。利用可能なライブラリ 関数については UlyGL ゲーム エンジンの device_input.iris スクリプトを参照してください。
ジョイ スティックの x 軸を管理するオブジェクトです。
ジョイ スティックの y 軸を管理するオブジェクトです。
ジョイ スティックのボタンを管理するオブジェクトです。0 から 7 の範囲の 8 個のボタン オブジェクトを使用することができます。
ジョイ スティックのボタンの状態を管理するオブジェクトです。ボタンがアクティブの場合 (例 : 押された) 1 を返し、それ以外の場合は 0 を返します。