Domanda

Sto iniziando con SDL2 e avendo qualche problema cercando di capire cosa è un SDL_Renderer.

Che cos'è?Che cosa fa?Qual è la differenza tra SDL_RENDERER, SDL_WINDOW, SDL_SURFACE e SDL_Texture e come sono correlati?

Ho avuto problemi con questo quando cerca di capire questo codice introduttivo:

#include <iostream>
#include <SDL2/SDL.h>

int main()
{
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;
}
.

Stavo usando TwinkleBear Tutorial (suggerito su SDL Wiki) e ha guardato anche sulla documentazione Wiki SDL e alcuni libri.Ma tutti assumono che conosco queste definizioni.

È stato utile?

Soluzione

sdl_window

SDL_Window è la struttura che contiene tutte le informazioni sulla finestra stessa: dimensioni, posizione, schermo intero, bordi ecc.


.

SDL_RENDERER

SDL_Renderer è una struttura che gestisce tutto il rendering. È legato a un SDL_Window in modo da poter solo rendere solo all'interno di quel SDL_Window. Tiene anche traccia delle impostazioni relative al rendering. Ci sono diverse funzioni importanti legate al SDL_Renderer

    .
  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Questo imposta il colore che cancella lo schermo su (vedi sotto)

  • SDL_RenderClear(renderer);
    Questo cancella il bersaglio di rendering con il set di colori di disegno sopra

  • SDL_RenderCopy(
    Questa è probabilmente la funzione che utilizzerai di più, è usato per il rendering di un SDL_Texture e ha i seguenti parametri:

      .
    • SDL_Renderer* renderer,
      Il rendering che si desidera utilizzare per il rendering.
    • SDL_Texture* texture,
      La consistenza che vuoi rendere.
    • const SDL_Rect* srcrect, La parte della consistenza che vuoi rendere, null se vuoi rendere l'intera texture
    • const SDL_Rect* dstrect)
      Dove vuoi rendere la trama nella finestra. Se la larghezza e l'altezza di questo SDL_Rect sono più piccole o più piccole delle dimensioni della trama stessa, la trama verrà allungata secondo questo SDL_Rect
  • SDL_RenderPresent(renderer);
    Le altre funzioni SDL_Render * si avvicinano a un bersaglio nascosto. Questa funzione prenderà tutto e disegneràla nella finestra legata al rendering.

.

sdl_textures e sdl_surface

Il SDL_Renderer rendering generacodictagcode, che memorizza le informazioni pixel di un elemento. È la nuova versione di SDL_Texture che è lo stesso. La differenza è per lo più che SDL_Surface è solo un SDL_Surface contenente informazioni pixel, mentre struct è una rappresentazione efficiente, specifica per il conducente dei dati dei pixel.

È possibile convertire un SDL_Surface * su SDL_Texture utilizzando

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

Dopo questo, la SDL_Surface dovrebbe essere liberata usando

SDL_FreeSurface( SDL_Surface* surface )
.

Un'altra differenza importante è che SDL_Texture utilizza il rendering del software (tramite CPU) mentre SDL_Surface utilizza il rendering hardware (tramite GPU).


.

sdl_rect

La struttura più semplice in SDL. Contiene solo quattro pantaloncini. SDL_Texture che contiene la posizione e il x, y che contiene larghezza e altezza.

È importante notare che w, h è l'angolo in alto a sinistra in SDL. Quindi un valore più alto 0, 0 significa inferiore e l'angolo in basso a destra avrà la coordinata y


.

Puoi leggere di più su SDL2 sul mio Blog.

Altri suggerimenti

Pensa a SDL_Window come pixel fisici e SDL_Renderer e un luogo per archiviare Impostazioni / contesto.

Quindi crei un gruppo di risorse e appendili fuori dal rendering;E poi quando è pronto, dici a renderere di mettere tutto insieme e invia i risultati alla finestra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top