【C++】ゲームをコードで書くフレームワーク・ライブラリ三選

プログラミング

 皆様、お疲れ様です。
今回はゲームプログラミング初心者向けの記事になります。
題してゲームを(ほぼ)コードだけで成立させられるフレームワーク・ライブラリについてです。
基本的にはゲーム開発初心者がコードで作る最初のゲームの範囲として2Dまでがひとまずの目安であることを想定しています。そのため、2Dゲームをつくるのに十分であり日本語の解説が比較的充実していて、かつ後に3Dまで踏み込んだ時にそれを使い続けることもできるということを条件にして今回選ばせていただきました。

また前提としてVisualStudioで使うことを前提に書いていることをご了承ください。

 昨今はUnrealEngineやUnityなどのゲームエンジンで比較的学習コストを低くして、ゲーム制作に取り組むことが出来て個人開発者にとっても非常にいい環境が整いつつあります。しかしながら各エンジン備え付けのコンポーネントなどの処理だけでは自分のやりたいことを実現できない・・・、なんてことも起こりえます。ゲーム開発の基礎(どのようなことが書かれているのか・どのような順序で処理されているのか等)を学ぶためにも一度コードに触れることは絶対損にはなりません!!
なのでよりフレキシブルに開発できるように、コードを書くことに馴染みを覚えてほしいなあと思い今回の記事を書きました。1

各フレームワーク・ライブラリの紹介

そもそもフレームワーク・ライブラリって何ぞ?違いって?

 とまあ送り出したのですが、恐らくですが早速引っかかると思います。聞いたことはあるけど詳しい違いや内容が分からないですよね。本題とずれてしまうのでネットの海を調べていただくか下記の記事を参照して下さい。

【解説】フレームワークとライブラリの違い

 簡単に言いますと
・フレームワーク:プログラムの基礎の構成が既にあり、それ単体でも実行できる。この上に自身の書いたプログラムを載せて拡張するといったイメージ。
・ライブラリ:便利な関数(プログラム)の集まり。上記と比べて自身の書いたプログラムに必要に応じて取り入れるといった感覚をイメージしてもらえるといいと思います。
と頭の片隅においてもらえたらと思います。

DXライブラリ

ホームページ
https://dxlib.xsrv.jp/(”ダウンロードはこちら”のところから自分の環境に合わせてダウンロード)
リファレンス
https://dxlib.xsrv.jp/dxfunc.html#R1N1

・特徴
導入の方法が今回紹介する中で最も容易。
ー方法に関しては今回は説明しないので、他のサイトを参照してもらえればと。
関数ごとに用例やどういった処理をしているかの解説がリファレンスに乗っているので、初心者でも扱いやすいと思われる。
基本的には現在掲載しているリファレンスのページの関数のみでゲームの制作を行うことが出来る。
ー3D関係やLive2Dにも対応しており別ページに存在するが、それらは無理に使わずともよい(使ってもよい)。
留意点
初期化と終了処理が必須となる。
ーゲーム系のライブラリにはつきものだが、それぞれ一行で終わる為、容易。
リファレンスには掲載されていない隠し関数が存在する。
ー参照する際は実際のソースコードで。

以下に基本となるゲームループのコード

#include "DXLib.h"

//
// WinMain(). プログラム起動関数
//
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
) {

    // DXライブラリ初期化処理:DXライブラリの関数
    if( DxLib_Init() == -1 )
    {
         return -1;        // エラーが起きたら直ちに終了
    }

    Initialize(); // ゲーム全体の初期化処理

	// 1フレームループを組む ----------------------------------------------------------
	while (ProcessMessage() == 0)		// プログラムが終了するまでループ:DXライブラリの関数
	{
		Input(); // キーボードやパッドの入力処理
		Process(); // ゲームの計算処理(キャラがどれぐらい動いたなど)

		ClearDrawScreen();		// 画面を初期化する:DXライブラリの関数
		Render(); // 画面にキャラクターを描画
		ScreenFlip();			// 裏画面の内容を表画面に反映させる:DXライブラリの関数
	}

    // DXライブラリ使用の終了処理:DXライブラリの関数
    DxLib_End() ;

	return 0;
}

Siv3D

ホームページ兼リファレンス
https://siv3d.github.io/ja-jp/

特徴
よく使われる図形構造体(Rectなど)や標準ライブラリ(STL)のラッパークラスが存在し、それらを活用しやすいように整えられているフレームワーク。
導入した時点で初期化や終了処理を必要とせず、ファイルがインクルードされていれば各種クラス・関数を利用することが出来る。
現在でも開発者がSiv3Dに関する講演等を行っており、体験会なども開催されているので最寄りで開催されていた場合、参加するという手段もとれる。
留意点
既に自身で作ったプロジェクトが存在している場合、新たにSiv3Dテンプレートのプロジェクトを作り直して移植する必要がある?(自分は中途で導入するのを断念して作り直しました・・・。)
汎用的な命名が多いため、自身で作った関数等と命名がかぶることが往々にして発生する。
ーその場合はSiv3D側のネームスペース(s3d::○○)を明確に記述することで解決できる。
ラッパークラスも多いので本来の標準ライブラリに触れるところまでコードの内容を確かめて理解してみてほしい。
ー他のライブラリでは基本的にここまでラッパークラスが整備・活用されていることは多くないので、標準ライブラリを扱えるようにした方がいい気がする・・・。
リファレンスもまだ記述されていない項目が存在するので内部のコードをみて開発することも必要。

以下に基本となるゲームループのコード(公式サイトの例)

# include <Siv3D.hpp>

void Main()
{
	// 背景色を水色に設定する
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	// 絵文字からテクスチャを作成する
	const Texture texture{ U"🐥"_emoji };

	// テクスチャを描く位置
	Vec2 pos{ 400, 300 };

	// メインループ
	while (System::Update())
	{
		// もし左クリックされたら
		if (MouseL.down())
		{
			// 描く位置を現時点でのマウスカーソルの位置に変更する
			pos = Cursor::Pos();
		}

		// テクスチャを描く
		texture.drawAt(pos);
    
	}
}

SDL

ダウンロードページ(GitHub)
https://github.com/libsdl-org/SDL
日本語リファレンス
https://maruhiro-ver0.github.io/sdl2manual-ja/

特徴
クロスプラットフォームライブラリ
ー違うプラットフォーム(OS)でも動作する
海外で作成されたライブラリのため、ゲームの開発実績も相応に多い
ーそのため英語版のリファレンスが日本語より充実していると思われる
参考書籍も存在するのでその本に沿って学習すると吸収しやすいかも?
ー本項目の最後にAmazonのリンクを掲載
留意点
DXライブラリと同様に初期化と終了処理が必要となる
リファレンスの項目分けは初心者にとっては少し見づらいかもしれないです。
ー必要としている関数がどこにあるかわかりにくい

以下に基本となるゲームループのコード

void main()
{
 SDL_Window* gWindow; // ゲームのウィンドウ 
 bool gIsRunning = true; // ゲームを起動し続けてよいか

/////必須の初期化作業(初期化内容は必要に応じて)//
 if(SDL_Init(SDL_INIT_VIDEO) != 0){
   gIsRunning = false;
 }

 gWindow = SDL_CreateWindow(
  "Game_test", // ウィンドウのタイトル
  0,            // ウィンドウ左上隅のx座標
  0,            // ウィンドウ左上隅のy座標
  1920,         // ウィンドウの幅(Width)
  1080,         // ウィンドウの高さ(height)
  0             // フラグ(設定しない時は0) 
 );

 if(!gWindow){// もしウィンドウが作成されなかったら
   gIsRunning = false; 
 }
//////////////////////////////////////////////

 while(gIsRunning){
 // これまでと同様の入力、処理、描画のゲームループ 
   Input();
   Process();
   Render();
 }

/////必須の終了処理/////////////////////////////
 SDL_DestroyWindow(gWindow);
 SDL_Quit();
//////////////////////////////////////////////
}

参考書籍

最後に

 ここまで紹介してきましたが、上記のいずれかを”絶対にマスターしろというわけではない”ということは言っておきますね。最初にも言いましたが、昨今は便利なゲームエンジンの台頭もあり、そちらの方が慣れれば開発効率は上だと思います。ただ内側を知っているか、自分で書けるか、で作れるものの幅は大きく変わると思います。上記を使ってゲームをつくる中で色々調べることが多くあると思います。それらを調べて自分の内に貯めていくことで、つくるゲームの世界がより広がるんじゃないかなと思います。
これを使った方がいいというゲームの作り方の定石はあるかもしれませんが、どの道具・方法を使えというのは決まっていません。上記でも十分、ゲームの発想とコードを書く力次第で面白いゲームは作れますので、めげずに頑張りましょう!(僕も頑張ります・・・。面白いゲームつくったら共有してね・・・。)

最後に今回の話題とは無関係ですが、推しの作家さんの本を載せておきますね。(キャラの造形とか作者さんが書くキャラが好き・・・。)

  1. 初心者向けだったら、導入方法とかもっと懇切丁寧に解説したほうが良いよなぁと思いつつ・・・わからないところがあったらSNSなどでここ分からなかったを言ってください。頑張れれば答えたり記事にします・・・ごめんなさい ↩︎
タイトルとURLをコピーしました