Pregunta

Estoy empezando con SDL2 y tener algunos problemas tratando de entender lo que es un SDL_Renderer es.

¿Qué es?¿Qué hacer?¿Cuál es la diferencia entre SDL_Renderer, SDL_Window, SDL_Surface y SDL_Texture y cómo están relacionados?

He tenido problemas con esto cuando tratando de entender esta introducción código:

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

Yo estaba usando Twinklebear tutorial (sugerido en SDL Wiki) y se veía también en SDL Documentación de la Wiki y algunos libros.Pero todos ellos asumen que sé que estas definiciones.

¿Fue útil?

Solución

SDL_Window

SDL_Window es la estructura que almacena toda la información acerca de la Ventana:el tamaño, la posición, la pantalla completa, fronteras, etc.


SDL_Renderer

SDL_Renderer es una estructura que se encarga de todo el procesamiento.Está atado a una SDL_Window por lo que sólo puede representar dentro de ese SDL_Window.También se realiza un seguimiento de los ajustes relacionados con la prestación.Hay varias funciones importantes vinculados a la SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Esto establece el color claro de la pantalla para ( ver más abajo )

  • SDL_RenderClear(renderer);
    Esto borra la representación de destino con el empate el conjunto de colores de arriba

  • SDL_RenderCopy(
    Esta es probablemente la función que va a utilizar la mayoría, es utilizado para la representación de un SDL_Texture y tiene los siguientes parámetros :

    • SDL_Renderer* renderer,
      El prestador del servicio que desea utilizar para la representación.
    • SDL_Texture* texture,
      La textura que desea procesar.
    • const SDL_Rect* srcrect, La parte de la textura que desea procesar, NULL si quieres hacer toda la textura
    • const SDL_Rect* dstrect)
      Donde desea representar la textura en la ventana.Si la anchura y la altura de este SDL_Rect es más pequeño o más grande que las dimensiones de la textura, la textura se estira de acuerdo con este SDL_Rect
  • SDL_RenderPresent(renderer);
    El otro SDL_Render* funciones dibuja de una manera oculta de destino.Esta función tendrá que dibujar en la ventana vinculado a la empresa.

SDL_Textures y SDL_Surface

El SDL_Renderer hace SDL_Texture, que almacena la información de los píxeles de un elemento.Se trata de la nueva versión de SDL_Surface que es lo mismo.La diferencia es que en su mayoría SDL_Surface es sólo una struct contiene información de los píxeles, mientras que SDL_Texture es un potente controlador específico de representación de los datos de los píxeles.

Usted puede convertir un SDL_Surface* a SDL_Texture el uso de

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

Después de esto, el SDL_Surface debe ser liberado usando

SDL_FreeSurface( SDL_Surface* surface )

Otra diferencia importante es que SDL_Surface utiliza la representación de software (a través de la CPU), mientras que SDL_Texture utiliza el hardware de renderizado (a través de la GPU).


SDL_Rect

La más simple estructura en SDL.Contiene sólo cuatro cortos. x, y el que ocupa la posición y w, h que tiene de anchura y altura.

Es importante tener en cuenta que 0, 0 es la esquina superior izquierda en SDL.Por lo que una mayor y-el valor medio más bajo, y el de la esquina inferior derecha tendrá la coordenada x + w, y + h


Usted puede leer más acerca de SDL2 en mi blog.

Otros consejos

Piense en SDL_Window como píxeles físicos, y SDL_Renderer y un lugar para almacenar configuraciones / contexto.

para que creas un montón de recursos, y los colgarás del renderizador;Y luego, cuando está listo, le dices a Renderer que lo ponga todos juntos y envíe los resultados a la ventana.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top