オブジェクト指向を意識してC++でシューティングゲームを作る(1)

使うのはVS2013とDXライブラリ、使用言語はC++です。

 今回は次のことをします。

  1. ゲームループ作成。
  2. タイトル、ゲームのシーン切り替え部分作成。

※Manager.hの所のコンストラクタとデストラクタの記述が抜けていたので追記しました。2016/10/5

ゲームループ作成。

まず最初にゲームループを作ります。

#include"DxLib.h"

#define KEY_NUM 256
//キーの入力状態を更新する
int gpUpdateKey(char *key){
 //現在のキーの入力状態を格納する
 char tmpKey[KEY_NUM];
 //全てのキーの入力状態を得る
 GetHitKeyStateAll(tmpKey);
 for (int i = 0; i<KEY_NUM; i++){
  if (tmpKey[i] != 0)
  {//i番のキーコードに対応するキーが押されていたら加算
  key[i]++;
  }
  else
  {//押されていなければ0にする
  key[i] = 0;
  }
 }
 return 0;
}
bool Process(char *key) {
 if (ProcessMessage() != 0) return false;
 //画面の裏ページの内容を表ページに反映する
 if (ScreenFlip() != 0) return false;
 //画面を初期化
 if (ClearDrawScreen() != 0) return false;
 //キー取得
 if (gpUpdateKey(key) != 0) return false;
 //エスケープで終了
 if (key[KEY_INPUT_ESCAPE] >= 1) return false;
 return true;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
 //ウインドウモードに変更
 ChangeWindowMode(TRUE);
 //DXライブラリを初期化する。
 if (DxLib_Init() == -1) return -1;
 //キー取得
 char key[KEY_NUM];
 //描画先画面を裏にする
 SetDrawScreen(DX_SCREEN_BACK);
 while (Process(key))
 {
  //ゲームループ

 }
 //DXライブラリを終了する。
 DxLib_End();

 return 0;
}

参考サイト(新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]


ここまではどんなゲームを作るときも同じ流れになると思うので説明は割愛します。

ここのゲームループのところでゲームの更新描画をします。

 

シーン切り替え。

次に全体のシーンの管理クラスを作ります。

Manager.h

#pragma once

class CManager;
//シーンの基底クラス
class CScene
{
protected:
CManager *manager;
public:
CScene(CManager *pManager){ manager = pManager; };
virtual ~CScene(){};
//描画
virtual void Update(){};
//更新
virtual void Render(){};
};
//シーン管理クラス
class CManager
{
//キー
char *key;
public:
//今のシーンのポインタ
CScene *scene;
CManager(char *pKey){ key = pKey; };
~CManager(){ delete scene; };
char *GetKey(){ return key; }
//描画
void Update(){ scene->Update(); };
//更新
void Render(){ scene->Render(); };

};

これがシーン管理クラスです。

使い方は、CManagerクラスの中の「CScene *scene」をタイトルやゲームシーンの切り替わりの際に解放(delete)動的確保(new)してシーンを切り替えます。

では試しにタイトルからゲームのシーン切り替えをしてみます。

Title.h

#pragma once

//タイトル全体の管理
class CTitle:public CScene
{
 public:
 CTitle(CManager *pManager):CScene(pManager){};
 ~CTitle(){};
 void Update();
 void Render();
};

Title.cpp

#include"DxLib.h"
#include"Manager.h"
#include"Title.h"
#include"Game.h"
void CTitle::Update()
{
 if (manager->GetKey()[KEY_INPUT_X] >= 1)
 {
  //ゲームにシーン移行
  manager->scene = new CGame(manager);
  delete this;
 }

}

void CTitle::Render()
{
 DrawFormatString(0, 0, GetColor(255, 255, 255), "タイトル");
}

Game.h

#pragma once

class CGame:public CScene
{
 public:
 CGame(CManager *pManager) :CScene(pManager){};
 ~CGame(){};
 void Update();
 void Render();
};

Game.cpp

#include"DxLib.h"
#include"Manager.h"
#include"Game.h"

void CGame::Update(){
}
void CGame::Render()
{
 DrawFormatString(0, 0, GetColor(255, 255, 255), "ゲーム");
}

main.cpp

#include"Manager.h"
#include"Title.h"

 

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
//ウインドウモードに変更
ChangeWindowMode(TRUE);
//DXライブラリを初期化する。
if (DxLib_Init() == -1) return -1;
//キー取得
char key[KEY_NUM];
//描画先画面を裏にする
SetDrawScreen(DX_SCREEN_BACK);
//管理システムを動的確保
CManager *manager;
manager = new CManager(key);
//タイトルを動的確保
manager->scene = new CTitle(manager);
while (Process(key))
{
 //ゲームループ
 manager->Render();
 manager->Update();
}
//後始末
delete manager;
//DXライブラリを終了する。
DxLib_End();

return 0;
}

 これで実行すると

f:id:haina817:20160920011038p:plain

最初にタイトル。

そしてXを押すと。

f:id:haina817:20160920011110p:plain

 このようにシーンを切り替えることに成功しました。

本日はここまでにします。

この続きはオブジェクト指向を意識してC++でシューティングゲームを作る(2)に書きます。