Appearance
第12回 C++実践 独自ゲームの制作 3 / 拡張とデバッグ
前回: 第11回 C++実践 独自ゲームの制作 2 / 基本動作の実装 / 次回: 第13回 C++実践 独自ゲームの制作 4 / ブラッシュアップ
前回の振り返り
独自ゲームの基本動作を作りました
- プレイヤーを表示して操作できるようにしました
- 敵や障害物など、ゲームの相手になる要素を追加しました
- 当たり判定やスコア条件を使って、結果までつなげました
- 今回は、遊びやすさを上げながら不具合を減らしていきます
今回の目的
遊びやすさと安定性を上げる
- 操作感、速度、出現間隔を調整する
- スコア、UI、リトライなどを追加する
- 不具合の原因を小さく切り分ける
- 完成に向けて、残り作業を現実的な範囲に絞る
今回の授業内容
C++実践 独自ゲームの制作 3 / 拡張とデバッグ
- 現在の動作をチェックする
- 優先度を付けて機能を追加する
- デバッグ用の表示を入れる
- よくある不具合を潰す
- 完成に必要なものと、余裕があれば入れるものを分ける
拡張とデバッグ
できたものを 遊べるものへ
仕上げ前の 大事な作業です
現状チェック
何ができていて、何が残っているか分ける
- プレイヤーは動くか
- 敵や障害物は出るか
- 当たり判定は正しく動くか
- クリアまたはゲームオーバーになるか
- 結果が表示されるか
- もう一度遊ぶ方法があるか
優先度を付ける
完成に必要なものを先に扱う
| 優先度 | 内容 |
|
|
|
| 高 | 遊び始められる、失敗できる、結果が出る |
| 中 | スコア、音、エフェクト、リトライ |
| 低 | 演出の追加、ステージ追加、細かい見た目 |
- 完成に必要な機能が動く前に、低優先度の作業へ入りすぎないようにします
スコアを表示する
数値で進行状況を伝える
cpp
int score = 0;
if (gameState == Playing)
{
score++;
}
DrawFormatString(20, 20, GetColor(255, 255, 255),
L"SCORE %d", score);- スコアは、遊んだ結果が残るため分かりやすい要素です
- 点数、時間、倒した数など、ゲームに合う形を選びます
リトライを入れる
結果画面から再開できるようにする
cpp
if (gameState != Playing && CheckHitKey(KEY_INPUT_R))
{
gameState = Playing;
score = 0;
player.x = 320;
player.y = 400;
}- リトライでは、必要な値を初期状態に戻します
- 敵、弾、エフェクトなどの配列も空き状態に戻します
- 関数に分けると、初期化処理を使い回しやすくなります
初期化を関数にする
ゲーム開始とリトライで同じ処理を使う
cpp
void ResetGame()
{
player.x = 320;
player.y = 400;
score = 0;
gameState = Playing;
}- 同じ初期化を何度も書くと、戻し忘れが起きやすくなります
- 関数にまとめると、リトライ時にも同じ処理を呼べます
- 引数を使う形に発展させることもできますが、今回は初期化を1か所に集めることを優先します
デバッグ表示
値を画面に出して原因を追う
cpp
DrawFormatString(20, 50, GetColor(255, 255, 255),
L"player x:%d y:%d", player.x, player.y);
DrawFormatString(20, 70, GetColor(255, 255, 255),
L"state:%d", gameState);- 見えない値を画面に出すと、原因を追いやすくなります
- 完成版では消すか、表示切り替えできるようにします
不具合の切り分け
再現できる形にする
どの操作をしたら起きるか
何回に1回くらい起きるか
どの状態で起きるか
直前に変更したコードはどこか
表示した値は想定と合っているか
原因探しでは、感覚より再現手順を優先します
よくある不具合
独自制作で出やすいもの
- 配列の初期化を忘れて、最初から何かが表示される
isActiveを戻し忘れて、同じ場所を再利用できないGameOver後も更新処理が続く- リトライ時に一部の値だけ戻っていない
- スコアやタイマーが結果画面でも増え続ける
調整の考え方
一度に変える値を少なくする
プレイヤー速度
敵の速度
敵の出現間隔
弾の速度
クリアまでの時間
まとめて変えると、どの調整が効いたか分かりにくくなります
実習1: 現状チェックリスト
完成に必要な項目を確認する
- 遊び始められるか
- 操作できるか
- 失敗条件が動くか
- 成功条件またはスコア条件が動くか
- 結果が表示されるか
- 動いていないものは、優先度を付けて次の作業へ回します
実習2: 機能を1つ追加する
優先度の高いものから入れる
- スコア表示
- リトライ
- 効果音
- エフェクト
- 難易度調整
- 追加する機能は1つに絞り、動作確認まで行います
実習3: デバッグする
問題を再現して修正する
- 不具合を1つ選ぶ
- 再現手順を書く
- 関係しそうな値を画面に表示する
- 原因を1つずつ潰す
- 修正後に同じ手順で確認する
今回のまとめ
今日のポイント
- 拡張は、完成に必要なものから優先します
- デバッグでは、再現手順と値の確認が重要です
- リトライや初期化処理は、完成度に大きく関わります
- 次回はブラッシュアップを行い、提出・発表できる状態へ近づけます