Appearance
第12回 独自要素の追加
前回: 第11回 参照・ポインタ・寿命 / 次回: 第13回 デバッグ・調整・発表
今回の授業内容
- 追加したい要素を小さな仕様に分解する
- 変更するファイルと責務を事前に決める
- 30分から60分で実装できる範囲へ絞る
- 既存クラスの公開関数(インターフェース)を変更する影響を確認する
- デバッグ表示で追加要素を確認する
今回の開始状態
第11回終了時点では、基本の2Dシューティングゲームが動きます
今回の終了時点では、自分で決めた小さな要素を1つ追加します
完成版の仕様にない要素を追加する回ですが、無制限に広げる回ではありません
既存の構造を使って、管理できる範囲で拡張します
追加候補
| 種類 | 例 | 主に変更する場所 |
|---|---|---|
| プレイヤー | 移動速度アップ、無敵時間の長さ変更 | Player、Game |
| 弾 | 斜め弾、2方向ショット、連射速度変更 | Bullet、Game |
| 敵 | 速い敵、横に揺れる敵、HPのある敵 | Enemy、Game |
| スコア | 連続撃破ボーナス、残り時間ボーナス | Game |
| 演出 | エフェクトの色や大きさの変更、被弾時の画面フラッシュ | Effect、Game |
最初は「敵を増やす」ではなく、「横に揺れる敵を1種類追加する」のように、確認できる単位へ小さくします
無敵時間中の点滅のように、すでに第06回で実装済みの演出は候補から外れています
候補表を見て「もう実装済みでは」と感じたものがあれば、この授業でここまで作ってきたコードを見返して確認してください
設計メモを書く
実装前に、次の内容を短く書きます
| 項目 | 書く内容 |
|---|---|
| 追加する機能 | 何を増やすか |
| プレイヤーから見える変化 | 画面上で何が変わるか |
| 変更するファイル | どこを触るか |
| 新しく追加する値 | 変数、定数、列挙値など |
| 成功条件 | 何ができれば完成か |
| 失敗しそうな点 | 衝突、初期化、上限など |
設計メモを書いてからコードを変更します
途中で仕様を大きく変えたくなった場合は、まずメモを更新します
実装例: 弾の連射速度を変更する
小さな拡張の例として、ショット間隔を状況に応じて変えられるようにします
まず、Game側に間隔の候補を定数として用意します
cpp
static constexpr int normalShotInterval = 8;
static constexpr int fastShotInterval = 4;
int shotInterval = normalShotInterval;第07回で作ったPlayer::OnShoot()は、連射間隔を8固定でshotCooldownへ書き込む関数でした
cpp
void Player::OnShoot()
{
shotCooldown = 8;
}この関数に、間隔を引数として渡せるよう変更します
cpp
void Player::OnShoot(int interval)
{
shotCooldown = interval;
}Player.hの宣言も、引数の型に合わせて変更します
cpp
void OnShoot(int interval);呼び出し側は、固定の8ではなくshotIntervalを渡す形に変わります
cpp
player.OnShoot(shotInterval);このように、既存クラスの公開関数(publicな関数)の引数を変更すると、その関数を呼んでいるすべての場所を合わせて直す必要がありますPlayer::OnShoot()はこの授業内で1か所からしか呼ばれていないため影響は小さいですが、複数箇所から呼ばれている関数の引数を変える場合は、呼び出し側をすべて洗い出してから着手します
この程度の変更でも、追加した値、変更した関数の宣言と定義、呼び出し側、操作感の確認が必要です
動作確認
- 追加した要素が画面上で確認できることを確認する
- タイトルから開始しても正しく動くことを確認する
- リトライ後も追加要素が初期化されることを確認する
- クリア、ゲームオーバー、再開の流れが壊れていないことを確認する
- F1のデバッグ表示に必要な値を一時的に追加し、狙いどおりの値になっているか確認する
よくある問題
- 変更箇所が増えすぎた場合は、追加仕様を小さくする
- リトライ後に値が戻らない場合は、
StartGame()や各クラスのReset()を確認する - 既存クラスの責務に合わない処理を入れた場合は、どのクラスが担当すべきか見直す
- 関数の引数を変更した後、呼び出し側の一部だけを直してビルドエラーが解消しない場合は、同じ関数を呼んでいる箇所を検索し、すべて洗い出す
今回の完成条件
- 独自要素の設計メモを書ける
- 変更するファイルと理由を説明できる
- 既存関数の引数を変えた影響を、呼び出し側まで含めて説明できる
- 小さな拡張を実装できる
- 追加後の動作確認手順を説明できる
まとめ
今回は、完成した基本ゲームに独自要素を追加しました
次回は、不具合修正、調整、提出、発表の準備を行います