SDL2でのゲームの作り方入門-ウィンドウ表示編-

SDL

今回は前回の動作確認で使ったウィンドウを出すプログラムについて解説していきたいと思います!

とりあえず、前回のコードをおさらいしよう

#include <SDL.h>//SDLを使う為にインクルードする
#define SCREEN_X 1280//SCREEN_Xと打つと1280が入力されるようにする
#define SCREEN_Y 720//SCREEN_Yと打つと720が入力されるようにする
int main(int argc, char** argv) {
	if (SDL_Init(SDL_INIT_VIDEO)) {//初期化
		SDL_Quit();//SDLを終了する処理
		return 1;//プログラムにエラーだから終了すると伝える
	}

	SDL_Window* window = SDL_CreateWindow("TestWindow",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,SCREEN_X,SCREEN_Y, 0);//ウィンドウ作成

	if (window == NULL) {//ウィンドウが作成できていなかったとき
		SDL_Quit();//SDLを終了する処理
		return 1;//プログラムにエラーだから終了すると伝える
	}

	SDL_Delay(2000);//2000ミリ秒(2秒)待つと伝える

	SDL_DestroyWindow(window);//ウィンドウを削除する
	SDL_Quit();//SDLを終了する処理

	return 0;//プログラムに終わりだから終了すると伝える
}

上のコードは前回のコードにコメントを付け足してわかりやすくしたものです。もうこれでわかるわ!という方は先に進んでもらって大丈夫です。初心者の方にはわからないと思いますので、丁寧に解説していきたいと思います。

超最初

#include <SDL.h>//SDLを使う為にインクルードする
#define SCREEN_X 1280//SCREEN_Xと打つと1280が入力されるようにする
#define SCREEN_Y 720//SCREEN_Yと打つと720が入力されるようにする

#include<SDL.h>というのはSDLの機能を使うために必要な文です。難しい言い方をすると、SDLに登録されている関数定義を読み出していると言えます。ここはふわっとした理解でも全然大丈夫なので赤ラインのことだけ覚えておきましょう。

#define SCREEN_X 1280というのはSCREEN_Xと打ったら1280が入力されるようにしてねという文です。例えばこの文が書かれている上ではprintf(“%d”,SCREEN_X);と打つと1280と表示します。下も同じですね。

int main()とは

int main(int argc, char** argv) {

呪文です。ちょっと解説すると、これを基準にプログラムを進めてね、コマンドラインからintとcharのポインタのポインタを受け取ります。という文です。VisualStudioでは意識することはありませんが、.exeをダブルクリックするのと同じように、printfとかを書くと出てくるあの黒い画面のようなものでわざわざファイル名を書いて実行するような環境もあります。その時に-320みたいに渡せるんですね。ちなみに、VisualStudioでも設定で実行する時に渡すように設定できます。

エラー処理

if (SDL_Init(SDL_INIT_VIDEO)) {//初期化
		SDL_Quit();//SDLを終了する処理
		return 1;//プログラムにエラーだから終了すると伝える
	}

変なことにならないようにするための処理です。SDLの機能を使うためにはSDL_Initで初期化をする必要があります。もちろん、これに失敗したらSDLの機能は使えません。失敗したときは0より上の数を返してきます。ifは0より上の数が入った時も反応するので、そのまま入れておけば失敗した時になります。もちろん、失敗したらSDLの機能が使えないわけですから、プログラムを終了する処理をします。SDL_QuitはSDLの機能を使うためのプログラムを終了する処理です。皆さん、普通はreturn 0;を使っていたと思いますが、ここでは1にしています。これが失敗しましたという意味だからです。

Window作成処理について

	SDL_Window* window = SDL_CreateWindow("TestWindow",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,SCREEN_X,SCREEN_Y, 0);//ウィンドウ作成

これがウィンドウを作るための処理です。SDLではWindowの情報をSDL_Windowという構造体に保存しておきます。 後で使うので絶対に保存しておくようにしましょう。SDL_CreateWindow(ウィンドウのタイトル(変数で言えばchar*やstringなど),ウィンドウのx座標(SDL_WINDOWPOS_UNDEFINEDとしておくと適当な場所に作る), ウィンドウのy座標(SDL_WINDOWPOS_UNDEFINEDとしておくと適当な場所に作る),ウィンドウの幅(x),ウィンドウの高さ(y),SDL_WindowFlagで使いたい奴があったら指定);という関数です。この場合はTestWindowというの名前のウィンドウで、場所は適当な所に出る。ウィンドウのサイズは1280×720となります。SDL_WindowFlagは多すぎるのでここでは解説しませんが、使う時になったら解説します。

ウィンドウのエラー処理

if (window == NULL) {//ウィンドウが作成できていなかったとき
		SDL_Quit();//SDLを終了する処理
		return 1;//プログラムにエラーだから終了すると伝える
	}

SDL_Initの時の処理と全く同じです。違う所と言えば、window==NULL(ない)だったら、というのが条件になっている所でしょうか。これからはWindowという真っ白なキャンバスにあらゆる関数で描画していきます。そもそもキャンバスが無かったら描画できません。つまり、これからの処理はできないので終了する処理をするわけです。

もろもろ最後の方

	SDL_Delay(2000);//2000ミリ秒(2秒)待つと伝える

	SDL_DestroyWindow(window);//ウィンドウを削除する
	SDL_Quit();//SDLを終了する処理

	return 0;//プログラムに終わりだから終了すると伝える

SDL_Delayは待ちをミリ秒単位で入れる関数です。例えば、60fpsに制限したい時とか、単純にキャラを硬直させたいとかに使います。結構便利です。今回は一瞬で終わると何もわからないので二秒待たせるのに使っています。英語のまんまSDL_DestroyWindow(SDL_Window*)はウィンドウを削除する関数です。SDL_Window構造体のポインタを入れるとそのウィンドウを削除できます。今回はwindowで宣言しているのでこれを削除するためにwindowで入れてます。SDL_Quitは皆さんお分かりの通り、終了処理です。return 0;も終了処理ですよね?ただ、0は正常終了したことを示します。

次回は画像を描画してみます!

コメント

タイトルとURLをコピーしました