【C++初心者必見】C++でのゲーム開発方法と開発環境の準備方法を徹底解説!
はじめまして、エンジニアスタイル編集部です!
コラムページでは、ITフリーランスに向けてお役立ち情報を発信します。Twitterではホットな案件を紹介してまいりますので、ぜひフォローをお願いいたします!
本記事が、皆様の参考になれば幸いです。
経験がまだ少ない方にもわかりやすく説明するために、初歩的な内容も記載しております。記事も長いので、実務経験豊富な方は、ぜひ目次から関心のある項目を選択してください。
エンジニアスタイルは、最高単価390万円、国内最大級のITフリーランス・副業案件検索サービスです。C++のフリーランス・副業案件一覧を以下からご覧いただけますのであわせてご確認ください。
目次
C++でのゲーム開発の準備について
まずC++でのゲーム開発に入る前段階としての基礎知識・事前準備が必要です。
開発の規模によっても準備の幅は変わりますが、参考にしてみてください。
C++の基礎学習
ゲーム開発には、C++の基本的な文法や構文、データ型、関数などを理解する必要があり、そのためにまずはC++を学ぶための本やオンラインのチュートリアルを読み、基本的なC++プログラムを書く練習をしておく必要があります。
ゲームエンジンの選択
C++でゲームを開発する際には、ゲームエンジンを使用することが一般的で、有名なゲームエンジンには、Unreal EngineやUnityなどがあります。
Unreal Engineは、Epic Gamesによって開発されたゲームエンジンで、高品質のグラフィックスとリアルな物理エンジンを備え、リアルタイムでの映像処理が可能です。
Unityは、Unity Technologiesによって開発されたゲームエンジンで、比較的簡単に使えるインターフェースを備えています。Unityは、スマートフォンやブラウザなどの多様なプラットフォームに対応しており、小規模なゲーム開発に向いています。
これらのエンジンには、C#やC++を使ってプログラムを書くことができますが、エンジンの選択には、プログラマーのスキル、開発するゲームの種類、および開発予算などの要素を考慮する必要があります。
ゲーム開発用のツールの取得
ゲーム開発には統合開発環境(IDE)、ビルドツール、デバッグツール、アセット作成ツールなどが必要です。
統合開発環境としてはVisual Studioなどがあり、ビルドツールとしてはCMakeなどがあります。
Visual Studioは、Microsoftが開発した統合開発環境(IDE)であり、Windows上で動作するC++、C#、Visual Basicなどのプログラミング言語に対応しています。Visual Studioにはデバッグ機能やソースコードの自動補完機能など、開発に必要な機能が豊富に搭載されており、多くの開発者に利用されています。
CMakeは、クロスプラットフォームでビルドを行うためのツールです。CMakeはプログラムのビルドプロセスを自動化するために使用され、Visual Studioプロジェクトなどのビルドシステムを自動生成することができます。
また、デバッグツールとしてはGDBやLLDBなどがあり、アセット作成ツールとしては、PhotoshopやMayaなどがあります。
GDBは、GNUプロジェクトによって開発されたデバッグツールで、プログラムの実行を制御し、プログラム内の変数やメモリの状態を監視することができます。
LLDBは、Appleによって開発されたデバッグツールであり、macOSやiOS、tvOS、watchOSなどのAppleのプラットフォーム向けに設計されています。
LLDBは、GDBと同様にプログラムの実行を制御し、プログラム内の変数やメモリの状態を監視することができますが、GDBと比較して高速なデバッグを実現することができます。
ゲームアーキテクチャの設計
ゲーム開発にはゲームアーキテクチャを設計する必要があり、アーキテクチャには、ゲームエンジンの機能やプログラムの構造、ゲームのルールやロジック、アセットの管理方法などが含まれます。
アーキテクチャの設計は、ゲームのスケーラビリティや保守性、開発効率などに影響を与えるため必要な作業となります。
Visual Studioの導入とSDLのダウンロード
Visual Studioは、Microsoftが開発する統合開発環境(IDE)の一つであり、プログラミング言語の開発に広く使われています。
SDL(Simple DirectMedia Layer)は、C/C++でのマルチメディアアプリケーションの開発を支援するライブラリのことをいいます。
Visual Studioの導入方法
下のリンクから Visual Studio 2022 のコミュニティをダウンロードしていきます。
Download Visual Studio Tools – Install Free for Windows, Mac, Linux
ダウンロード後、インストールしたexeを起動して作業を進めていき、c++によるデスクトップ開発をチェックしてインストールします。
その他の機能についてはあとからインストールできるので他の気になった開発環境はこの時点では入れる必要はありません。
インストールできたら起動し、新しいプロジェクトの作成から(N)を選択したあと、空のプロジェクトを選択してプロジェクトを立ち上げます。
SDLのダウンロード
SDL(Simple DirectMedia Layer)は、C/C++でのマルチメディアアプリケーションの開発を支援するライブラリのことです。
下記リンクからzipファイルをダウンロードし、解凍します。
https://github.com/libsdl-org/SDL/releases/tag/release-2.26.5
Visual Studioに戻って、ソリューションのプロジェクト名を右クリックした後、「追加」「新しい項目」からc++の新規ファイルを作成します。
「プロパティ」「C/C++ 」「全般」「 追加のインクルードディレクトリ」「 編集」からインクルードディレクトリを変更します。
以下同様の作業を行っていきます。
- 「プロパティ」→「リンカー」→「全般」→「追加のライブラリディレクトリ」→「編集」
- 「プロパティ」→ 「リンカー」→「入力」→「追加の依存ファイル」→「編集」
- 「プロパティ」→「ビルドイベント」→「ビルド後のイベント」→「コマンドライン」→「編集」
- 「プロパティ」 →「リンカー」→「システム」からサブシステムをコンソールに設定。
こうすることで、SDL.dllをビルド時に開発ディレクトリにコピーできるようになります。
C++ゲームプログラミングの基本
C++でゲームを開発することは比較的難易度が高めと言えます。
それは、C++の言語学習から始まり、ツールの使い方など幅広く勉強しておく必要があるからです。
そして、ゲーム開発において目標にすべきことは「実際に動くプログラムを自力で作成した」という達成経験であって、初めからクオリティの高いものを作成しようとは考えないことが継続的な学習の上で大切な事項です。
C++でゲームを作る方法は?
基本的にはソースコードを記述するための統合開発環境(IDE)があればプログラムを書いて確認していくことができます。
初心者であれば、すでにゲームとして動作が確認されたソースコードをネット上から拾って自分の環境で動かしてみるなどでも簡単にゲームを作成できます。
まずは、作りたいゲームのコンセプトを決めましょう。どのようなジャンルのゲームを作りたいのか、どのようなストーリーやキャラクターを設定するのか、目的やルールは何なのかを明確にしましょう。
C++でゲームを作成するためには、C++の開発環境を用意する必要があります。代表的なものとしては、Visual Studio、Code::Blocks、Eclipseなどがあります。また、ゲームエンジンを使用する場合もあります。
また、C++でゲームを作成する場合、ゲームエンジンを使用することが多く、代表的なものとしては、Unreal EngineやCocos2d-xなどがあります。ゲームエンジンを使用することで、物理エンジンやグラフィックスエンジンなどが組み込まれたフレームワークを利用することができます。
次にゲームのアーキテクチャを設計して、どのような構造にすれば開発しやすいのか、どのようにコードを書けばパフォーマンスがよくなるのかを考えます。例えば、ゲームエンジンを使用する場合、アクターと呼ばれるオブジェクトを作成し、それらをブループリントというグラフィカルなインターフェースで組み合わせることで、ゲームの振る舞いを表現することができます。
ここでいよいよゲームのプログラムを書いていきます。C++の場合、クラスや構造体、関数などを使用してプログラムを構築します。また、ゲームエンジンを使用する場合、エンジンが提供するAPIを呼び出すことで、ゲームの動作やグラフィックスを制御することができます。
プログラムが完成した後、必要に応じてテスト・リリースを行っていくのがC++の一般的な作成方法となります。
描画方法について
C++でゲームを作成する際の描画方法は、基本的にはグラフィックライブラリを使用して描画することが一般的です。
代表的なライブラリとしては、OpenGLやDirectXがあり、OpenGLはクロスプラットフォームであるため、WindowsやmacOS、Linuxなどの様々なプラットフォームで利用することができます。
一方で、DirectXはMicrosoftが開発したライブラリで、Windowsプラットフォームに最適化されています。
最初に、OpenGLの初期化を行います。OpenGLのコンテキストを作成するためのウィンドウを作成し、OpenGLの初期化を行うためのコードを記述します。
次に描画のためのシェーダの作成を作成します。
OpenGLでは、シェーダと呼ばれるプログラムを使用して描画を行い、シェーダには頂点シェーダとフラグメントシェーダの2種類があります。
頂点シェーダは、頂点の座標や色を計算するためのプログラムであり、フラグメントシェーダは、頂点の色をピクセル単位で計算するためのプログラムです。
実際に描画を行うためには、描画処理の実装が必要で、描画処理では描画する図形やオブジェクトの座標を指定し、シェーダプログラムを使用して描画を行います。
以上がC++でOpenGLを使用して描画を行う基本的な方となりますが、新しいグラフィックスAPIなどを用いればより高速で効率的な開発が可能です。
ゲームプログラミングの仕組み
ゲームで物体が動く仕組みは、画面上に表示される物体を短時間間隔で更新することによって実現されます。これをフレームと呼び、1秒間に表示されるフレーム数をフレームレートと呼びます。
具体的には、ある瞬間に物体を描画し、次の瞬間にはその物体を少し移動して再度描画します。そして、そのプロセスを繰り返すことによって、物体が動いているように見えます。この処理を実現するために、プログラムには「ゲームのループ処理」「描画関数」「物理計算」のような機能が必要となります。
ゲームプログラミングは、「ゲームエンジンの作成」「ゲームの実装」の主に2つの部分に分かれます。
ゲームエンジンは、ゲームの基本的な仕組みを提供するフレームワークのことで、ゲームエンジンは例えば以下のような機能を提供します。
- リソース管理
- グラフィックス描画
- 入力処理
- オーディオ管理
- 物理シミュレーション
- ゲームオブジェクト管理
- AI処理
- ユーザーインターフェース
- ネットワーク通信
ゲームエンジンは、これらの機能を提供し、ゲーム開発者がゲームの実装に専念できるようにします。
次にゲームの実装では、ゲームエンジンが提供する機能を使用して、ゲームのルールや世界観をプログラムします。具体的には、例えば以下のような処理が行われます。
- ゲームのルールの実装(例:プレイヤーの移動、敵の攻撃)
- ゲームオブジェクトの作成(例:キャラクター、アイテム、背景)
- ゲームの進行状況の管理(例:ステージクリア、ゲームオーバー)
- ゲームのUIの実装(例:スコア表示、メニュー画面)
以上のような処理を組み合わせることで、完成したゲームが作られます。
わかりやすい実在のゲームで例えると、「スーパーマリオブラザーズ」では以下のような実装がされています。
- マリオの移動やジャンプなどのアクションの実装
- キノコやコインなどのアイテムの作成と、それらを取得した場合のプレイヤーの状態の変更
- 敵キャラクターの動きや攻撃の実装
- ゲームの進行状況の管理(ステージクリア、ゲームオーバーの判定など)
- スコア表示やメニュー画面のUIの実装
画像を動かす方法
前述したように、ゲームで物体や画像が動く仕組みは、画面上に表示される物体や画像を短時間間隔で更新することによって実現されます。
これをフレームと呼び、1秒間に表示されるフレーム数をフレームレートと呼びます。
「ある瞬間に画像を描画し、次の瞬間にはその画像を少し移動して再度描画するそのプロセスを繰り返す」ことによって画像を動かします。
C++ゲームプログラミングのサウンド関連
音声ファイルを読み込む方法
ゲームに使用するサウンドファイル(WAV、MP3など)を読み込むために、C++には標準ライブラリに含まれる音声処理ライブラリであるOpenALやFMODなどの外部ライブラリを使用することが一般的です。
これらの音声ファイルを読み込み、再生させることで音を鳴らすことができます。
例えば、OpenALを使用する場合、以下のようなコードでサウンドファイルを読み込むことができます。
ALuint buffer;
buffer = alutCreateBufferFromFile(“sound.wav”);
音声を再生する
サウンドファイルを再生するために、C++では再生する音声ファイルを指定し、再生方法を指定するコードを記述する必要があります。
再生方法には、ループ再生、ボリュームの調整、位置の設定などがあります。
OpenALを使用する場合、以下のようにコードを記述することで、サウンドを再生することができます。
ALuint source;
alGenSources(1, &source);
alSourcei(source, AL_BUFFER, buffer);
alSourcePlay(source);
音声を止める
音声を停止する場合は、再生中の音声を指定し、停止するコードを記述する必要があります。また、再生中の音声を一時停止することもできます。
再生中のサウンドを停止する場合は、以下のようなコードを記述します。
alSourceStop(source);
音声が再生中かどうかを調べる
再生中のサウンドの状態を取得するには、OpenALのalGetSourcei関数を使用します。以下のコードを使用すると、指定されたソースの状態を取得することができます。
ALint state;
alGetSourcei(source, AL_SOURCE_STATE, &state);
上記のコードでは、sourceには状態を取得するソースのIDが指定されます。AL_SOURCE_STATEは、取得する状態を指定する定数です。stateには、指定されたソースの状態が格納されます。
メモリに読み込んだ音声データを削除する
C++言語でメモリに読み込んだ音声データを削除するには、「音声データをメモリから解放する」「OpenALのバッファを削除する」の手順を踏む必要があります。
以下のコードでは、deleteSoundData()関数で音声データをメモリから解放し、deleteBuffer()関数でOpenALのバッファを削除する例です。
// 音声データをメモリから解放する関数
void deleteSoundData(char* data) {
delete[] data; // 音声データのメモリ解放
}
// OpenALのバッファを削除する関数
void deleteBuffer() {
alDeleteBuffers(1, &buffer); // バッファの削除
}
C++ゲームプログラミングにおけるキャラの移動
キャラの移動は基本的に座標を変更することで移動を実現できます。
例えば以下は、SFML(Simple and Fast Multimedia Library)というグラフィックや音声、ネットワークなどを扱うためのライブラリを使用したC++言語の例です。
// キャラの移動
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
character.move(-5, 0); // 左に移動する
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
character.move(5, 0); // 右に移動する
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
character.move(0, -5); // 上に移動する
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
character.move(0, 5); // 下に移動する
}
キーボードの左右上下キーを押すことでキャラを移動させ、sf::Keyboard::isKeyPressed()メソッドを使ってキーの押下状態を確認し、move()メソッドを使ってキャラの座標を変更しています。
このようなプログラムを記述していくことでキャラ移動が実現可能です。
C++ゲームプログラミングのグラフィック関連
C++でのグラフィック処理は、SFMLというライブラリを使うのが一般的です。SFMLは、ウィンドウやスプライト、テキストなどの描画機能を提供し、簡単に使うことができます。
「ウィンドウの作成」「画像の読み込み」「スプライトの移動」「ゲームループの処理」「描画処理」などを処理していくことがC++でのグラフィック処理の基本的な流れとなります。
画像を拡大
SFMLでは、sf::Textureとsf::Spriteを使用して画像を表示します。
画像を拡大する場合、sf::SpriteのsetScale()関数を使用しますが、setScale()関数は引数としてsf::Vector2fを取り、X方向とY方向の拡大率を指定します。
以下は、画像を2倍に拡大する例です。
sf::Texture texture;
texture.loadFromFile("image.png");
sf::Sprite sprite(texture);
sprite.setScale(sf::Vector2f(2.0f, 2.0f));
画像の回転
SFMLでは、sf::Transformableとsf::Transformクラスを使用して、オブジェクトを回転させることができます。
画像を回転する場合、sf::Spriteをsf::Transformableにキャストして、sf::Transformを使用します。以下は、画像を45度回転する例です。
sf::Texture texture;
texture.loadFromFile("image.png");
sf::Sprite sprite(texture);
sprite.setPosition(sf::Vector2f(100.0f, 100.0f));
sf::Transform transform;
transform.rotate(45.0f, sprite.getPosition());
sf::RenderStates states;
states.transform = transform;
window.draw(sprite, states);
C++ゲームプログラミングのオススメ書籍
ゲームプログラマのためのコーディング技術 [ 大圖衛玄 ]
おすすめの人:ゲームプログラマとしてよりよい設計ができるようになりたい人
C++を使ったゲームプログラミングにおいて必要なコーディング技術を解説した書籍です。本書では、デバッグやコーディングスタイル、効率的なアルゴリズムやデータ構造、ゲームエンジンの設計など、幅広いトピックを扱っています。
ゲームプログラミングC++
おすすめの人:C++が不自由なく使え、3Dも勉強したい人
C++を使ったゲームプログラミングについて解説した書籍です。本書では、C++言語の基礎から、2D/3Dゲームの実装、物理エンジンの実装、グラフィックスの描画、シェーダの作成など、幅広いトピックを扱っています。
DirectX12の魔導書
おすすめの人:C++が不自由なく使え、DirectX12を使ったゲーム開発に興味がある人
Windows PC向けのグラフィックスAPIであるDirectX12を使用してゲームを開発するための入門書です。DirectX12の基本的な機能やアーキテクチャ、シェーダーの作成方法、メッシュやテクスチャの描画方法、そしてマルチスレッドによる最適化手法などが解説されています。
まとめ
いかがでしたでしょうか?
C++でゲーム開発を進めていくには、「C++の知識」「プログラムの構造」「ゲーム開発におけるアーキテクチャ」「画像やサウンド」など幅広い豊富な知識と経験が必要です。
まずはC++でプログラムを書く練習を行いながら、簡単なゲームを書籍やネット上の動画を参考に真似て作成してみるところから初めてみるのをおすすめします。
徐々に導入する技術や処理を複雑化させながらアップデートしていくことで、体系的に知識が勉強できるようになります。
- CATEGORY
- 学習
- TAGS
-
-
-
-
-
-
-
【サーバー(Linux系)】基幹システム統合に伴う医療従事者向けポータルサイト・周辺システム改修の 求人・案件
- 700,000 円/月〜
-
その他
- Java PHP SQL HTML JavaScript
-
【Python(データ分析系)】AIを活用したデータ分析を行うユースケースの 求人・案件
- 850,000 円/月〜
-
その他
- Python
-
【JavaScript(React)】就活モバイルアプリのフロントエンド開発の 求人・案件
- 1,000,000 円/月〜
-
大阪府
- JavaScript TypeScript
-
【Java(Spring Boot)】某求人サイトシステムの更改対応(SE/リーダー)の 求人・案件
- 800,000 円/月〜
-
その他
- Java Kotlin JavaScript
-
【Flutter/フルリモート可】事業会社の新サービス開発の 求人・案件
- 650,000 円/月〜
-
その他
- Dart
-
【フルリモート】Azure:全社インフラ基盤構築の案件(リーダー)の 求人・案件
- 700,000 円/月〜
-
その他
-
【Java(Spring Boot)】通信キャリア会員向けシステム開発の 求人・案件
- 750,000 円/月〜
-
その他
- Java
-
【サーバー(Linux系)】【Linuxシステム保守・開発/Java活用】既存システム運用サポートの 求人・案件
- 700,000 円/月〜
-
その他
- Java
-
【サーバー(Linux系)】銀行系ファイル連携サーバ構築案件の 求人・案件
- 650,000 円/月〜
-
その他
-
【サーバー(Linux系)】保険会社向け/サーバー運用案件の 求人・案件
- 650,000 円/月〜
-
その他
-
【サーバー(Linux系)】システム運用保守およびインフラ稼働管理の 求人・案件
- 280,000 円/月〜
-
その他
-
【サーバー(Linux系)】エアライン、エンハンス開発/システム移行の 求人・案件
- 650,000 円/月〜
-
その他
-
【Python(データ分析系)】某大手小売企業様向けのデータレイク基盤構築プロジェクトの 求人・案件
- 700,000 円/月〜
-
その他
- Python SQL Shell
-
【JavaScript】物流業務改善システム開発エンジニア募集|Web & BIツール活用の 求人・案件
- 580,000 円/月〜
-
その他
- JavaScript SQL HTML
-
【PM】金融系システム開発案件の 求人・案件
- 1,200,000 円/月〜
-
その他
-
【Java/一部リモート】基幹系システム開発案件の 求人・案件
- 550,000 円/月〜
-
その他
- Java
-
【メタバース】モーションデザイン監修案件の 求人・案件
- 750,000 円/月〜
-
その他
-
【Ruby】金融向け新規プロダクト開発案件の 求人・案件
- 850,000 円/月〜
-
五反田・大崎・目黒
- Ruby