Zeichnen eines Rechtecks ​​mit SDL2

Lesezeit: 4 Minuten

Benutzer-Avatar
Utundu

Ich habe gerade angefangen, SDL2 zu verwenden, und ich habe bereits ein Problem. Ich möchte ein Fenster erstellen und es rot malen. Aber es bleibt weiß, und ich verstehe nicht warum.

Hier ist der Code:

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;
}

Benutzer-Avatar
Olvegard

Es gibt mehrere Probleme mit Ihrem Code, ich werde versuchen, die meisten davon zu beheben.

SDL initialisieren

SDL und SDL2 muss initialisiert werden, bevor Sie es verwenden können. Der Weg zum Initialisieren von SDL ist die folgende Funktion.

int SDL_Init(Uint32 flags)

Wo flags kann für verschiedene Subsysteme ein unterschiedlicher Wert sein. Verwenden SDL_INIT_EVERYTHINGum alles zu initialisieren.

int SDL_Init(SDL_INIT_EVERYTHING)

Lesen Sie mehr darüber hier..


Initialisieren SDL_Window und SDL_Renderer

SDL_Renderer und SDL_Window müssen eingerichtet werden, bevor Sie sie verwenden können. Sie haben Ihr Fenster bereits richtig erstellt, daher werde ich darauf nicht eingehen. So richten Sie ein ein SDL_Renderer

SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
                                 int         index,
                                 Uint32      flags)

index definiert, welcher Treiber verwendet werden soll. Stellen Sie es ein -1 um den ersten Treiber zu verwenden, der die anderen Argumente unterstützt.
flags werden verwendet, um das Rendern zu optimieren, Software zu rendern, Vsync zu verhindern usw.. Stellen Sie es ein SDL_RENDERER_ACCELERATED.

Lesen Sie mehr über SDL_CreateRenderer hier.

Mischen SDL und SDL2

SDL_Surface ist hauptsächlich etwas verwendet in SDLnicht SDL2. SDL2_image, SDL2_ttf usw noch gebraucht SDL_Surfaceaber sie werden in eine umgewandelt SDL_Texture bevor sie verwendet werden können.

SDL_FillRect(...); ist auch meist a SDL Ding. Aber wie oben gesagt, die SDL_Surface kann verwendet werden, aber Sie müssen es in ein konvertieren SDL_Texture Erste :

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Weiterlesen hier.

Und verwenden

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

Um es zu rendern, lesen Sie mehr hier.

Endlosschleife ( while(1); )

Sie sollten dies WIRKLICH nicht tun, es wird nur für immer wiederholt. Verwenden SDL_Delay( 5000 ); 5000 ms oder 5 Sekunden pausieren.

Ein einfacher Weg

Sie können verwenden

int SDL_RenderDrawRect(SDL_Renderer*   renderer,
                       const SDL_Rect* rect)

Ein Rechteck zeichnen.

Du solltest benutzen

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

Verwenden Sie zum Festlegen der Farbe für das, was Sie zeichnen

int SDL_RenderClear(SDL_Renderer* renderer)

Danach rufen Sie Ihre an SDL_RenderDrawRect()

Bis zu diesem Zeitpunkt wurde alles „hinter den Kulissen“ gezeichnet. Verwenden Sie zum Rendern auf dem Bildschirm

void SDL_RenderPresent(SDL_Renderer* renderer)

Beispiel

#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;
}

Ergebnis

Gerendertes Ergebnis


Weitere Informationen zu SDL2 finden Sie auf meiner bloggen.

  • Wau! Vielen Dank für deine Hilfe und deine Erklärungen! Das ist sehr hilfreich!

    – Utundu

    20. Februar 2014 um 12:40 Uhr


  • Ein paar Korrekturen… SDL_Renderer erfordert ein Argument und SDL_RenderDrawRect erfordert, dass die Adresse von R übergeben wird. SDL_RenderClear(pRenderer); .. SDL_RenderDrawRect(pRenderer, &r);

    – Begui

    12. Juli 2014 um 14:41 Uhr

  • @Begi Vielen Dank! Ich muss den Beispielcode zu schnell geschrieben haben, da ich im ersten Teil die Argumente richtig hatte.

    – Olevegard

    12. Juli 2014 um 17:10 Uhr

  • Sehr gute Erklärung! Aber ich stoße auf ein Problem, bei dem Sie vielleicht helfen können. Wenn ich versuche, den Renderer durch Aufrufen von SDL_CreateRender einzurichten, wird NULL zurückgegeben, und wenn ich SDL_GetError() aufrufe, wird mir mitgeteilt, dass „OpenGL-Kontext bereits erstellt“ wurde. Was bedeutet das? Nichts scheint zu rendern, und ich vermute, das liegt daran. Ich habe versucht, meine Datei genau so zu machen wie Ihre, und es passiert immer noch. Danke im Voraus!

    – Julian

    8. September 2014 um 23:36 Uhr


  • @JulianCleary Ich habe den Code aktualisiert, es waren ein paar Fehler drin. Wenn Sie es immer noch nicht zum Laufen bringen können, sollten Sie eine neue Frage mit Ihrem Code erstellen. Gerne helfe ich Ihnen weiter.

    – Olevegard

    11. September 2014 um 22:24 Uhr

1227180cookie-checkZeichnen eines Rechtecks ​​mit SDL2

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy