画像と線、円、四角形の描写方法
SDL2のダウンロードはここから
https://github.com/libsdl-org/SDL/releases/tag/release-2.30.4
VSを使うときはSDL2-devel-2.30.4-VS.zip
プロジェクトをx86に変更してください。
プロジェクトプロパティーのC/C++->全般->追加のインクルードディレクトリに
includeファイルを指定
リンカー->全般->追加のライブラリディレクトリに
lib/x86を指定
リンカー->全般->追加の依存ファイルに
SDL2.lib
SDL2main.lib
ビルドイベント->ビルド後のイベント->コマンドラインに
xcopy "C:\Users\macar\SDL2-devel-2.30.4-VC\SDL2-2.30.4\lib\x86\SDL2.dll" "$(OutDir)" /i /s /y
SDL2.dllを指定し"$(OutDir)" /i /s /yを追加記述する
#include <SDL.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("SDL_Init Error: %s\n", SDL_GetError());
return 1;
}
SDL_Window *win = SDL_CreateWindow("SDL2 Window", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
if (win == NULL) {
printf("SDL_CreateWindow Error: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == NULL) {
SDL_DestroyWindow(win);
printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
// メインループ
int running = 1;
SDL_Event e;
while (running) {
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
running = 0;
}
}
SDL_SetRenderDrawColor(ren, 0, 0, 0, 255); // 背景色を黒に設定
SDL_RenderClear(ren); // 画面をクリア
// 描画コードはここに追加
SDL_RenderPresent(ren); // 画面に描画内容を反映
}
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
線の描写
SDL_SetRenderDrawColor(ren, 255, 0, 0, 255); // 線の色を赤に設定
SDL_RenderDrawLine(ren, 100, 100, 200, 200); // 線を描画
四角形の描写
SDL_Rect rect = { 300, 300, 200, 100 }; // 四角形の位置とサイズ
SDL_SetRenderDrawColor(ren, 0, 255, 0, 255); // 四角形の色を緑に設定
SDL_RenderFillRect(ren, &rect); // 四角形を描画
円の描写(自作)
void DrawCircle(SDL_Renderer *renderer, int centerX, int centerY, int radius) {
const int diameter = (radius * 2);
int x = (radius - 1);
int y = 0;
int tx = 1;
int ty = 1;
int error = (tx - diameter);
while (x >= y) {
// 8つのセグメントに円を描画
SDL_RenderDrawPoint(renderer, centerX + x, centerY - y);
SDL_RenderDrawPoint(renderer, centerX + x, centerY + y);
SDL_RenderDrawPoint(renderer, centerX - x, centerY - y);
SDL_RenderDrawPoint(renderer, centerX - x, centerY + y);
SDL_RenderDrawPoint(renderer, centerX + y, centerY - x);
SDL_RenderDrawPoint(renderer, centerX + y, centerY + x);
SDL_RenderDrawPoint(renderer, centerX - y, centerY - x);
SDL_RenderDrawPoint(renderer, centerX - y, centerY + x);
if (error <= 0) {
++y;
error += ty;
ty += 2;
}
if (error > 0) {
--x;
tx += 2;
error += (tx - diameter);
}
}
}
// 使用例
SDL_SetRenderDrawColor(ren, 0, 0, 255, 255); // 円の色を青に設定
DrawCircle(ren, 400, 300, 100); // 円を描画
画像描写(SDL_image)
https://github.com/libsdl-org/SDL_image/releases
VSを使うときはSDL2_image-devel-2.8.2-VS.zip
プロジェクトプロパティーにincludeとlib/x86を読み込み
SDL_image.libのインストールは追加の依存ファイル
SDL_image.dllはビルド後のイベントのコマンドラインに
xcopy "C:\Users\macar\SDL2_image-2.8.2\lib\x86\SDL2_image.dll" "$(OutDir)" /i /s /y
画像描写のための関数
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
void DrawImage(SDL_Renderer* renderer, const char* filePath, int x, int y) {
// 画像を読み込む
SDL_Surface* surface = IMG_Load(filePath);
if (!surface) {
printf("IMG_Load Error: %s\n", IMG_GetError());
return;
}
// サーフェスからテクスチャを作成
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
if (!texture) {
printf("SDL_CreateTextureFromSurface Error: %s\n", SDL_GetError());
return;
}
// テクスチャの幅と高さを取得
int texW = 0;
int texH = 0;
SDL_QueryTexture(texture, NULL, NULL, &texW, &texH);
SDL_Rect dstRect = { x, y, texW, texH };
// テクスチャを描画
SDL_RenderCopy(renderer, texture, NULL, &dstRect);
// テクスチャを破棄
SDL_DestroyTexture(texture);
}
int main(int argc, char* argv[]) {
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("SDL_Init Error: %s\n", SDL_GetError());
return 1;
}
if (!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) {
printf("IMG_Init Error: %s\n", IMG_GetError());
SDL_Quit();
return 1;
}
SDL_Window* win = SDL_CreateWindow("SDL2 Window", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
if (win == NULL) {
printf("SDL_CreateWindow Error: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == NULL) {
SDL_DestroyWindow(win);
printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
// メインループ
int running = 1;
SDL_Event e;
while (running) {
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
running = 0;
}
}
SDL_SetRenderDrawColor(ren, 0, 0, 0, 255); // 背景色を黒に設定
SDL_RenderClear(ren); // 画面をクリア
// 描画コードはここに追加
DrawImage(ren, "パスを指定.png", 200, 150); // 画像を描画
SDL_RenderPresent(ren); // 画面に描画内容を反映
}
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
IMG_Quit();
SDL_Quit();
return 0;
}