Tutoriels SDL 2: Leçon 7 - Viewport

Bonjour à tous! Je suis de retour avec une nouvelle leçon pour vous! Et si vous vous lassez soudainement d'attendre une leçon de moi, vous pouvez toujours trouver ces leçons en anglais ici .

Eh bien, commençons la 7e leçon avec le titre

Fenêtre


Viewport est traduit de l'anglais comme un lieu de visualisation, ou dans notre cas, c'est un lieu de rendu. L'essence est la suivante: nous prenons et limitons la surface de dessin non pas à toute la fenêtre, mais à une partie de celle-ci. Cela peut être utile, par exemple, pour dessiner une mini-carte dans un jeu.

Selon la théorie, j'ai tout, on se tourne vers la pratique.

#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; const int SCREEN_SIZE[2] = {640, 480}; SDL_Window *window = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; 

Pour commencer, comme toujours en déclarant des variables.

Nous allons dessiner cette fleur.

image

init
 bool init() { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; return false; } int flags = IMG_INIT_PNG; if (!(IMG_Init(flags)&flags)) { cout << "Can't init IMG: " << IMG_GetError() << endl; return false; } window = SDL_CreateWindow("VIEWPORT", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_SIZE[0], SCREEN_SIZE[1], SDL_WINDOW_SHOWN); if (window == NULL) { cout << "Can't create window: " << SDL_GetError() <<endl; return false; } ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() <<endl; return false; } return true; } 


charge
 bool load() { SDL_Surface *temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; return false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; SDL_FreeSurface(temp_surf); temp_surf = NULL; return false; } return true; } 


quitter
 void quit() { SDL_DestroyWindow(window); window = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); } 


Je ne décrirai pas les fonctions d'initialisation, de chargement d'image et de désinitialisation, car elles sont presque identiques à celles qui étaient antérieures.

Et maintenant pour la partie amusante:

 int main() { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } SDL_Rect top_vp = {0, 0, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2}; SDL_Rect bottom_vp = {0, SCREEN_SIZE[1] / 2, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2}; 

Ici, nous avons branché un SDL , téléchargé une image et créé deux rectangles qui sont l'un en dessous de l'autre et occupent toute la largeur de la fenêtre. Ce sont nos fenêtres d'affichage .

  SDL_RenderSetViewport(ren, &top_vp); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderSetViewport(ren, &bottom_vp); SDL_RenderCopy(ren, flower, NULL, NULL); 

Ensuite, nous commençons déjà à dessiner. Tout d'abord, nous devons établir le lieu du dessin. Cela se fait par la fonction SDL_RenderSetViewport , qui prend deux paramètres: un rendu et un rectangle dans lequel nous aimerions dessiner. Après avoir défini la zone, dessinez notre fleur dedans avec la méthode bien connue SDL_RenderCopy . Après cela, répétez la même chose pour le deuxième rectangle.

  SDL_RenderPresent(ren); SDL_Delay(2000); quit(); return 0; } 

Ensuite, nous mettons à jour la fenêtre, attendons 2 secondes et terminons le programme.

Après avoir compilé et exécuté ce programme, nous verrons deux fleurs aplaties. C'est tout ce que je voulais montrer aujourd'hui.

Eh bien, voici une si petite leçon, si vous avez des questions, je serai heureux de vous expliquer, mais j'ai tout. Salut!

<< Leçon précédente

Source: https://habr.com/ru/post/fr480252/


All Articles