2016-06-22 7 views
1

私は、より楽しくインタラクティブな方法で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でプログラミングしています。

どうしてですか?私は間違って何をしていますか?

EDITendcloseの名前を変更することにより、メインループの終わりにSDL_RenderPresent(screen.renderer);への呼び出しを含むことによって解決される問題。この設定では、画面の表面を削除する必要があります。またはプログラムは何も描画しません。私が持っていないのでコメント欄に質問

+0

あなたのSDL_RenderPresentはどこですか?さらに、非静的関数 'close'を呼び出すことは、システム関数のエイリアスとしては本当に悪い考えです。 – keltar

+0

システム機能? 'close'システム関数はありますか? – user6245072

+0

編集:結局のところ、表面が必要なように見えます。 'SDL_RenderPresent'コールは、レンダラでレンダリングされたものが何であれ表示するために、すべてのループ(最後に可能です)に必要です。 –

答えて

1

Screenshot

まず答えるため@keltarと@Wutipong Wongsakuldejする

おかげで、私は、Windows(MSYS2)ではなく、Android上でコードをテストしました現時点ではAIDEがインストールされています。

基本的に私はメインループへのコードの2行を追加しました:あなたが画面にこれまでrenderredてきたものは何でも

//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); 
    /** below lines are added **/ 
    SDL_RenderPresent(screen.renderer); 
    SDL_Delay(0); 
} 
  • SDL_RenderPresentドロー。これにより、出力が表示されます。

  • SDL_Delay()これは、cpu時間をOSに戻すために追加されたものです。これがなければ、アプリケーションが応答しなくなり、CPU使用率が一部のオペレーティングシステム(特に古いもの)の100%(1つのコアで)になります。とにかくこれがAndroidに必要かどうかわかりません。試してみる。

+0

スクリーンを削除しています。表面はWindows上で便利ですか?私がそこに置いておくと、デバイスの画面にnothongが描画されます。 – user6245072

+0

通常、レンダラーまたはサーフェスのどちらか一方だけを使用します。この場合、レンダラーを使用してサーフェスを削除します。チュートリアルには両方のメソッドが含まれている可能性があるので、両方とも同じ構造になっています。プロダクションコードでは、それらのうちの1つだけを使用します。 –

関連する問題