私は、より楽しくインタラクティブな方法でC++を学ぶという最終目標でSDL2の使い方を教えてくれるthis tutorialです。SDL2レンダラーが私に問題を与えている
このためには、線、ポリゴン、および円を描画するだけで済みます。
したがって、画面上にウィンドウを作成する方法とイベント処理を紹介するパート3を読んだパート1を読んだ後、レンダリングの作成方法と描画方法スクリーン上の長方形。これは私が今までに持っているコードです(チュートリアルのコードとまったく同じではありません。SDLオブジェクトを渡すための構造体を導入し、混乱していたエラー処理をすべて削除しました)。
#include <SDL2/SDL.h>
//screen dimensions costants
#define SCREEN_WIDTH 540
#define SCREEN_HEIGHT 960
//data structure holding the objects needed to create a window and draw on it
struct interface {
SDL_Window * window = NULL;
SDL_Surface * surface = NULL;
SDL_Renderer * renderer = NULL;
};
//function which inits the sdl and creates an interface object
interface init() {
interface screen;
SDL_Init(SDL_INIT_VIDEO);
screen.window = SDL_CreateWindow("", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
screen.surface = SDL_GetWindowSurface(screen.window);
screen.renderer = SDL_CreateRenderer(screen.window, -1, SDL_RENDERER_ACCELERATED);
return screen;
}
//function to free the memory and close the sdl application
void close(interface screen) {
SDL_DestroyRenderer(screen.renderer);
SDL_DestroyWindow(screen.window);
screen.renderer = NULL;
screen.window = NULL;
SDL_Quit();
}
int main(int argc, char* args[]) {
//start the application
interface screen = init();
//setup for event handling
bool quit = false;
SDL_Event event;
//the shape to render
SDL_Rect fillRect = { SCREEN_WIDTH/4, SCREEN_HEIGHT/4, SCREEN_WIDTH/2, SCREEN_HEIGHT/2 };
//main loop which first handles events
while (!quit) {
while (SDL_PollEvent(&event) != 0) {
if (event.type == SDL_QUIT)
quit = true;
}
//should draw a red rectangle on the screen
SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(screen.renderer);
SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderFillRect(screen.renderer, &fillRect);
}
//End the application
close(screen);
return 0;
}
問題は、プログラムは何も画面に描画されず(黒のままです)、私が行を削除すると、アプリケーションを終了するのが難しいと感じるような形で多くの遅れが始まります。 。
私はC4droidとC4droidのSDLプラグインを使用してAndroidでプログラミングしています。
どうしてですか?私は間違って何をしていますか?
EDITend
にclose
の名前を変更することにより、メインループの終わりにSDL_RenderPresent(screen.renderer);
への呼び出しを含むことによって解決される問題。この設定では、画面の表面を削除する必要があります。またはプログラムは何も描画しません。私が持っていないのでコメント欄に質問
あなたのSDL_RenderPresentはどこですか?さらに、非静的関数 'close'を呼び出すことは、システム関数のエイリアスとしては本当に悪い考えです。 – keltar
システム機能? 'close'システム関数はありますか? – user6245072
編集:結局のところ、表面が必要なように見えます。 'SDL_RenderPresent'コールは、レンダラでレンダリングされたものが何であれ表示するために、すべてのループ(最後に可能です)に必要です。 –