2017-12-29 8 views
0

Meine Strichzeichnung funktioniert gut, aber die Linie flackert. Ich dachte daran, die FPS meiner Schleife zu ändern, aber ich denke, ich muss nur meinen RenderPresent() Code in einer anderen Zeile hinzufügen oder einen neuen Code hinzufügen, um die Zeile zu rendern. Ich habe viele Möglichkeiten ausprobiert und nichts hat funktioniert.Zeichnungslinie flackert in SDL2 C++. Wie ändere ich meine Spielschleife?

Was kann ich tun, um das Flackern der Leitung zu stoppen? Wenn Sie weitere Informationen benötigen, schreiben Sie uns bitte einen Kommentar.

// Global variables 
SDL_Event event;    // Event object 
int mouse_x = 0;    // Actual Mouse Coordinate X 
int mouse_y = 0;    // Actual Mouse Coordinate Y 
int mouse_last_x = 0;  // The coordinate X by last click 
int mouse_last_y = 0;  // The coordinate Y by last click 
bool dragged = false;  // Boolean after I clicked on some place 
bool running = true;   // Makes the game loop run 

void GameWin::loop()   //Game Loop 
{ 
    while (running) 
    { 
     SDL_GetMouseState(&mouse_x, &mouse_y); // Get Mouse Coordninates 
     SDL_PollEvent(&event); 

     SDL_SetRenderDrawColor(GameWin::renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); // Draw The Background Black 

     update(); 
     render(); 

     switch (event.type) 
     { 
     case SDL_QUIT: 
      running = false; 
      break; 
     case SDL_MOUSEBUTTONDOWN: // Mouse Click Event 
      if (event.button.button == SDL_BUTTON_LEFT) 
      { 
       mouse_last_x = mouse_x; // After Left Click Save my Mouse Coordingates 
       mouse_last_y = mouse_y; 
       dragged = true;   
      } 
      break; 
     case SDL_MOUSEMOTION: 
      if (dragged) 
      { 
       SDL_SetRenderDrawColor(GameWin::renderer, 137, 255, 85, SDL_ALPHA_OPAQUE); // Set The Color Line To Green 
       SDL_RenderDrawLine(GameWin::renderer, mouse_last_x, mouse_last_y, mouse_x, mouse_y); // Draw The Line 
       SDL_RenderPresent(GameWin::renderer); // Render Line 
      } 
      break; 
     case SDL_MOUSEBUTTONUP: 
      if (dragged) 
      { 
       dragged= false; 
       mouse_last_x = mouse_x; 
       mouse_last_y = mouse_y; 
      } 
      break; 
     default: 
      break; 
     } 
    } 
} 

// My render method 
void GameWin::render() 
{ 
    SDL_RenderClear(GameWin::renderer); 
    SDL_RenderPresent(GameWin::renderer); 
} 

Antwort

1

Zunächst prüfen Sie nicht, ob überhaupt ein Ereignis aufgetreten ist. Sie rufen SDL_PollEvent, und dann Ereignis verarbeiten - es könnte in Ordnung sein, oder es könnte völlig falsch sein, da es keine Garantie gibt, dass ein Ereignis in der Warteschlange war. SDL_PollEvent gibt 0 zurück, wenn die Warteschlange leer ist - was bedeutet, dass Ihre Ereignisstruktur keine aussagekräftigen Daten enthält.

Zweitens, kombinieren Sie die Ereignisbehandlung nicht mit dem Zeichnen. Rufen Sie alle Ereignisse ab, die zwischen Iterationen aufgetreten sind, und zeichnen Sie dann einmal.

Grundsätzlich sollte es so etwas wie:

#include "SDL.h" 

// Global variables 
SDL_Event event;    // Event object 
int mouse_x = 0;    // Actual Mouse Coordinate X 
int mouse_y = 0;    // Actual Mouse Coordinate Y 
int mouse_last_x = 0;  // The coordinate X by last click 
int mouse_last_y = 0;  // The coordinate Y by last click 
bool dragged = false;  // Boolean after I clicked on some place 
bool running = true;   // Makes the game loop run 

int main(int argc, char **argv) { 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Window *w = NULL; 
    SDL_Renderer *renderer = NULL; 
    SDL_CreateWindowAndRenderer(640, 480, 0, &w, &renderer); 

    while (running) 
    { 
     SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); 
     SDL_RenderClear(renderer); 

     SDL_GetMouseState(&mouse_x, &mouse_y); // Get Mouse Coordninates 
     while(SDL_PollEvent(&event)) { 
      switch (event.type) 
      { 
      case SDL_QUIT: 
       running = false; 
       break; 
      case SDL_MOUSEBUTTONDOWN: // Mouse Click Event 
       if (event.button.button == SDL_BUTTON_LEFT) 
       { 
        mouse_last_x = mouse_x; // After Left Click Save my Mouse Coordingates 
        mouse_last_y = mouse_y; 
        dragged = true;   
       } 
       break; 
      case SDL_MOUSEBUTTONUP: 
       if (dragged) 
       { 
        dragged= false; 
        mouse_last_x = mouse_x; 
        mouse_last_y = mouse_y; 
       } 
       break; 
      default: 
       break; 
      } 
     } 

     if(!running) break; 

     if (dragged) 
     { 
      SDL_SetRenderDrawColor(renderer, 137, 255, 85, SDL_ALPHA_OPAQUE); // Set The Color Line To Green 
      SDL_RenderDrawLine(renderer, mouse_last_x, mouse_last_y, mouse_x, mouse_y); // Draw The Line 
     } 

     SDL_RenderPresent(renderer); 
    } 
} 
+0

Vielen Dank! :) –

Verwandte Themen