図形の描画
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();
}