附録Dは、弾幕シューティングゲーム(以下「弾幕STG」と略記)における「弾幕」の種類や特性の分類を独自の視点からまとめあげた文書です。
本節(3節)では、前節までの内容を踏まえた上で、なでしこの「グループ」構文を使ってオブジェクト指向的な弾幕幾何実装を実践していきます。
附録Dは、弾幕シューティングゲーム(以下「弾幕STG」と略記)における「弾幕」の種類や特性の分類を独自の視点からまとめあげた文書です。
本節(3節)では、前節までの内容を踏まえた上で、なでしこの「グループ」構文を使ってオブジェクト指向的な弾幕幾何実装を実践していきます。
まずは、ダブルバッファリングや画像のプリロード、回転描画などを行う仕組みが必要です。本編第3章で扱った内容を、グループの形に書き直したものが以下になります:
#-----------------------------------------------------------------------
# 画像用ライブラリ
#-----------------------------------------------------------------------
# プリロード用グループ
■画像群
・{配列}データ
・追加({文字列}FILEを)〜
もしFILEが存在するならば
Nとは整数=データの要素数
データ[N]をイメージとして作成
データ[N]→画像=FILE
データ[N]→可視=オフ
Nを戻す
# ダブルバッファリングなどを行う汎用ライブラリグループ
■描画ライブラリ +イメージ
・{画像群}画像群
・初期化〜
自身を画面クリア
・レンダリング({グループ=?母艦}OBJに|OBJへ)〜
OBJの(0),(0)へ自身を画像コピー
・回転描画(X,YにIDをAだけ)〜
バッファをイメージとして作成
バッファ→可視=オフ
画像群のデータ[ID]をバッファにグループコピー
バッファをAで画像回転
バッファを自身の(X),(Y)へ画像合成
バッファ→壊す
・作る〜
自身のオブジェクトは、VCL_CREATE(自身, 名前, VCL_GUI_IMAGE)
自身の可視はオフ
自身のWは、母艦のW
自身のHは、母艦のH
自身を初期化
描画ライブラリを作る
このように機能を集約したグループを作ることは、プログラムの構造化を考える上でとても有効です。プログラムが少し冗長になるかもしれませんが、変数・関数の名前の衝突を避けたり、コードが持つ意味を明確で分かりやすくするという利点があります。
なお、ダブルバッファリングなどの詳細は本編第3章で述べているので、そちらを参照してください。
クラスのインスタンスを一つしか作らない仕様をシングルトン・パターンと呼びますが、この「描画ライブラリ」グループの使い方はそれに似た感じです。但し、シングルトン・パターンに基く本当のシングルトンクラスでは、複数インスタンスを生成できないことが保障されている必要があります。
描画を行う仕組みが整ったところで、次は弾幕のデータを扱うグループを作ります。この内容は附録D-1節で扱った内容に該当します。
#-----------------------------------------------------------------------
# 基本グループ
#-----------------------------------------------------------------------
■属性
・初期化
■時間プロパティ
・{整数}T{=0}
■角度プロパティ
・{整数}角度
■点
・{数値}X
・{数値}Y
■弾 +時間プロパティ
・{点}速度
・{点}位置
・発展〜
・描画〜
■弾幕群 +弾
・{配列}弾倉
・{属性}描画属性
・装填〜
・発展〜
・描画〜
描画属性を初期化
弾倉を反復
対象→描画
弾幕群の配列型メンバ「弾倉」は、弾幕群自身を要素とする動的グループを想定しています。また、弾倉にデータを追加する「装填」メソッドや時間発展を記述する「発展」メソッドも実際の中身はまだなく、後で再定義するために記述しています。これらのグループは、基本的に継承(グループミックス)して他のグループを作るために使います。
クラスの仕様だけを定めておくものをインターフェースと呼びますが、これらのグループの定義はそれに近いものです。もっとも、本当のインターフェースでは、そのインターフェースに基くクラスを作った場合、インターフェースメソッドなどを厳密に再定義する必要がありますが、このグループをグループミックスする場合ではそのような制約は存在しません。
データの雛型ができたところで、次は具体的な弾幕を扱うグループを作ります。この内容は附録D-2節で扱った内容に該当します。
#-----------------------------------------------------------------------
# 弾
#-----------------------------------------------------------------------
# B-n
■通常弾 +弾 +角度プロパティ
・{整数}画像ID
・描画〜
X1とは整数=位置のX
Y1とは整数=位置のY
IDとは整数=画像ID
Aとは整数=角度
X1,Y1にIDをAだけ描画ライブラリで回転描画
# B-c
■円形弾 +弾
・{整数}直径
・描画〜
X1とは整数=位置のX
Y1とは整数=位置のY
X1,Y1からX1+直径,Y1+直径へ円
# B-l
■レーザー +弾 +角度プロパティ
・{整数}画像ID
・描画〜
※位置からθへ画像IDのレーザー描画