ゲームを作るのに一番重要なのは「ゲームを作るんだ」という情熱だそうで、ゲーム作りには面倒な作業が多いので、情熱をもってやらないと続かないのだそうです。

画面描画

SDLにはSurfaceという概念があります。Surfaceとは、絵をかいたりできる描画エリアだと思ってください。

Windowもタイトルバーを除いた部分がSurfaceで、Window Surfaceと呼ばれます。Window Surfaceに絵を描くことによって、画面表示ができる。こういう仕組みなんですね。

画面描画手順

以下の手順を踏めば、画面描画できます。

  1. Window Surfaceに描画する。
  2. SDL_UpdateWindowSurface()を呼んで、画面表示を更新する。

画面描画例

四角形(長方形)を描画して、描画手順を試してみましょう。

まず、Window Surfaceを取得します。これがないと描画できません。

SDL_Surface* windowSurface = SDL_GetWindowSurface(window);

なお、SDL_Surfaceは通常は使い終わったらSDL_FreeSurface()で破棄しますが、Window Surfaceだけは破棄してはいけません。SDL_DestroyWindow()で自動的に破棄されます。

次に、長方形の位置と大きさを決めます。(50, 100)の位置に、幅60、高さ40の長方形を描くことにします。

SDL_Rectというオブジェクトを作成します。これは構造体で、xとyの座標、幅(w)、高さ(h)の値を持っています。

なので、以下のコマンドでSDL_Rectを作成します。

SDL_Rect rect = { .x = 50, .y = 100, .w = 60, .h = 40 };

続いて、Window Surface上に、「rect」の位置に長方形を描きます。SDL_FillRectを使います。

SDL_FillRect(windowSurface, &rect, SDL_MapRGB(windowSurface->format, 0x00, 0x00, 0xFF));

「&」だったり、「->」だったり、変な記号がありますが、とりあえずスルーします。この辺も「ポインタ」がらみの話です。ポインタは初心者泣かせと言いますが、このようにいたるところに出てくるので避けては通れないのです。

最後に、SDL_UpdateWindowSurface()で、画面を更新します。

SDL_UpdateWindowSurface(window);

これで完成です。

ここまでの内容を、SDL_CreateWindow()と、whileループの間に書いて実行してみましょう。

なんか中途半端な位置に四角が描画されました。パラメータが適当なので、しょうがないですが・・・。

気に入らない人は、以下のパラメータをいじれば、納得のいく「長方形描画」が追求できるでしょう。

  • SDL_Rectのパラメータを変更する:長方形の位置と大きさが変わる
  • SDL_MapRGB()の末尾3つのパラメータを変更する:長方形の色が変わる

SDL_MapRGB()の色指定は、RGBの順に並んでいます。すなわち、

  • 最後から3つ目の数字を大きくすれば赤くなり
  • 最後から2つ目の数字を大きくすれば緑になり
  • 一番最後の数字を大きくすれば青くなります

今は、一番最後の数値が最高の値(0xFF = 255)なので、青い長方形になっています。(0xFF, 0x00, 0x00)なら赤い長方形になるわけです。(0xFF, 0xFF, 0x00)なら、赤と緑が混ざって黄色、(0xFF, 0xFF, 0xFF)なら、白になります。

※ 光の合成なので、絵の具を混ぜたときと逆に明るくなるのに注意してください。

つづく

参考サイト