Question

Je commence avec SDL2 et ayant peu de mal à essayer de comprendre ce qu'est un SDL_Renderer est.

Quel est-il?Que faut-il faire?Quelle est la différence entre SDL_Renderer, SDL_Window, SDL_Surface et SDL_Texture et comment ils sont liés?

J'ai eu des problèmes avec cela en essayant de comprendre l'introduction de ce code:

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

J'ai été en utilisant Twinklebear tutoriel (proposé sur SDL Wiki), s'est penché également sur la SDL Wiki de la Documentation et des livres.Mais tous assume que je sais que ces définitions.

Était-ce utile?

La solution

SDL_Window

SDL_Window est la structure qui contient toutes les infos à propos de la Fenêtre elle-même:la taille, la position, en plein écran, de frontières, etc.


SDL_Renderer

SDL_Renderer est une structure qui gère l'ensemble de rendu.Il est attaché à un SDL_Window donc, il ne peut que rendre l'intérieur de cette SDL_Window.Il permet également de suivre les paramètres liés à la prestation.Il y a plusieurs fonctions importantes liées à la SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Ceci définit la couleur claire de l'écran ( voir ci-dessous )

  • SDL_RenderClear(renderer);
    Cela désactive le rendu de la cible avec le tirage couleur définie ci-dessus

  • SDL_RenderCopy(
    C'est probablement la fonction que vous utiliserez le plus, il est utilisé pour effectuer le rendu d'un SDL_Texture et a les paramètres suivants :

    • SDL_Renderer* renderer,
      Le moteur de rendu que vous souhaitez utiliser pour le rendu.
    • SDL_Texture* texture,
      La texture que vous souhaitez rendre.
    • const SDL_Rect* srcrect, La partie de la texture que vous souhaitez rendre, NULL si vous voulez rendre l'intégralité de la texture
    • const SDL_Rect* dstrect)
      Où vous voulez rendre la texture dans la fenêtre.Si la largeur et la hauteur de ce SDL_Rect est plus petit ou plus grand que les dimensions de la texture elle-même, la texture sera étirée selon cette SDL_Rect
  • SDL_RenderPresent(renderer);
    Les autres SDL_Render* fonctions attire une cible cachée.Cette fonction prend tout cela, et de dessiner dans la fenêtre liée au moteur de rendu.

SDL_Textures et SDL_Surface

L' SDL_Renderer rend SDL_Texture, qui stocke les informations de pixel d'un élément.C'est la nouvelle version de SDL_Surface ce qui est bien le même.La différence est surtout que SDL_Surface est juste un struct contenant des informations de pixel, tandis que SDL_Texture est efficace, un pilote spécifique à la représentation de données de pixels.

Vous pouvez convertir une SDL_Surface* pour SDL_Texture à l'aide de

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

Après cela, le SDL_Surface doit être libérée à l'aide

SDL_FreeSurface( SDL_Surface* surface )

Une autre différence importante est que SDL_Surface utilise un logiciel de rendu (par CPU), tandis que SDL_Texture utilise le matériel de rendu (via GPU).


SDL_Rect

Le plus simple struct en SDL.Il ne contient que quatre courts métrages. x, y qui détient la position et w, h qui détient la largeur et la hauteur.

Il est important de noter que 0, 0 est le coin supérieur gauche de la SDL.Ainsi, un plus y-la valeur est basse, et le coin inférieur droit aura les coordonnées x + w, y + h


Vous pouvez en lire plus à propos de SDL2 sur mon blog.

Autres conseils

Pensez SDL_Window physique pixels, et SDL_Renderer et un endroit pour stocker les paramètres/contexte.

Ainsi, vous créez un tas de ressources, et de l'accrocher à l'extérieur de la fonctionnalité de rendu;et puis lors de son prêt, vous dites convertisseur de mettre tout cela ensemble et d'envoyer les résultats à la fenêtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top