図形の描画

2021年8月24日

SDLで図形を描画するには、下記の関数を使用します。

SDL_RenderDrawPoint関数

レンダ―ターゲットに点を描画します。

宣言

int SDL_RenderDrawPoint( SDL_Renderer* renderer, int x, int y );

引数

rendererレンダラのアドレスです。
x点のX座標です。
y点のY座標です。

戻り値

描画に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

SDL_RenderDrawLine関数

レンダ―ターゲットに線を描画します。

宣言

int SDL_RenderDrawLine( SDL_Renderer* renderer, int x1, int y1, int x2, int y2 );

引数

rendererレンダラのアドレスです。
x1線の始点におけるX座標です。
y1線の始点におけるY座標です。
x2線の終点におけるX座標です。
y2線の終点におけるY座標です。

戻り値

描画に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

SDL_RenderDrawRect関数

レンダーターゲットに矩形を描画します。

宣言

int SDL_RenderDrawRect( SDL_Renderer* renderer, const SDL_Rect* rect );

引数

rendererレンダラのアドレスです。
rect矩形のアドレスです。
この引数にNULLを指定すると、矩形をビューポート全体として扱います。

戻り値

描画に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

SDL_RenderFillRect関数

レンダーターゲットに塗りつぶした矩形を描画します。

宣言

int SDL_RenderFillRect( SDL_Renderer* renderer, const SDL_Rect* rect );

引数

rendererレンダラのアドレスです。
rect矩形のアドレスです。
この引数にNULLを指定すると、矩形をビューポート全体として扱います。

戻り値

描画に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

サンプルプログラム

#include <SDL.h>

SDL_Window*     g_window    = nullptr;
SDL_Renderer*   g_renderer  = nullptr;

bool Initialize();
bool Update();
void Draw();
void Finalize();

int main( int argc, char* argv[] )
{
    if ( !Initialize() ) 
    {
        Finalize();
        return -1;
    }

    while ( true )
    {
        if ( !Update() ) break;
        Draw();
    }

    Finalize();

    return 0;
}

bool Initialize() 
{
    if ( SDL_Init( SDL_INIT_VIDEO ) != 0 )
    {
        SDL_Log( u8"SDLの初期化処理に失敗しました。エラーメッセージ: %s", SDL_GetError() );
        return false;
    }

    g_window = SDL_CreateWindow(
        u8"サンプル",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        1280,
        720,
        0
    );

    if ( g_window == nullptr )
    {
        SDL_Log( u8"ウィンドウの作成に失敗しました。エラーメッセージ: %s", SDL_GetError() );
        return false;
    }

    g_renderer = SDL_CreateRenderer(
        g_window,
        -1,
        SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
    );

    if ( g_renderer == nullptr )
    {
        SDL_Log( u8"レンダラの作成に失敗しました。エラーメッセージ: %s", SDL_GetError() );
        return false;
    }

    return true;
}

bool Update() 
{
    auto event_info = SDL_Event();

    while ( SDL_PollEvent( &event_info ) == 1 )
    {
        if ( event_info.type == SDL_QUIT ) return false;
    }

    return true;
}

void Draw() 
{
    auto point_position_x       = 100;
    auto point_position_y       = 100;

    auto line_start_position_x  = 300;
    auto line_start_position_y  = point_position_y;
    auto line_end_position_x    = 600;
    auto line_end_position_y    = line_start_position_y;

    auto rectangle              = SDL_Rect();
    rectangle.w                 = 100;
    rectangle.h                 = 100;
    rectangle.x                 = 100;
    rectangle.y                 = 200;

    auto filled_rectangle       = rectangle;
    filled_rectangle.x          = rectangle.x + 200;

    SDL_SetRenderDrawColor( g_renderer, 0, 0, 255, 255 );
    SDL_RenderClear( g_renderer );

    SDL_SetRenderDrawColor( g_renderer, 255, 255, 0, 255 );
    SDL_RenderDrawPoint( g_renderer, point_position_x, point_position_y );
    SDL_RenderDrawLine( 
        g_renderer, 
        line_start_position_x, 
        line_start_position_y, 
        line_end_position_x, 
        line_end_position_y
    );
    SDL_RenderDrawRect( g_renderer, &rectangle );
    SDL_RenderFillRect( g_renderer, &filled_rectangle );

    SDL_RenderPresent( g_renderer );
}

void Finalize() 
{
    if ( g_renderer != nullptr )    SDL_DestroyRenderer( g_renderer );
    if ( g_window   != nullptr )    SDL_DestroyWindow( g_window );
    SDL_Quit();
}

参考ページ