C++でシューティングゲームを作りたい。
でも、「どうやって組み立てればいいのか分からない」そんな風に感じていませんか。
実は、C++でシューティングを作るには、適切な発想法を理解することが重要です。
弾幕・AIをどう組み立てるかを理解すれば、初心者でもシューティングゲーム開発を始められるでしょう。
この記事では、C++でシューティングを作る発想法を、弾幕・AIの組み立て方とともに詳しく解説します。
✨ この記事でわかること
- C++でシューティングを作る発想法と基本構造(所要30分)
- 弾幕システムの組み立て方と実装コード(所要1時間)
- AIシステムの組み立て方と状態機械の実装(所要1時間)
- C++シューティング開発でよくある失敗5選と解決方法
- 実用的なシューティングゲーム完成までの5ステップ(合計8時間)

まず基本的な構造を理解してから、弾幕やAIシステムを追加していくのがコツです。段階的に進めましょう。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
C++でシューティングを作る発想法とは?基礎知識から理解する

C++でシューティングを作る発想法とは、C++でシューティングゲームを開発する際の基本的な考え方のことです。
適切な発想法により、効率的に開発を進められるでしょう。
C++でシューティングを作る発想法には、基本的な構造の理解、弾幕システムの設計、AIシステムの設計が重要になります。
基本的な構造を理解することで、システム全体を把握できますね。
弾幕システムとAIシステムを適切に設計することで、面白いシューティングゲームを作れるでしょう。
C++でシューティングを作る際は、DirectXやDxLibなどのライブラリを使うのが一般的です。
これらのライブラリを使うことで、グラフィックや入力処理を簡単に実装できますよ。
ただし、C++はメモリ管理を自分で行う必要があるため、注意が必要です。
発想法に必要な要素
✅ 発想法に必要な要素
- 基本的な構造:ゲームループとオブジェクト管理(所要時間:理解1時間)
- 弾幕システム:弾の生成とパターン管理(所要時間:実装2時間)
- AIシステム:敵の行動パターン(所要時間:実装3時間)
- 当たり判定:弾と敵・自機の当たり判定(所要時間:実装2時間)
基本的な構造とは、ゲームループとオブジェクト管理のことです。
ゲームループは、1フレームごとに更新処理と描画処理を繰り返す仕組みですね。
オブジェクト管理は、弾や敵などのオブジェクトを管理するシステムです。
適切に管理することで、パフォーマンスを維持できますよ。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
弾幕システムの組み立て方

弾幕システムの組み立て方を解説します。
適切な設計により、面白い弾幕を実現できるでしょう。
弾の管理方法
弾は、配列やリストで管理するのが基本です。
DirectXやDxLibを使うことで、効率的に弾を描画できますね。
弾の数を制限し、画面外に出た弾を削除することで、パフォーマンスを維持できます。
弾の数が多すぎると、処理が重くなってしまいます。
目安として、同時に存在する弾の数は500発までに制限するのが適切でしょう。
画面外に出た弾は、即座に削除するか、再利用するプールシステムを使うのがおすすめです。
以下は、基本的な弾の構造体の例です。
|
1 2 3 4 5 6 7 8 9 10 11 |
struct Bullet { float x, y; // 位置 float vx, vy; // 速度 bool active; // アクティブフラグ int type; // 弾の種類 }; // 弾の配列 Bullet bullets[500]; int bulletCount = 0; |
この構造体を使うことで、弾の情報を管理できますね。
activeフラグを使うことで、弾がアクティブかどうかを判定できますよ。
弾幕パターンの設計
弾幕パターンは、角度と速度を使って設計するのが基本です。
円形の弾幕や、扇状の弾幕など、様々なパターンを作れますね。
パターンを関数化することで、再利用しやすくなるのがメリットです。
角度から速度ベクトルへ変換するには、cos関数とsin関数を使います。
速度ベクトルのX成分は、速度×cos(角度)で計算できますよ。
速度ベクトルのY成分は、速度×sin(角度)で計算しましょう。
これにより、角度の方向に速度の大きさで移動するベクトルが得られます。
以下は、円形の弾幕を生成する関数の例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void CreateCircleBulletPattern(float centerX, float centerY, float speed, int count) { for (int i = 0; i < count; i++) { float angle = (360.0f / count) * i; float rad = angle * M_PI / 180.0f; Bullet* bullet = GetInactiveBullet(); if (bullet != nullptr) { bullet->x = centerX; bullet->y = centerY; bullet->vx = speed * cos(rad); bullet->vy = speed * sin(rad); bullet->active = true; } } } |
この関数により、円形の弾幕を生成できますね。
countの数を変えることで、弾の数を調整できますよ。
速度ベクトルを計算する際は、速度の値を適切に設定することが重要です。
一般的には、速度は2.0〜5.0が適切でしょう。
扇状の弾幕パターン
扇状の弾幕は、一定の角度範囲内に弾を配置するパターンです。
プレイヤーの方向を向いた扇状の弾幕を作ることで、難易度を調整できますね。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void CreateFanBulletPattern(float x, float y, float targetX, float targetY, float speed, int count, float spreadAngle) { // プレイヤーへの方向を計算 float dx = targetX - x; float dy = targetY - y; float baseAngle = atan2(dy, dx) * 180.0f / M_PI; for (int i = 0; i < count; i++) { float angle = baseAngle - (spreadAngle / 2.0f) + (spreadAngle / (count - 1)) * i; float rad = angle * M_PI / 180.0f; Bullet* bullet = GetInactiveBullet(); if (bullet != nullptr) { bullet->x = x; bullet->y = y; bullet->vx = speed * cos(rad); bullet->vy = speed * sin(rad); bullet->active = true; } } } |
この関数により、扇状の弾幕を生成できます。
spreadAngleで角度の範囲を調整できるのが便利ですよ。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
AIシステムの組み立て方

AIシステムの組み立て方を解説します。
適切な設計により、面白い敵の行動を実現できるでしょう。
敵の行動パターン
敵の行動パターンは、状態機械を使って実装するのが一般的です。
待機、移動、攻撃などの状態を管理することで、複雑な行動を作れますね。
各状態での行動を定義することで、多様な敵を作れるのがメリットです。
状態機械を使うことで、敵の行動を整理しやすくなりますよ。
以下は、基本的な状態機械の実装例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
enum EnemyState { STATE_IDLE, // 待機 STATE_MOVE, // 移動 STATE_ATTACK, // 攻撃 STATE_RETREAT // 後退 }; struct Enemy { float x, y; float vx, vy; EnemyState state; int stateTimer; float hp; }; void UpdateEnemy(Enemy* enemy, float playerX, float playerY) { enemy->stateTimer++; switch (enemy->state) { case STATE_IDLE: if (enemy->stateTimer > 60) { enemy->state = STATE_MOVE; enemy->stateTimer = 0; } break; case STATE_MOVE: // プレイヤーへ向かって移動 float dx = playerX - enemy->x; float dy = playerY - enemy->y; float dist = sqrt(dx * dx + dy * dy); if (dist > 0) { enemy->vx = (dx / dist) * 2.0f; enemy->vy = (dy / dist) * 2.0f; } enemy->x += enemy->vx; enemy->y += enemy->vy; if (enemy->stateTimer > 120) { enemy->state = STATE_ATTACK; enemy->stateTimer = 0; } break; case STATE_ATTACK: // 弾を発射 CreateFanBulletPattern(enemy->x, enemy->y, playerX, playerY, 3.0f, 5, 30.0f); if (enemy->stateTimer > 30) { enemy->state = STATE_RETREAT; enemy->stateTimer = 0; } break; case STATE_RETREAT: // プレイヤーから離れる float dx2 = enemy->x - playerX; float dy2 = enemy->y - playerY; float dist2 = sqrt(dx2 * dx2 + dy2 * dy2); if (dist2 > 0) { enemy->vx = (dx2 / dist2) * 1.5f; enemy->vy = (dy2 / dist2) * 1.5f; } enemy->x += enemy->vx; enemy->y += enemy->vy; if (enemy->stateTimer > 90) { enemy->state = STATE_IDLE; enemy->stateTimer = 0; } break; } } |
このコードにより、基本的なAIシステムが実装できますね。
状態機械を使うことで、敵の行動を整理しやすくなりますよ。
AIの難易度調整
AIの難易度は、移動速度や攻撃頻度で調整するのが基本です。
簡単な難易度では、移動速度を遅くし、攻撃頻度を下げますね。
難しい難易度では、移動速度を速くし、攻撃頻度を上げるのが一般的です。
難易度に応じて、弾の速度や数も調整すると良いでしょう。
難易度調整のパラメータ:
- 移動速度:簡単1.0〜2.0、普通2.0〜3.0、難しい3.0〜4.0
- 攻撃頻度:簡単120フレーム、普通90フレーム、難しい60フレーム
- 弾の速度:簡単2.0、普通3.0、難しい4.0
- 弾の数:簡単3発、普通5発、難しい7発
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
当たり判定の実装

当たり判定は、シューティングゲームにおいて重要な要素です。
適切に実装することで、正確な衝突判定を実現できるでしょう。
円形の当たり判定
円形の当たり判定は、2つの円の距離を計算することで実装できます。
距離が半径の合計以下であれば、衝突と判定しますね。
|
1 2 3 4 5 6 7 |
bool CheckCircleCollision(float x1, float y1, float r1, float x2, float y2, float r2) { float dx = x2 - x1; float dy = y2 - y1; float dist = sqrt(dx * dx + dy * dy); return dist < (r1 + r2); } |
この関数により、円形の当たり判定を実装できます。
計算量が少ないため、多くのオブジェクトを判定する際に効率的ですよ。
矩形の当たり判定
矩形の当たり判定は、2つの矩形が重なっているかを判定します。
一方の矩形がもう一方の矩形の範囲内にあるかをチェックするのが基本ですね。
|
1 2 3 4 |
bool CheckRectCollision(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2) { return (x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2); } |
この関数により、矩形の当たり判定を実装できます。
矩形の当たり判定は、計算が簡単なのが特徴ですよ。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
C++シューティング開発でよくある失敗5選と解決方法

C++シューティング開発で、初心者が陥りやすい失敗があります。
ここでは、5つのよくある失敗と解決方法を紹介します。
失敗1:メモリ管理を怠る
❌ よくある失敗
- メモリリークが発生する
- newしたメモリをdeleteしない
- 配列の範囲外アクセスが発生する
- 二重削除が発生する
メモリ管理を怠ると、メモリリークやクラッシュが発生してしまいます。
newとdeleteを対にして使うことが重要ですよ。
✅ 正しいアプローチ
- newとdeleteを対にして使う
- スマートポインタ(unique_ptr、shared_ptr)を使う
- 配列の範囲チェックを行う
- RAII(Resource Acquisition Is Initialization)パターンを採用する
失敗2:処理が重くなる
弾や敵の数が増えると、処理が重くなってしまいますね。
画面外のオブジェクトを削除することで、パフォーマンスを改善できますよ。
解決方法:
- 画面外の弾や敵を削除する
- 不要な処理を削減する
- オブジェクトプールを使って再利用する
- 当たり判定の範囲を限定する(近いオブジェクトのみ判定)
失敗3:当たり判定が不正確
当たり判定が不正確だと、プレイヤーが不公平に感じてしまいます。
フレームレートに依存しない判定を行うことが重要ですよ。
⚠️ 解決方法
- フレームレートに依存しない判定を実装する
- 当たり判定の範囲を適切に設定する
- デバッグ用の視覚化を追加する
- 判定の順序を考慮する(移動→判定の順)
失敗4:弾の数が多すぎて処理が重い
弾の数が多すぎると、処理が重くなってしまいますね。
弾の数を制限し、画面外の弾を削除することが重要ですよ。
解決方法:
- 同時に存在する弾の数を制限する(500発まで)
- 画面外の弾を削除する
- オブジェクトプールを使って再利用する
- 描画を最適化する(バッチ描画など)
失敗5:角度計算でエラーが発生する
角度計算で、度数法と弧度法を混同するとエラーが発生します。
cos関数やsin関数は弧度法(ラジアン)を使うため、度数法から変換する必要がありますね。
⚠️ 解決方法
- 角度をラジアンに変換する(angle * M_PI / 180.0)
- atan2関数を使って角度を計算する
- 計算結果の範囲を確認する(-180〜180度など)
- 単位変換を忘れずに行う
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実用的なシューティングゲーム完成までの5ステップ

- STEP1基本的な構造の実装(所要1時間)
ゲームループとオブジェクト管理システムを実装する。
DirectXやDxLibの初期化を行う。
学べること:ゲームループ、オブジェクト管理
成果物:基本的な構造が完成したシステム
- STEP2弾幕システムの実装(所要2時間)
弾の管理システムと基本的な弾幕パターンを実装する。
円形の弾幕と扇状の弾幕を作成する。
学べること:弾の管理、弾幕パターンの設計
成果物:弾幕が発射できるシステム
- STEP3AIシステムの実装(所要3時間)
状態機械を使ったAIシステムを実装する。
待機、移動、攻撃、後退の状態を実装する。
学べること:状態機械、AIの設計
成果物:敵が行動するシステム
- STEP4当たり判定の実装(所要1時間)
円形と矩形の当たり判定を実装する。
弾と敵・自機の当たり判定を実装する。
学べること:当たり判定、衝突検出
成果物:当たり判定が動作するシステム
- STEP5調整と最適化(所要1時間)
パフォーマンスを最適化し、バランスを調整する。
メモリリークがないか確認する。
学べること:最適化、デバッグ
成果物:完成したシューティングゲーム
合計8時間で、実用的なシューティングゲームが完成します。
実装時のチェックリスト
✅ 実装時のチェックリスト
- メモリリークがないか確認(newとdeleteが対になっているか)
- 弾の数が適切か(500発まで)
- 画面外のオブジェクトが削除されているか
- 当たり判定が正確に動作しているか
- フレームレートが安定しているか(60FPS以上)
- 難易度のバランスが適切か
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

C++でシューティングを作るには、適切な発想法を理解することが重要です。
弾幕システムとAIシステムを適切に組み立てることで、面白いシューティングゲームを作れるでしょう。
✅ 記事の要点まとめ
- 発想法:基本的な構造、弾幕システム、AIシステム
- 弾幕システム:弾の管理(配列・リスト)、パターンの設計(円形・扇状)、角度と速度の計算
- AIシステム:状態機械、行動パターン(待機・移動・攻撃・後退)、難易度調整
- 当たり判定:円形・矩形の判定、衝突検出
- よくある失敗5選:メモリ管理、処理が重い、当たり判定が不正確、弾の数が多すぎる、角度計算のエラー
- 実用的なシューティングゲーム:5ステップで完成(合計8時間)
今日から始める3ステップ:
- STEP1:基本的な構造を理解する(所要1時間)
- STEP2:弾幕システムを実装する(所要2時間)
- STEP3:AIシステムを実装する(所要3時間)
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント