C++でSDL2を使うPart2
※この記事は自分用のメモなので特にプログラムの解説は雑です。というかよくあるサイトさんのほぼコピペ
前回の記事でも開発環境の構築をしたので、プログラムを動かすためのウィンドウを作っていきたいと思います。
ウィンドウを構築することができたら、あとはリファレンスにある関数を好きなように使ってゲームを作ることができるようです。
Dxライブラリみたいでうれしい。めっちゃ使いやすそう。
さて、この記事はよくあるサイト 様を参考にしています。
一般に、ゲームの動作は、
ゲーム起動
↓
初期化処理
↓
無限ループ(ゲーム本体)
↓
終了化処理
という流れで行われます。
”無限ループ(ゲーム本体)”の部分は
計算フェーズ→描写フェーズ
の順に行われて、無限にループするのが基本です。
今回の記事では、この流れを管理するクラスであるGAMEMainクラスを作り、初期化処理と終了化処理を書いていくことで、とりあえずゲームを実行するためのウィンドウを作っていきましょう。
class GAMEMain{
private:
SDL_Window* window; //ウインドウを司るクラス
SDL_Renderer* renderer;//レンダラーを司るクラス
SDL_Texture* tex;//テクスチャ―を司るクラス
public:
//初期化処理用の関数
int Initialize_SDL(); //SDLライブラリを初期化する関数
int Initialize_createWindow(); //ウインドウを作る関数
int Initialize_Renderer(); //レンダラーを初期化する関数。
//メイン処理用の関数
void Loop_updateGame(); //メインループでゲームの各種計算を行う関数
void Loop_drawGame(); // メインループでゲームの描写を行う関数
//終了化処理用の関数
void Finalize_SDL(); //SDLライブラリを終了化する関数
}
と、こんな感じでゲームの流れを管理するクラスを作ります。
で、これを作った後に中身もちゃんと書いていきましょう。
まずは初期化処理用の関数から。
int GAMEMain::Initialize_SDL() { //SDLライブラリを初期化する関数
if (SDL_Init(SDL_INIT_VIDEO) != NULL) { //SDLの初期化に失敗したとき
SDL_Quit(); //SDLの終了。
return 1;
}
return 0;
}
int GAMEMain::Initialize_createWindow() {//ウィンドウの生成
window = SDL_CreateWindow(//リファレンスを見るべき
“An SDL2 window”, // ウィンドウのタイトル
SDL_WINDOWPOS_UNDEFINED, // X座標の初期値
SDL_WINDOWPOS_UNDEFINED, // Y座標の初期値
640, // 幅(width)のピクセル数
480, // 高さ(height)のピクセル数
0 // SDL_WindowFlags列挙型。32bitつまり32個の設定がある。リファレンス
);
if (window == NULL) {
return 1;
}
return 0;
}
int GAMEMain::Initialize_Renderer() {//レンダラーの初期化
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);//一つのウィンドウにつき一つのレンダラー
if (renderer == NULL) {
std::cout << "CreateRender Error : " << SDL_GetError() << std::endl;
return 1;
}
return 0;
}
で終了化処理はつぎのようにします
void GAMEMain::Finalize_SDL() { //SDLの終了化処理
SDL_DestroyTexture(tex); //テクスチャを司るクラスを消す
SDL_DestroyRenderer(renderer); //レンダラーを司るクラスを消す
SDL_DestroyWindow(window); //ウィンドウを司るクラスを消す
SDL_Quit(); //SDLを終了化
}
という感じ。あとはメイン関数で初期化と終了化処理をよびだせばOK。
int main(int argc, char** argv) {
GAMEMain GMain;
//初期化処理
GMain.Initialize_SDL();
GMain.Initialize_CreateWindow();
GMain.Initialize_Renderer();
//メインループ
while(){
GMain.UpdateGame();
GMain.DrawGame();
}
//終了化処理
GMain.FinalizeSDL();
return 0;
}
こんな感じでゲームの外枠完成です。あとはUpdateGame()や、DrawGame()にお好きなようにやりたいことを書けばいいです。
どんな関数を使えるかが書いてあるのでリファレンス はブックマーク必須ですな。
ところで、これなんで閉じるボタン(クローズボックス)とかの反応がないんだろう。
イベントとかの処理を加えたら正常に動作しました。次の記事に書きます。
コメント