SDL2のチュートリアルをやってみる BGP2.0 – その1

BGP2.0

SDLの公式Wikiで紹介されているチュートリアルを進めようと思います。英語ですので、Google先生の翻訳だけが頼りです。

チュートリアルを公開しているサイトはいくつかありますが、Lazy foo’ ProductionsのBeginning Game Programming v2.0(以降はBGP2.0)を選択しました。更新が定期的になされているのが理由のひとつ。あとは、各Lesson毎にソースコードをダウンロードできることです。

BGP2.0(Beginning Game Programming v2.0)は、55のレッスンで構成されています。

Lesson 01 Hello SDL

In this tutorial we will be setting up the SDL library and creating our first window.
SDLライブラリを設定し、最初のウィンドウを作成する

参考: Lazy Foo’ Productions Tutorials 01 Hello SDL

概要

最初のステップとして、ウィンドウを作成する。

処理の流れ
1. 初期化
2. ウィンドウの作成
3. 白でウィンドウを塗る
4. ウィンドウを更新
5. 後処理

要点

int main(int argc, char * args[]){}

SDLを使うときは、この形にする。これ以外にすると未定義参照を起こすので注意。

  • エラー処理
    SDLでエラーが発生した場合は、SDL_GetError()が最新のエラー情報を返すので利用する。

  • 今回のサンプルプログラムはソフトウェアレンダリングが使われているようです。ざっとチュートリアルを見ると前半はソフトウェアレンダリングで、進めていくとハードウェアレンダリングを使ったものになるようです。

ソフトウェアレンダリングとは、CPUで処理を行うものです。
ハードウェアレンダリングとは、専用のハードウェア(GPU)で処理を行うもので、こちらのほうが処理は早いです。SDL2.0からはハードウェアレンダリングを指定できるようになっています。

自分で書いてみる

サンプルプログラムを参考に、ウィンドウの作成、灰色で塗りつぶし、終了と一連のプログラムを書いてみました。

(実行イメージ)

#include <SDL.h>
#include <iostream>
#include <string>

using namespace std;

class TUTORIAL01 {
public:
    TUTORIAL01() { initSDL(); }
    ~TUTORIAL01() { clearSDL(); }

    int initSDL();
    void clearSDL();

    int createWindow(string title, int w, int h);
    void fillWindow();
    void updateWindow();

private:
    SDL_Window* window;
    SDL_Surface* surface;
};

/**
*   初期化
*   0:正常終了 1以上:エラー
*/
int TUTORIAL01::initSDL() {
    
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        cout << "SDLの初期化に失敗しました : SDL_Error: " << SDL_GetError() << endl;
        clearSDL();
        return 1;
    }

    return 0;
}

/**
*   終了処理
*/
void TUTORIAL01::clearSDL() {
    SDL_free(surface);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

/**
*   ウィンドウを作成する
*   0:正常終了 1以上:エラー
*/
int TUTORIAL01::createWindow(string title, int w, int h) {

    // ウィンドウを作成する
    window = SDL_CreateWindow(
        title.c_str(), 
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
        w, h, 
        SDL_WINDOW_SHOWN
    );

    if(window == NULL){
        // エラー
        cout << "ウィンドウの作成に失敗しました : SDL_Error: " << SDL_GetError() << endl;
        return 1;
    }

    // サーフェイスを作成する
    surface = SDL_GetWindowSurface(window);

    return 0;
}

/**
*   サーフェイスを塗りつぶす
*/
void TUTORIAL01::fillWindow() {
    SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 200, 200, 200));
}

/**
*   ウィンドウを更新する
*/
void TUTORIAL01::updateWindow() {
    SDL_UpdateWindowSurface(window);
}

/**
*   メイン
*/
int main(int argc, char** argv){
    TUTORIAL01 t01;

    // ウィンドウを作成する
    if (t01.createWindow("SDL Tutorial01", 640, 480) > 0) return 1;
    
    // 白く塗りつぶす
    t01.fillWindow();

    // 更新
    t01.updateWindow();

    // 2秒ウェイトする
    SDL_Delay(2000);

    return 0;
}

コメント

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