Skip to content

第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: 現状チェックリスト

完成に必要な項目を確認する

  1. 遊び始められるか
  2. 操作できるか
  3. 失敗条件が動くか
  4. 成功条件またはスコア条件が動くか
  5. 結果が表示されるか
  • 動いていないものは、優先度を付けて次の作業へ回します

実習2: 機能を1つ追加する

優先度の高いものから入れる

  1. スコア表示
  2. リトライ
  3. 効果音
  4. エフェクト
  5. 難易度調整
  • 追加する機能は1つに絞り、動作確認まで行います

実習3: デバッグする

問題を再現して修正する

  1. 不具合を1つ選ぶ
  2. 再現手順を書く
  3. 関係しそうな値を画面に表示する
  4. 原因を1つずつ潰す
  5. 修正後に同じ手順で確認する

今回のまとめ

今日のポイント

  • 拡張は、完成に必要なものから優先します
  • デバッグでは、再現手順と値の確認が重要です
  • リトライや初期化処理は、完成度に大きく関わります
  • 次回はブラッシュアップを行い、提出・発表できる状態へ近づけます

おつかれさまでした!

次回予告 第13回 独自ゲーム制作 4

最後は 仕上げです