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;
}
あなたのコードにはいくつかの問題があります。私はそれらのほとんどに対処しようとします。
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;
}
_
SDL2の詳細については、私の ブログ を参照してください。