SDL2のメモ帳とVSでの環境構築

画像と線、円、四角形の描写方法
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を追加記述する
```c++: 初期
#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;
}
```
線の描写
```c++
SDL_SetRenderDrawColor(ren, 255, 0, 0, 255); // 線の色を赤に設定
SDL_RenderDrawLine(ren, 100, 100, 200, 200); // 線を描画
```
四角形の描写
```c++
SDL_Rect rect = { 300, 300, 200, 100 }; // 四角形の位置とサイズ
SDL_SetRenderDrawColor(ren, 0, 255, 0, 255); // 四角形の色を緑に設定
SDL_RenderFillRect(ren, &rect); // 四角形を描画
```
円の描写(自作)
```c++
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
画像描写のための関数
```c++
#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;
}

```