¿Qué es un SDL representador?
-
21-12-2019 - |
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.
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 arribaSDL_RenderCopy(
Esta es probablemente la función que va a utilizar la mayoría, es utilizado para la representación de unSDL_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 texturaconst SDL_Rect* dstrect)
Donde desea representar la textura en la ventana.Si la anchura y la altura de esteSDL_Rect
es más pequeño o más grande que las dimensiones de la textura, la textura se estira de acuerdo con esteSDL_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.