Clamini library

シューティング用プチエンジン

 シューティングゲーム用の、プチライブラリを作ってみました。 敵の移動パターン、思考パターン、敵弾パターンが登録されていて、呼び出し側にそれらの任意の組み合わせの敵キャラを、 1体ずつ任意のフレームで指定の座標に発生させることができるようになっています。

 それ以外に必要な処理である、自機や敵、弾との衝突消滅判定や、自機の攻撃パターンなどがデフォルトで実装されています。


ライブラリの仕様(搭載されているパターン)

敵AIモード8種
0:なし, 1:ノーマル回避, 2:大回避, 3:超回避, 4:接近型, 5:ポジション重視, 6:玉砕型, 7:バラエティ

敵移動パターン16種
1:直線降下, 2:突撃, 3:サイン波(縦), 4:サイン波(左)
5:サイン波(右), 6:急旋回, 7:低速降下・反転, 8:急降下・急反転
9:高速斜め横断, 10:ホバー・スライダー, 11:ループ, 12:ホーミング・ダッシュ
13:現状維持, 14:バックスタブ, 15:目の前を塞ぐ, 16:ワープ

敵弾パターン8種
0:8WAY, 1:狙撃, 2:2WAY, 3:3WAY, 4:5WAY, 5:3連射, 6:十字, 7:蛇行

自機弾パターン3種
0:3WAY, 1:ウェイブ, 2:前方高速連射

ライブラリの使い方

 5つの外部呼出し用関数が定義されています。

  InitGameSession  
セッション(ゲーム開始時やステージ切り替え時など)の初期化を行います。
引数: なし
モジュール内のグローバルタイマー、無敵フラグ、自機弾および敵弾のすべての管理配列(128個)の生存フラグを 0(クリア)に初期化します。

 OrderSpawnEnemy(enemies, enemy_count, ai_mode, state, x, y, shot_type)  
新しい敵を画面上にスポーン(生成)させます。
引数名:型属性(入出力)説明
enemies:Enemy*inout(参照渡し)敵構造体の配列(配列全体を渡す)
enemy_count:intin(値渡し)enemies配列の要素数
ai_mode:intin(値渡し)適用するAI思考モード(0〜7)
state:intin(値渡し)初期行動パターン(初期状態)
x:intin(値渡し)出現させる初期X座標
y:intin(値渡し)出現させる初期Y座標
shot_type:intin(値渡し)使用する敵弾の攻撃タイプ(0〜7)
配列 enemies から flag == 0(空き枠)を探し、最初に見つかったスロットに指定されたパラメータで敵を1体生成します。初期の射撃タイマーは一律 20 フレームにセットされます。

  MovePlayerAndShoot(key_flags, p_x, p_y, p_speed, shot_timer, weapon_mode)  
キー入力に応じて自機の移動処理、画面外チェック、および自機弾の発射と発射タイマーの更新を行います。
引数名:型属性(入出力)説明
key_flags:intin(値渡し)ビットマスクによる入力フラグ(1: 左, 2: 上, 4: 右, 8: 下, 16: ショット)
p_x:int*inout(参照渡し)自機のX座標
p_y:int*inout(参照渡し)自機のY座標
p_speed:intin(値渡し)自機の移動速度(1フレームあたりの移動ピクセル数) shot_timer:int*inout(参照渡し)自機の連射制御タイマー(0で再発射可能)
weapon_mode:intin(値渡し)自機の武器タイプ(0: 3WAY、1: 特殊弾、2: 高速連射)
移動キーで座標を動かした後、画面(X: 0〜800、Y: 0〜600)の中にクランプします。 ショットキー(16)が押され、かつ発射タイマーが 0 の場合、weapon_mode に応じた軌道・数(2〜3発)の自機弾を空きスロットに生成し、各種ショットタイマーをセットします。

 UpdateGameObjects(enemies, enemy_count, stage, player_x, player_y, score, lives, weapon_mode)  
メインループで毎フレーム呼び出すゲーム内のコアロジックです。弾の移動、各種当たり判定(自機弾vs敵、敵弾vs自機、敵本体vs自機)、 敵のAI移動、および敵の弾発射処理を一括更新します。
引数名:型属性(入出力)説明
enemies:Enemy*inout(参照渡し)敵構造体の配列
enemy_count:intin(値渡し)敵の配列要素数
stage:intin(値渡し)現在のステージ番号(敵弾の速度や発射間隔に影響)
player_x:intin(値渡し)自機の現在のX座標
player_y:intin(値渡し)自機の現在のY座標
score:int*inout(参照渡し)ゲームスコア(敵撃破時に +100 される)
lives:int*inout(参照渡し)残機(被弾時に -1 される)
weapon_mode:intin (値渡し)自機の武器タイプ(自機弾の進行速度判定に使用)
自機弾・敵弾の移動
それぞれの移動ロジックに従って毎フレームの座標を更新(画面外に出た弾はフラグを 0 に)。
当たり判定
弾とオブジェクトの衝突矩形を判定。被弾時、自機なら無敵タイマー(60フレーム)を付与し、残機を減算。
敵AIの計算
ai_mode が1以上の敵は、自機弾が接近するとランダム予測軌道から評価スコア最高値を選択して行動。
敵の通常移動パターン
回避中でない、または ai_mode == 0 の場合は、state(1〜16)に応じた固定・追尾・サイン波・一回転などの特殊なアルゴリズムで移動。
敵弾生成
各敵の shoot_timer が 0 になると、ステージ難易度やAIモードに応じて補正されたインターバルを再設定し、弾を生成。

 GetRenderData(p_inv, pb_f, pb_x, pb_y, eb_f, eb_x, eb_y)  
DLL内部(Fortran側)で隠蔽・管理されている「自機弾」と「敵弾」の描画用データ、およびプレイヤーの無敵状態を描画側にエクスポートします。
引数名:型属性(入出力)説明
p_inv:int*out(参照渡し)自機の現在の無敵残りタイマー
pb_f:int*out(配列渡し)自機弾の生存フラグ配列(要素数128)
pb_x:int*out(配列渡し)自機弾のX座標配列(要素数128)
pb_y:int*out(配列渡し)自機弾のY座標配列(要素数128)
eb_f:int*out(配列渡し)敵弾の生存フラグ配列(要素数128)
eb_x:int*out(配列渡し)敵弾のX座標配列(要素数128、実数からキャスト)
eb_y:int*out (配列渡し)敵弾のY座標配列(要素数128、実数からキャスト)
呼び出し元の言語側が確保したバッファ(各128個のint型配列)に対して、Fortran側で 内部管理している弾情報(player_bullets および enemy_bullets)の現在の状態を一括コピーします。 描画システム側はこのデータを受け取って画面にスプライトをレンダリングします。


ダウンロード

 下のリンクからファイルをダウンロードできます。

 petit_shoot.zip ※ZIP形式で圧縮されてるので、使う前に解凍してね!

 使用ライブラリについて
 本DLLは GNU Compiler Collection (gfortran) を使用してビルドされています。
 これに含まれるランタイムライブラリには、GCC Runtime Library Exception が適用されています。