弾幕幾何

附録Dは、弾幕シューティングゲーム(以下「弾幕STG」と略記)における「弾幕」の種類や特性の分類を独自の視点からまとめあげた文書です。

  1. データとしての弾幕幾何
  2. 弾幕幾何の分類
  3. 弾幕幾何のオブジェクト指向的実装

本節(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のレーザー描画

まとめ

まとめです。