C++ ゲームライブラリについて
ゲームライブラリ
最近はUnityやUnreal Engineといったゲームエンジンを条件さえ満たしていれば無料で使えるようになりました。
どちらのゲームエンジンも日本語情報が増えてきて、検索したらたいてい誰かがプログラムのコードを載せて説明しているサイトや文献を見つけることができます。
そんな中で私はUnityやUnreal EngineのUIになかなか馴染めずに使いこなせません(今はなんとか使えるように勉強中です)。
そこでUnityやUnreal Engineのような高性能なゲームエンジンではなくVisual Studioのような統合開発環境でプログラムのコードをゴリゴリかけて、なおかつコードは短めで簡単にゲームを作れるゲームライブラリはないのか調べてみました。調べてみた結果、以下の3つのライブラリを試しました。
そして一番私が使いやすいと思ったのは “OpenSiv3D” でした。
この3つのライブラリについて私個人が使っていて思ったことを書いていきます。ものによってはライブラリの使用期間が短いので、この記事は検証とは呼べない代物で私個人の偏見が盛り込まれているため参考程度に見てください。
1.DXライブラリ 2.Cocos2d-x 3.OpenSiv3D
の順番で書きます。
開発環境
OS : Windows10
IDE : Visual Studio Community 2019
DXライブラリ以外はMacでも開発環境を構築できますが、本記事での紹介は割愛させていただきます。気になった人は各自で調べてもらえると大変助かります。
DXライブラリ
上で挙げた3つのなかで唯一C言語の知識だけでプログラミングすることができます(C++の知識が必要ない)。そしてDXライブラリは日本人が開発したライブラリです。
導入方法については必要なファイルのダウンロードをするところは誰でもできると思います。最初の難所はVisual StudioでDXライブラリを使えるように設定をするところでしょうか。DXライブラリの公式ホームページに初期設定の仕方が載っているのですが、プログラミング初心者にとっては少々難しいかなと思いました。また、私が使っているときに設定の方法を忘れるたびにいちいちホームページを見に行っていたので面倒だと感じたところです(いや、覚えられないなら設定方法をテキストファイルかWord文書にコピペしとけばいいのでは?)。ただ、初期設定に関しては慣れればどうということはないです。少し手間をかけてあげれば正常に動作するので欠点とまではいかないです。
もともと DxLib_VC という名前のフォルダだが使っているバージョンが分かりやすいように名前を変えています。”追加のインクルードディレクトリ” にプロジェクトに追加すべきファイル_VC用というフォルダが入っているのでパスをコピーしてきます。このとき階層が深くならないようにCドライブ直下に配置しています。
このライブラリはDirectXというゲーム・マルチメディア処理用のAPIをラッピングして作られています。提供されている機能に関してはDirectXの機能を使いやすくまとめていて画像・音声ファイルの読み込み、読み込んだデータを用いて画面上に描画したり音を鳴らしたりができます。ゲームを構成するための機能が最低限備わっています。DirectXではウィンドウを出す初期化用のプログラムでさえ長く理解するのが難しく挫折しやすいところをDXライブラリではかなり短縮できます。
DXライブラリはもともと使っていたのですが色々と自分で実装しないといけないことが多くて、2年くらい前からこのライブラリを使って作っていたゲームは進展なしです(先輩が骨組みをすでに作っていて、そのゲームのプロジェクトメンバーに私が加わったところからあまり追加要素が入れられずにいる状態)。
「実装しないといけないことが多くて…」と言いましたが、ここでゲームのプログラムを書く上で考えないといけない要素を考えてみます。
例えばシーンの遷移は必要になるでしょう。タイトル画面、ゲーム本編の画面、ゲームクリア・ゲームオーバーしたときの画面… といった場面は欲しいです。これらを実装するには簡単な実装をするならif文やswitch文で分岐する処理をMain関数のループの中に入れて数値で今いるシーンがどこかを把握したり、変更したりします。ここでif文、switch文と言いましたがもう少し効率がいい実装の仕方があります。スタックで管理したり、Stateパターンという考えを用いて作らないとシーンが増えたときに管理が難しくなるといった問題が生じます。このスタックは自分で作らないといけないし、DXライブラリが提供する機能にはありません。ゲームを管理、訂正しやすくするためにはそのための機能を自分で実装しないといけません。逆にアルゴリズムをしっかり理解しているなら自分が定義して実装したプログラムを使えるため独自の管理ができたり、使い方がわからないなんてことは起こらないでしょう。私は知識が不足しているので、自分で実装したとして、あとからプログラムを見返すとどことどこがつながっているかわからなくなりました。
適切な知識を持っていれば、もしくは自分で機能を実装できるようにDXライブラリの使い方とデータ構造とアルゴリズムについて並行して勉強して自ら実装できる人はDXライブラリを使っても問題はないと思います。
あとC言語の知識だけでゲームを作れるライブラリになっているのでオブジェクト指向を考えなくて済むというのはプログラミング初心者にとっては扱いやすいと思います(ただ、プログラミングしたことがない人でも使いやすいと謳われるUnityはC#が扱え、そのC#はオブジェクト指向言語なので、初心者にとってオブジェクト指向が理解の妨げになるかはわかりません。私はC言語から学び始めてJavaというオブジェクト指向言語を理解するのに苦戦したためこのように考えました)。
後述するOpenSiv3Dを使ってC++(オブジェクト指向)に慣れて、さらにOpenSiv3Dは内部のソースコードを見られるのでどのように実装しているかの勉強をしてからDXライブラリに挑戦すると理解しやすいと個人的に思います。
Cocos2d-x
もともとはCocos2dというiPhone,macOS向けのObject-Cで記述できるCocos2d for iPhoneというフレームワークがあり、それを基にWindowsやMacなどの多くのOSに対応したC++で書けるマルチプラットフォームのライブラリとしてCocos2d-xが開発されました。
DXライブラリと違ってシーンの遷移や読み込んだ画像を用いたアニメーションをするための機能も備わっていて、まさにゲームを作るためのライブラリといった感じです。また生成される実行ファイルの容量が小さいためiPhoneやAndroidといったスマートフォン用ゲーム開発には重宝しそうでした。
しかし私はCocos2d-xを2か月程度しか触らずに辞めてしまいました。
理由についてはまず日本語情報が少ないということです。私は英語力があまりないので英語で書かれたサイトや公式のリファレンスをGoogle翻訳を駆使しながら読むためかなり効率が悪かったです。
また、バージョンの更新がかなり早いことです。Cocos2d-xは世界中のプログラマーが利用できるオープンソースで提供されているためライブラリの更新速度が早いです。日本語情報が少ないことに加えてバージョン更新速度によって今現在販売されている書籍やサイトが最新版に追いつかないことも原因の一つです。紹介されている情報が古く、その中で紹介されているCocos2d-xをGUIで操作する開発環境に「Cocos Studio」を使って説明するものもありましたが、そのCocos Studio は公式からの提供が停止していました。どうやらダウンロードページから消えてしまったらしく、今は「Cocos Creator」という開発環境の整備に力を入れているそうです。
Cocos Studio と Cocos Creator の互換には問題があるらしく、プロジェクトを Cocos Studio の方で作られた既存のプロジェクトは Cocos Creator でインポートができないそうだ。今から始めるならCocos Creatorを利用することになります。しかし、Cocos2d-xでゲームを作る際に提供されているツールが途中で変わる、もしくは急な仕様変更がないとも限らない状況です。(かつてCocos2d-xのバージョンが2.Xから3.Xに変わったとき関数の使い方などがかなり変わったらしいです。気になる人は各自調べてみてください)。互換性に問題が起こると面倒なので使い続けるかはそのプロジェクトで本当にこのライブラリを使うか、バージョン更新されたときどのように対応するかも考える必要がありそうです(個人で作るならあまり影響はないかも?)。現在提供されている開発環境のCocos Creator に関しては UIをUnity に似せているらしいが、だったら最初からUnityを使えば良いかな?と個人的に思いました。
環境設定やプロジェクトの生成に関しても私がゲームを1つ作るうえで引っ掛かりがありました。
Cocos2d-xを有効にするために環境変数を設定するのですが、そのためにPythonが必要だということです。しかもバージョンが2.X系のPythonでなければいけません。Cocos2d-xの最新バージョンの4.0でもPython2.7を使わないと環境変数の設定ができませんでした。Pythonの2.X系と3.X系には一部互換がないため2.X系に対応したプログラムは3.X系で使えなくなることがあります。
setup.py をバージョン2.7で実行しました。私の環境ではバージョン3.7と2.7を共存させている状態でバージョン指定をしない場合は3.7を使うようになっています。実行結果にはバージョン2.7が一番良いバージョンだという表示が出ました。画像に写っている NDK_ROOT 以降の設定に関しては、今回は自分のデスクトップ環境で動作するゲームを作ることだけを考えたのでEnterキーを押して飛ばしています。
プロジェクトを生成してVisual Studioなどでビルドをする必要がありますが初回のビルドに限ってかなり時間がかかります。私の場合は約4~5分程度ビルドに時間がかかりました。
Cocos2d-xに関してはPythonを3.X系に対応しないのか、GUIの開発環境が今後変わることはないかといった不安要素や、プロジェクトの初回ビルド時間、あと詳しくは書きませんがソースコードや画像・音声ファイルの参照元が私は分かりずらいと感じたため使い続けるのは断念しました。
OpenSiv3D
こちらもDXライブラリと同じく日本人が開発したライブラリです。公式のリファレンスも日本語で書かれているため英語が苦手な人も読み解きやすいと思います。
画像の描画、音の再生といった基本機能はもちろんのこと、シーンの遷移やGUIを短いコードで実装しやすくなっています。さらにオブジェクト間の衝突処理や配列が扱いやすい機能も備わっています。DXライブラリも使っていたので自分で比較して使いやすいと思った点、機能を挙げます。
・Main関数が簡潔に書ける
プログラムはMain関数から始まるのですがその関数内でループ処理させて画面に様々な情報を描画できるようにしているが、DXライブラリよりもMain関数に必要なコードが少ないです。
DXライブラリ
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
if (DxLib_Init() == -1)
{
return -1;
}
while(1){
if( ProcessMessage() == -1 ) break ;
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
}
DxLib_End();
return 0;
}
OpenSiv3D
#include
void Main()
{
while(System::Update())
{
}
}
上がDXライブラリ、下がOpenSiv3Dのコードです。このコードはMain関数を簡単に示したものであり、あくまで一例です
(見やすさのために改行している箇所があります)。
このソースコードには書いていませんがDXライブラリで画像を滑らかに動かすためにはClearDrawScreen関数とScreenFlip関数を使う必要があります。
これらの関数は画面を更新するときに表画面と裏画面を切り替えて画像を変える操作を行います。ダブルバッファリングという手法で画像を違和感なく連続して描画するために必要な処理です。
一方、OpenSiv3Dはこのような処理をプログラマーがあまり意識しなくても描画ができます(知識として持っておいたほうが良いとは思います)。
・衝突判定するための機能が標準搭載されている
DXライブラリでオブジェクト間の衝突判定を行いたいときは自分でそのためのコードを書くか別の外部ライブラリを追加(Box2D, Bulletなどの物理演算用ライブラリ)しないといけないが、OpenSiv3Dでは最初からそのための関数などが用意されています。しかも形は四角同士、丸同士、丸と四角といった同じ形だけでなく異なった形のオブジェクト同士であっても衝突判定を行うことができます。
・キー入力の長押し(キーが押され続けているかが分かる)判定ができる
OpenSiv3Dは「キーが押された瞬間」、「キーが押されている」、「キーが離された」の3状態を取得できます。
DXライブラリは「キーが押されている」状態を取得できません。押された瞬間と離されたときの状態を応用して自分で実装しないといけません。
もっとできることがあるのですが私が使っていて特に衝撃を受けた部分です。
かつてOpenSiv3D(Siv3D)の欠点として挙げられていたのがリファレンスが少ないことだそうです。しかし、私は2019年12月下旬からOpenSiv3Dを使い始めて、公式のリファレンスページをみながら簡単なゲームをすんなり作れてしまいました。最近ではサンプルコードも充実してきて、Qiitaに開発者がOpenSiv3Dの使い方を投稿しているので、それらを参考にすればOpenSiv3Dで使える機能を把握できると思います。
欠点を挙げるならOpenSiv”3D”という名前だが、3D機能に関するサンプルが少ない印象がありました。しかし、3Dゲームを作っている人も見かけるのでできなくはないはずです。2Dゲームであればどのジャンルでも作れるのではないでしょうか。
これからブログに投稿する記事について
今後、ブログにOpenSiv3Dでどのようなゲームが作れるかを見せていこうと考えています。
コメント入力