DXライブラリとC/C++を使用して、簡単なゲームを作成しながらプログラミングに慣れていきます。
新・ゲームプログラミングの館もわかりやすいので、そちらも参考にしてみてください。
DXライブラリ置き場 使い方説明 を参考に、Visual Studio 2019のインストール、プロジェクトの設定等を行います。 (間違いの指摘が1箇所ありました。4.③の手順ですが、『全般』ではなく『詳細』のようです。)
最初のプロジェクトの設定は少々面倒なので、次にプロジェクトを作成するときは、このプロジェクトフォルダごとコピーするのも良いでしょう。
#include "Dxlib.h"
static const int SCREEN_WIDTH = 800; // 画面の幅
static const int SCREEN_HEIGHT = 600; // 画面の高さ
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// DXライブラリ初期化
ChangeWindowMode(TRUE); // ウィンドウモードで起動
SetGraphMode(SCREEN_WIDTH , SCREEN_HEIGHT , 32); // 画面サイズを指定
if (DxLib_Init() == -1) return -1; // DXライブラリの初期化
SetDrawScreen(DX_SCREEN_BACK); // 裏画面化
// 変数宣言、初期化
int x = 0;
int y = 0;
int r = 50;
int spd = 12;
// メインループ(60FPSなら1秒間に60回実行される)
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
// 入力
char keyState[256];
GetHitKeyStateAll(keyState);
// 計算
x += spd;
if (x > SCREEN_WIDTH) x = 0;
y += spd;
if (y > SCREEN_HIGHT) y = 0;
if (keyState[KEY_INPUT_ESCAPE] == 1) break;
// 描画
DrawCircle(x, y, r, GetColor(122, 255, 255));
DrawFormatString(0, 0, GetColor(255, 255, 255), "x = %d, y = %d", x, y);
}
// DXライブラリ終了処理
DxLib_End();
return 0;
}
以上が基本的なプログラムの骨格になります。 色々と書いてありますが、
初期化(DXライブラリ)
↓
初期化(変数宣言、画像、音楽の読み込み)
↓
メインループ
↓
終了処理
というのがゲームプログラムにおける、大きな一連の流れとなります。
while文の中の処理をメインループと呼び、60分の1秒ごと(環境によって異なる)に実行されるゲームの主な処理を書いていきます。
さらに、メインループでは、入力フェーズ→計算フェーズ→描画フェーズの3つのフェーズに処理をわけると流れがわかりやすくなります。
DXライブラリで使用できる主な関数は、DXライブラリ 関数リファレンスページに、使用例とともに記載されています。(リファレンスにはない隠し関数というものもあり、DxLib.h
に記述されています)
よく使う関数について、以下に説明します。
第二回の例にあるように、char型のサイズ256の配列に、すべてのキーの押下状態を格納します。CheckHitKey
を何度も使用するより効率が良いらしいので、できればこちらを使いましょう。
マウスカーソルのX座標とY座標を取得します。このように、2つ以上の値を返す関数は、ポインタを使うことが多いです。
乱数を生成します。ゲームでは非常によく使う関数だと思います。
R, G, Bで色を指定します。頻繁に使う色はconst int WHITE = GetColor(255, 255, 255);
のように、定数に入れておくと便利です。
線、四角形、丸を描きます。画像がまだ用意できていない時などにも役立ちます。
画面に情報を表示するのに使います。現在の変数の中身がどうなっているか確認したい場合など、デバッグ時にも使えます。
LoadGraph
関数を使用して(LoadGraphを使うのは最初だけ)メモリに読みこんでおいた画像を表示します。メインループで毎回ClearDrawScreen
(画面の全消し)を呼んでいるので、毎フレームごとに描画しなければいけないことに注意です。
音楽ファイルの読み込みと再生を同時に行ってくれます。BGMなど、読み込み時に一回しか呼ばれない場所で使いましょう。
DrawGraph
関数と同様に、LoadSoundMem
関数であらかじめメモリに読み込んだ音を再生します。効果音など複数回呼ばれる場所で使います。
他人に見せないものでも、コードの量が増えてくるにつれ自分でも読めなくなったり、バグを追いづらくなったりするので、見やすいコードを書くことを常に心がけましょう。
エディターに補間機能があるので、変数名が少々長くなっても、役割がわかりやすい名前であることが大切です。
定数は大文字にする、変数、関数名はキャメルケース記法にする、一つの行に複数の命令を書かない、など、コーディング規則を統一することも見やすさにつながると思います。
共通する処理やデータは、何回も呼び出されたり、複数の場所から利用されることを想定して、関数や構造体として分割しておきましょう。
また、「プロジェクト」→「新しい項目の追加」から、ソースファイルやヘッダファイルを追加することができます。
ファイルを分割することにより、コンパイルが変更したファイルごとに行われ、コンパイル時間の短縮につながるので、機能ごとにどんどん分割していきましょう。
C++では、JavaやC#と同様に、class
を使用することにより、関連する変数、関数をクラスとして一緒に扱うことができます。これによりコードをさらに見通しの良いものとすることができます。