これはダイコンが使用するスクリプトはXMLによって表現されます。 XMLの詳細に関してはW3Cのサイトを参照してください。
| <?xml version="1.0" encoding="utf-8"?> | XMLのバージョンと文字コードを指定します |
| <?xml-stylesheet type="text/xsl" href="shooting.xsl"?> | スタイルシートを設定して、WEBブラウザでスクリプトを閲覧できるようにします |
XMLではあらゆる情報はタグで表現されます。 また、本ゲームエンジンにおいてタグで記述する内容はC++やJavaでいうところのクラスに見立てることができます。
開始タグ < [タグ名] 継承="[継承元となるクラスの名前]" 名前="[このクラスの名前]"> 終タグ </ [タグ名]>
開始タグと終タグは必ずセットで使います。 "継承"を指定すると、その継承元で設定された内容をデフォルトとして使うことができます。
これはルートタグです。 XMLヘッダとコメントを除く全てのスクリプトはこのタグに囲まれていなければなりません。
| 位置 | <シューティング>または<場面>の下 |
| 実装されたバージョン | 1.1 |
画面に表示する文字を定義します。 以下のイベントを指定することができます。 各イベントの実行に1フレーム要します。
例:
<テキスト>
<フォント>みかちゃん.ttf</フォント>
<横位置>300</横位置>
<縦位置>200</縦位置>
<サイズ>50</サイズ>
<スタイル> 斜体 と 太字 </スタイル>
<色><赤>255</赤><緑>128</緑><青>128</青></色>
<文字>ほげほげほげほげ</文字>
<時間>50</時間>
<横位置>100</横位置>
<縦位置>100</縦位置>
<サイズ>150</サイズ>
<色><赤>128</赤><緑>128</緑><青>255</青></色>
<文字>ぴよpiyo</文字>
<時間>200</時間>
</テキスト>
| 位置 | <シューティング>の下 |
画面に表示するウィンドウを設定します。 二つ以上設定された場合、最後に設定された内容を採用します。
以下の項目が指定可能です。
画面サイズは、フルスクリーン化を考えると以下の組み合わせがお薦めです。 最近はワイドサイズのディスプレイも増えているので、1440x900という設定も考えられますが、 処理能力的な不安が残ります。
例:
<ウィンドウ>
<幅>320</幅>
<高さ>240</高さ>
</ウィンドウ>
| 位置 | <シューティング>の下 |
他のスクリプトファイルを読み込みます。 ファイル分割の目的に使用します。
| 位置 | <シューティング>または<場面>の下 |
ゲームに登場する物体(オブジェクト)を定義します。
オブジェクトの画像を指定します。 BMP, PNM (PPM/PGM/PBM), XPM, LBM, PCX, GIF, JPEG, PNG, TGA, TIFF のフォーマットを読み込み可能です。 ( 画像の無いオブジェクトを作りたい場合は、無色1pxの画像を作るなどして対応してください。)
通常はpngとjpegで十分だと思います。
| png | 透過色有り | 可逆圧縮 | 自機や敵など、小さなキャラクターに最適 |
| jpeg | 透過色無し | 不可逆圧縮(pngより圧縮率は高いが、画像は荒くなる) | 背景画像に最適 |
画像を表示するレイヤーを指定します。 ダイコンでは一番奥のレイヤーが「0」、一番手前のレイヤーが「4」になっています。
背景は奥のレイヤーに表示して、メッセージやロゴは手前のレイヤーに表示するなどの利用法が挙げられます。
オブジェクトの位置に対して、画像を表示する位置を調整するときに使います。 例えば、横表示位置を-10にすると、画像の表示位置はオブジェクトの座標より左へ10ドットずれます。 余白がある場合や、当たり判定が画像サイズより小さい場合などに使います。
これらのタグはアニメーションを制御するのに使用します。 各コマは<コマ幅>/<コマ高>で指定された長方形で、画像の中で右一列に並んでいるものとします。 <コマ間隔>で指定されたフレーム数ごとに次のコマを表示します。
オブジェクトが出現する位置を指定します。
オブジェクトの初速度を指定します。
オブジェクトのサイズを指定します。 これは当たり判定に使われます。
オブジェクトの活動可能エリアを指定する。 <左境界>はウィンドウの左端からの距離を指定し、<右境界>はウィンドウの右端からの距離を指定します。 上下も同様に上端、下端を基準に指定します。
なお、活動可能エリアの外に出たオブジェクトは消滅します。 この時、被破壊リアクション等のリアクションは作動しません。
オブジェクトの速度は毎フレームごとにこの減衰率で割られることによって減速します。 アクションシーケンス内でこの値を変更することも可能です。
オブジェクトのライフを指定します。 攻撃を受けてこの値が0になった場合は、<被破壊リアクション>が実行されます。
当たり判定の際、オブジェクトを9つのグループに分けて当たり判定を行います。 当たり判定を行うグループの組み合わせは以下の通りです。
| 自機 | 自機弾 | 敵 | 敵弾 | 地形 | 地形弾 | 自機専用地形 | 敵専用地形 | |
| 自機 | - | x | o | o | o | o | o | x |
| 自機弾 | - | - | o | x | o | x | x | x |
| 敵 | - | - | - | x | o | o | x | o |
| 敵弾 | - | - | - | - | o | x | x | x |
| 地形 | - | - | - | - | - | x | x | x |
| 地形弾 | - | - | - | - | - | - | x | x |
| 自機専用地形 | - | - | - | - | - | - | - | x |
| 敵専用地形 | - | - | - | - | - | - | - | - |
( o: 当たり判定を行う, x: 当たり判定を行わない)
オブジェクトは毎フレームごとにこの<アクションシーケンス>に登録されたコマンドを実行します。 詳しくは アクションシーケンス を参照してください。
オブジェクトが他のオブジェクトと衝突したとき、ここに登録されたコマンドを実行します。 ただし、1フレーム制限があります。 詳しくは アクションシーケンス を参照してください。
オブジェクトが衝突してダメージを受けたとき、<衝突リアクション>を実行したあとに、ここに登録されたコマンドを実行します。 ただし、1フレーム制限があります。 詳しくは アクションシーケンス を参照してください。
オブジェクトのライフが0になったとき、ここに登録されたコマンドを実行します。 ただし、1フレーム制限があります。 詳しくは アクションシーケンス を参照してください。
オブジェクトが衝突してパワーをもらったとき、<衝突リアクション>, <被ダメージリアクション>を実行したあとに、 ここに登録されたコマンドを実行します。 ただし、1フレーム制限があります。 詳しくは アクションシーケンス を参照してください。
他のオブジェクトと衝突したとき、衝突した相手に与えるダメージ量を指定します。
他のオブジェクトと衝突したとき、この値が大きいと相手を弾き飛ばすことができます。
計算式:
自分の速度 -= 相手の弾性/自分の弾性 相手の速度 += 自分の弾性/相手の弾性
各オブジェクトを操作するために、キーボードからの入力とアクションシーケンスを結びつけます。 詳しくは アクションシーケンス を参照してください。
また、アクションシーケンスを使ってこれらの入力の有効/無効を切り替えることができます。
この登録に対する名前をつけます。 他のオブジェクトで同じ名前で登録しようとすると、上書きされます。
登録するキーボードのボタン名を指定します。 他の登録と重複しても構いません。 ( つまり、Aを押すとオブジェクトAとオブジェクトBが一斉に砲撃を開始するなんてこともできます。)
名前については、キーボードのボタン名を参照してください。
登録したボタンが押されたとき、ここに登録されたコマンドを実行します。
登録したボタンが離されたとき、ここに登録されたコマンドを実行します。
各場面に登場するオブジェクトを指定します。
文字、または画像のラベルを定義します。
文字か、ファイル名のどちらかを指定します。 (両方していした場合、文字を指定したとみなします。)
ラベルの表示位置を指定します。
ラベルの移動速度を指定します。 毎フレーム、指定したドット数だけ移動します。 ( 減衰率の影響は受けません。)
指定したフレーム数の間だけ存在します。 ( デフォルト値はint型の最大値としているため、プラットフォームに依存します。 )
<演出>でフェードインを選んだ場合、ラベルの出現が完了してからの存在期間(フレーム数)を指定します。
<文字>を指定した場合に限り、演出を指定することができます。
<文字>を指定した場合に限り、文字の色を指定することができます。
フレーム数を指定します。これは絶対値ではなく、前回の<時間>からの累積値となります。 例えば、
<場面>
<時間>100</時間>
<オブジェクト 継承="ほげほげ"/>
<時間>100</時間>
<オブジェクト 継承="ほげほげ2号"/>
</場面>
の場合、「ほげほげ」は場面開始から100フレーム後に出現します。
そして、「ほげほげ2号」はその100フレーム後(場面開始から200フレーム後)に出現します。
効果音を再生します。 爆発音やサウンドエフェクトの再生に使います。 <音楽>との違いは<チャンネル>を指定できることにあります。
利用可能なフォーマット:
0から2までの数値を指定できます。 ことなるチャンネルなら同時に演奏できます。
音のループ回数を指定します。 0ならループしません。1なら1回ループします(つまり2回演奏することになります)。 -1なら無限ループします。
BGMを再生するのに使います。 <効果音>と違い、フェードインやフェードアウトなどの効果も使えます。
利用可能なフォーマット:
音楽のループ回数を指定します。 0ならループしません。1なら1回ループします(つまり2回演奏することになります)。 -1なら無限ループします。
音の再生開始の方法を指定します。
フェードインの時間をミリ秒単位で指定します。
演奏中の音楽を停止します。
音楽の停止方法を指定します。
フェードアウトの時間をミリ秒単位で指定します。
フェードアウト中に<音楽>が実行されると、フェードアウトが完了するまでシステム全体がストップするので注意してください。
背景画像を指定します。 指定した画像は左上に詰めて、タイル上に並べられます。
背景画像のファイルを指定します。
背景画像のスクロール速度を指定します。
背景の存在時間をフレーム数で指定します。
場面の移り変わりを制御します。
移動先の場面の名前を指定します。
移動の種類を指定します。
オブジェクトを指定できます。 オブジェクトを参照してください。
当たり判定を持つだけのオブジェクトです。 自機や敵の行動制限に使います。 また、オブジェクトの衝突によって境界線自身が動くことはありません。
境界線の位置を指定します。
境界線のサイズを指定します。
境界線の存在期間を指定します。
当たり判定に用いる、境界線の種類を指定します。 種類を参照してください。
衝突時の跳ね返り具合を指定します。 弾性を参照してください
| 位置 | <オブジェクト>, <アクションシーケンス>, <衝突リアクション>, <被ダメージリアクション>, <パワーアップリアクション>, <被破壊リアクション>, <押したとき>, <離したとき>の下 |
オブジェクトの行動(アクション)を羅列したもの(シーケンス)です。
また、アクションシーケンスの中にアクションシーケンスを書くこともできます。
1フレーム制限について: コマンドによっては0フレームで終了するものと、1フレーム以上消費するものがあります。 1フレーム制限下では実質的に0フレームで終了するコマンドしか実行できません。
時間あるいはフレーム数を指定するコマンドは全て1フレーム以上消費するものとみなします。
オブジェクトを毎フレームごとに指定された推進力で加速させます。
毎フレームごとに指定された推進力をオブジェクトの速度に加えます。
指定されたフレーム数の間、移動を続けます。
特定の位置に向かってオブジェクトを加速させます。
毎フレームごとに指定された速度で加速します。
オブジェクトが向かう位置を指定します。
指定されたフレーム数の間、場所移動を続けます。
指定されたフレーム数の間、現在の速度(進路)を維持します。
現在の進路を指定した度数だけ、時計回りに回転させます。
指定したフレーム数の間、何もしません。 ただし、現在の速度が0になるわけではなく、また、他のオブジェクトとの衝突によって受ける反動も0にはなりません。
オブジェクトを発射します。
発射側オブジェクトの中心を(0, 0)をして、発射するオブジェクトの出現位置を指定します。
発射するオブジェクトの初速度を指定します。
通常、アニメーションのコマは横一列に並んでいますが、 このコマンドによって、「行」を指定することができます。
これによって、一番上から、「右向きのアニメーション」、「下向きのアニメーション」、「左向きのアニメーション」などというように いくつも行を作って「方向」を表現できます。 しかしながら、速度によって自動的に表示する行を変更するような仕様ではありません。
オブジェクトを消滅させます。 このとき、「被破壊リアクション」は実行されません。
減衰率を指定した数値に変更します。
指定した種類のオブジェクトを追尾することができます。 しかしながら、特定の敵、あるいは自機を追尾することはできません。
指定した速度で追尾します。
登録したオブジェクトはその種類ごとに内部のリストに登録されています。 通常、自機の0番目は今自分が操作している自機になります。 敵の0番目は画面の中にいる敵の中でもっとも最初に画面に現れたものになります。
もし指定した番号にオブジェクトが居ない場合は、0番目が追尾対象になります。
追尾する相手の種類を指定します。
指定されたフレーム数の間、追尾を行います。
追尾のために働く力とは別に、毎フレームごとにかかり続ける加速度です。
それぞれ指定された値を速度に乗算します。 これによって、縦方向にしか追尾しない/横方向にしか追尾しないなどといった動きが可能になります。
アクションシーケンスの実行回数を指定します。
効果音を再生します。<効果音>を参照してください。
指定されたスコアを加算します。 しかし、現バージョンではスコアを表示する機能はありません。
現在の場面を破棄して、指定された場面に移動します。
現在の場面を保存して、指定された場面に移動します。
現在の場面を終了します。 保存された場面がある場合は、そちらへ移動します。
Library.cppより抜粋
// キーボードマッピング
keyboardMap["上"] = SDLK_UP;
keyboardMap["下"] = SDLK_DOWN;
keyboardMap["左"] = SDLK_LEFT;
keyboardMap["右"] = SDLK_RIGHT;
keyboardMap["スペース"] = SDLK_SPACE;
keyboardMap["改行"] = SDLK_RETURN;
keyboardMap["バックスペース"] = SDLK_BACKSPACE;
keyboardMap["タブ"] = SDLK_TAB;
keyboardMap["エスケープ"] = SDLK_ESCAPE;
keyboardMap["ダラー"] = SDLK_DOLLAR;
keyboardMap["アンパーサンド"] = SDLK_AMPERSAND;
keyboardMap["左かっこ"] = SDLK_LEFTPAREN;
keyboardMap["右かっこ"] = SDLK_RIGHTPAREN;
keyboardMap["アスタリスク"] = SDLK_ASTERISK;
keyboardMap["プラス"] = SDLK_PLUS;
keyboardMap["カンマ"] = SDLK_COMMA;
keyboardMap["マイナス"] = SDLK_MINUS;
keyboardMap["ピリオド"] = SDLK_PERIOD;
keyboardMap["スラッシュ"] = SDLK_SLASH;
keyboardMap["0"] = SDLK_0; // 大文字注意
keyboardMap["1"] = SDLK_1;
keyboardMap["2"] = SDLK_2;
keyboardMap["3"] = SDLK_3;
keyboardMap["4"] = SDLK_4;
keyboardMap["5"] = SDLK_5;
keyboardMap["6"] = SDLK_6;
keyboardMap["7"] = SDLK_7;
keyboardMap["8"] = SDLK_8;
keyboardMap["9"] = SDLK_9;
keyboardMap["コロン"] = SDLK_COLON;
keyboardMap["セミコロン"] = SDLK_SEMICOLON;
keyboardMap["小なり"] = SDLK_LESS;
keyboardMap["等号"] = SDLK_EQUALS;
keyboardMap["大なり"] = SDLK_GREATER;
keyboardMap["クエスチョンマーク"] = SDLK_QUESTION;
keyboardMap["@"] = SDLK_AT;
keyboardMap["左ブラケット"] = SDLK_LEFTBRACKET;
keyboardMap["右ブラケット"] = SDLK_RIGHTBRACKET;
keyboardMap["キャレット"] = SDLK_CARET;
keyboardMap["アンダースコア"] = SDLK_UNDERSCORE;
keyboardMap["バッククォート"] = SDLK_BACKQUOTE;
keyboardMap["バックスラッシュ"] = SDLK_BACKSLASH;
keyboardMap["a"] = SDLK_a;
keyboardMap["b"] = SDLK_b;
keyboardMap["c"] = SDLK_c;
keyboardMap["d"] = SDLK_d;
keyboardMap["e"] = SDLK_e;
keyboardMap["f"] = SDLK_f;
keyboardMap["g"] = SDLK_g;
keyboardMap["h"] = SDLK_h;
keyboardMap["i"] = SDLK_i;
keyboardMap["j"] = SDLK_j;
keyboardMap["k"] = SDLK_k;
keyboardMap["l"] = SDLK_l;
keyboardMap["m"] = SDLK_m;
keyboardMap["o"] = SDLK_o;
keyboardMap["p"] = SDLK_p;
keyboardMap["q"] = SDLK_q;
keyboardMap["r"] = SDLK_r;
keyboardMap["s"] = SDLK_s;
keyboardMap["t"] = SDLK_t;
keyboardMap["u"] = SDLK_u;
keyboardMap["v"] = SDLK_v;
keyboardMap["w"] = SDLK_w;
keyboardMap["x"] = SDLK_x;
keyboardMap["y"] = SDLK_y;
keyboardMap["z"] = SDLK_z;
keyboardMap["削除"] = SDLK_DELETE;
keyboardMap["テンキー0"] = SDLK_KP0;
keyboardMap["テンキー1"] = SDLK_KP1;
keyboardMap["テンキー2"] = SDLK_KP2;
keyboardMap["テンキー3"] = SDLK_KP3;
keyboardMap["テンキー4"] = SDLK_KP4;
keyboardMap["テンキー5"] = SDLK_KP5;
keyboardMap["テンキー6"] = SDLK_KP6;
keyboardMap["テンキー7"] = SDLK_KP7;
keyboardMap["テンキー8"] = SDLK_KP8;
keyboardMap["テンキー9"] = SDLK_KP9;
keyboardMap["テンキーピリオド"] = SDLK_KP_PERIOD;
keyboardMap["テンキー割り算"] = SDLK_KP_DIVIDE;
keyboardMap["テンキーかけ算"] = SDLK_KP_MULTIPLY;
keyboardMap["テンキーマイナス"] = SDLK_KP_MINUS;
keyboardMap["テンキープラス"] = SDLK_KP_PLUS;
keyboardMap["テンキーエンター"] = SDLK_KP_ENTER;
keyboardMap["テンキーイコール"] = SDLK_KP_EQUALS;
keyboardMap["ホーム"] = SDLK_HOME;
keyboardMap["エンド"] = SDLK_END;
keyboardMap["ページアップ"] = SDLK_PAGEUP;
keyboardMap["ページダウン"] = SDLK_PAGEDOWN;
keyboardMap["ファンクションキー1"] = SDLK_F1;
keyboardMap["ファンクションキー2"] = SDLK_F2;
keyboardMap["ファンクションキー3"] = SDLK_F3;
keyboardMap["ファンクションキー4"] = SDLK_F4;
keyboardMap["ファンクションキー5"] = SDLK_F5;
keyboardMap["ファンクションキー6"] = SDLK_F6;
keyboardMap["ファンクションキー7"] = SDLK_F7;
keyboardMap["ファンクションキー8"] = SDLK_F8;
keyboardMap["ファンクションキー9"] = SDLK_F9;
keyboardMap["ファンクションキー10"] = SDLK_F10;
keyboardMap["ファンクションキー11"] = SDLK_F11;
keyboardMap["ファンクションキー12"] = SDLK_F12;
keyboardMap["ファンクションキー13"] = SDLK_F13;
keyboardMap["ファンクションキー14"] = SDLK_F14;
keyboardMap["ファンクションキー15"] = SDLK_F15;