SDL 2-Lernprogramme: Lektion 7 - Ansichtsfenster

Hallo allerseits! Ich bin zurück mit einer neuen Lektion für dich! Und wenn Sie es plötzlich leid sind, auf eine Lektion von mir zu warten, finden Sie diese Lektionen hier immer auf Englisch.

Beginnen wir die 7. Lektion mit dem Titel

Ansichtsfenster


Das Ansichtsfenster wird aus dem Englischen als Ansichtsort übersetzt, oder in unserem Fall als Rendering-Ort. Das Wesentliche ist: Wir nehmen und begrenzen die Zeichenfläche nicht auf das gesamte Fenster, sondern auf einen Teil davon. Dies kann beispielsweise zum Zeichnen einer Minikarte in einem Spiel hilfreich sein.

Theoretisch habe ich alles, wir wenden uns der Praxis zu.

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

Für den Anfang, wie immer Variablen deklarieren.

Wir werden diese Blume zeichnen.

Bild

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


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


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


Ich werde die Funktionen der Initialisierung, des Ladens und des Entinitialisierens von Bildern nicht beschreiben, da sie fast identisch mit denen früherer sind.

Und jetzt zum spaßigen Teil:

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

Hier haben wir eine SDL angeschlossen , ein Bild hochgeladen und zwei Rechtecke erstellt, die untereinander liegen und die gesamte Breite des Fensters einnehmen. Dies sind unsere Ansichtsfenster .

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

Als nächstes fangen wir bereits an zu zeichnen. Zunächst müssen wir den Ort der Zeichnung festlegen. Dies geschieht mit der Funktion SDL_RenderSetViewport , die zwei Parameter akzeptiert : ein Rendering und ein Rechteck, in das wir zeichnen möchten. Zeichnen Sie nach dem Festlegen des Bereichs unsere Blume mit der bekannten SDL_RenderCopy- Methode. Wiederholen Sie danach dasselbe für das zweite Rechteck.

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

Dann aktualisieren wir das Fenster, warten 2 Sekunden und beenden das Programm.

Nach dem Kompilieren und Ausführen dieses Programms sehen wir zwei abgeflachte Blüten. Das ist alles, was ich heute zeigen wollte.

Nun, hier ist so eine kleine Lektion, wenn Sie Fragen haben, werde ich gerne erklären, aber ich habe alles. Auf Wiedersehen!

<< Vorherige Lektion

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


All Articles