web-dev-qa-db-ja.com

SDL2で長方形を描く

SDL2を使い始めたばかりで、すでに問題が発生しています。ウィンドウを作成して、赤でペイントしたい。しかし、それは白いままであり、私はその理由がわかりません。

ここにコードがあります:

int main (int argc, char** argv) {
    SDL_Window* pWindow = NULL;
    pWindow = SDL_CreateWindow("Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_SHOWN);

    SDL_Surface* pSurface = NULL;
    pSurface = SDL_GetWindowSurface(pWindow);
    SDL_FillRect(pSurface, NULL, SDL_MapRGB(pSurface->format, 255, 0, 0));

    while(1);

    SDL_FreeSurface(pSurface);
    SDL_DestroyWindow(pWindow);
    SDL_Quit();
    return EXIT_SUCCESS;
}
14
Utundu

あなたのコードにはいくつかの問題があります。私はそれらのほとんどに対処しようとします。

SDLを初期化する

SDLおよび_SDL2_を使用するには、初期化する必要があります。 SDLを初期化する方法は次の関数です。

_int SDL_Init(Uint32 flags)
_

ここで、flagsは、サブシステムごとに異なる値にすることができます。すべてを初期化するには、_SDL_INIT_EVERYTHING_を使用します。

_int SDL_Init(SDL_INIT_EVERYTHING)
_

それについてもっと読む ここ


_SDL_Window_および_SDL_Renderer_を初期化する

_SDL_Renderer_および_SDL_Window_は、使用する前に設定する必要があります。すでにウィンドウは適切に作成されているので、ここでは説明しません。 _SDL_Renderer_の設定方法は次のとおりです

_SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
                                 int         index,
                                 Uint32      flags)
_

indexは、使用するドライバーを定義します。他の引数をサポートする最初のドライバーを使用するには、これを_-1_に設定します。
flagsは、レンダリングの最適化、ソフトウェアの再方向付け、vsyncの防止などに使用されます。これを_SDL_RENDERER_ACCELERATED_に設定します。

_SDL_CreateRenderer_の詳細については、こちらをご覧ください こちら

SDLと_SDL2_の混在

_SDL_Surface_は主にSDLで使用されるものであり、_SDL2_ではありません。 _SDL2_image_、_SDL2_ttf_などは引き続き_SDL_Surface_を使用しますが、使用する前に_SDL_Texture_に変換されます。

SDL_FillRect(...);も、ほとんどSDLです。ただし、上記のとおり、_SDL_Surface_を使用できますが、最初に_SDL_Texture_に変換する必要があります。

_SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)
_

詳細を読む ここ

そして使う

_int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)
_

レンダリングするには、詳細を読む ここ

無限ループ(while(1);

あなたは本当にこれをするべきではありません、それは永遠にループします。 SDL_Delay( 5000 );を使用して、5000ミリ秒または5秒間一時停止します。

より簡単な方法

使用できます

_int SDL_RenderDrawRect(SDL_Renderer*   renderer,
                       const SDL_Rect* rect)
_

長方形を描く。

あなたは使うべきです

_int SDL_SetRenderDrawColor(SDL_Renderer* renderer,
                           Uint8         r,
                           Uint8         g,
                           Uint8         b,
                           Uint8         a)
_

描画しているものの色を設定するには、

_int SDL_RenderClear(SDL_Renderer* renderer)
_

その後、SDL_RenderDrawRect()を呼び出します

この時点まで、すべてが「舞台裏」で描かれてきました。画面にレンダリングするには、

_void SDL_RenderPresent(SDL_Renderer* renderer)
_

_#include <SDL2/SDL.h>

int main (int argc, char** argv)
{
    SDL_Window* window = NULL;
    window = SDL_CreateWindow
    (
        "Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_SHOWN
    );

    // Setup renderer
    SDL_Renderer* renderer = NULL;
    renderer =  SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);

    // Set render color to red ( background will be rendered in this color )
    SDL_SetRenderDrawColor( renderer, 255, 0, 0, 255 );

    // Clear winow
    SDL_RenderClear( renderer );

    // Creat a rect at pos ( 50, 50 ) that's 50 pixels wide and 50 pixels high.
    SDL_Rect r;
    r.x = 50;
    r.y = 50;
    r.w = 50;
    r.h = 50;

    // Set render color to blue ( rect will be rendered in this color )
    SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );

    // Render rect
    SDL_RenderFillRect( renderer, &r );

    // Render the rect to the screen
    SDL_RenderPresent(renderer);

    // Wait for 5 sec
    SDL_Delay( 5000 );

    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}
_

結果

Rendered result


SDL2の詳細については、私の ブログ を参照してください。

63
olevegard