0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-06-30

画像と線、円、四角形の描写方法
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;
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?