SDL 2 Tutorials: Lektion 5 - Texturen

Hallo an alle und willkommen zur fĂŒnften Lektion zu SDL 2, in der wir die Texturen analysieren und die Arbeit des Computers vereinfachen. Alle Lektionen auf Englisch finden Sie hier .

In der zweiten Version von SDL gibt es eine sehr gute Möglichkeit, Texturen zu erstellen und zu rendern. Das Rendern von Hardware ist viel schneller als das Zeichnen von OberflÀchen in einem Fenster.

Texturen haben ihren eigenen Datentyp - SDL_Texture . Wenn wir mit Texturen arbeiten, benötigen wir ein Rendering zum Rendern. Jetzt werden wir das alles bekannt geben.

#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; 

Hier haben wir das Fenster, den Putz und diese Blume angekĂŒndigt.
Wir haben auch Bibliotheken verbunden und FenstergrĂ¶ĂŸen festgelegt.

Die Init- Funktion muss ebenfalls geÀndert werden.

  bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init: " << SDL_GetError() << endl; ok = false; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } 

Erstellen Sie zunÀchst die Variable ok , um die Funktion nicht sofort zu beenden, sondern alle Fehler wÀhrend der Initialisierung zu finden. Initialisieren Sie als NÀchstes die SDL und erstellen Sie auf bekannte Weise ein Fenster.

Es ist Zeit, einen Render zu deklarieren.

  ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); 

Das Rendern wird von der Funktion SDL_CreateRenderer deklariert. Es werden 3 Werte benötigt: ein Fenster, fĂŒr das dieses Rendering verwendet wird, ein Treiberindex (oder -1, wenn wir den ersten geeigneten finden möchten) und Flags. Ich habe die Flags SDL_RENDERER_ACCELERATED und SDL_RENDERER_PRESENTVSYNC verwendet . Hier ist eine Liste aller Flags:

Flaggen
SDL_RENDERER_SOFTWARE - Fallback fĂŒr;
SDL_RENDERER_ACCELERATED - Verwendung der Hardwarebeschleunigung;
SDL_RENDERER_PRESENTVSYNC - vertikale Synchronisation;
SDL_RENDERER_TARGETTEXTURE - UnterstĂŒtzung fĂŒr das Rendern in Textur.

Als NĂ€chstes verwenden wir die Funktion SDL_SetRenderDrawColor , mit der die Farbe fĂŒr das Zeichnen von Grundelementen festgelegt wird .

Initialisieren Sie danach den IMG und kehren Sie in Ordnung zurĂŒck .

  int flags = IMG_INIT_PNG; if (!(IMG_Init(flags) & flags)) { cout << "Can't init image: " << IMG_GetError() << endl; ok = false; } return ok; } 

Jetzt schreiben wir die Ladefunktion .

 bool load() { bool ok = true; SDL_Surface * temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; ok = false; } 

Hier haben wir auch die Variable ok fĂŒr die gleichen Anforderungen erstellt. Sie erstellten eine temporĂ€re OberflĂ€che und luden Blumenbilder hinein.

Als nĂ€chstes mĂŒssen wir eine Textur aus der OberflĂ€che machen.

  flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; ok = false; } 

Die Funktion SDL_CreateTextureFromSurface hilft uns beim Erstellen der Textur. Es nimmt Render- und OberflĂ€chenwerte an. Es gibt eine Instanz der SDL_Texture- Klasse zurĂŒck.

Um den Speicher nicht zu verstopfen, mĂŒssen wir die temporĂ€re OberflĂ€che reinigen. Danach kehren Sie in Ordnung zurĂŒck und die Funktion ist bereit.

Die Funktion Beenden hat einige weitere Aktionen ausgefĂŒhrt.

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

Hier haben wir das Fenster entfernt, gerendert, texturiert und SDL und IMG verlassen . Ich habe auch alle gelöschten Objekte auf NULL gesetzt, um den Speicher noch besser zu bereinigen.

Wir beginnen die Hauptfunktion zu schreiben.

 int main (int argc, char ** argv) { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } 

Wir haben Initialisierung und Laden geschrieben, wir hören hier nicht auf.

Der nÀchste Schritt besteht darin, 2 Variablen zu erstellen.

  bool run = true; SDL_Event e; 

Dieses Programm hat einen Hauptzyklus zum Aktualisieren des Speichers. Beginnen wir also mit dem Entschreiben.

 while (run) { while(SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { run = false; } } 

Verarbeitete das Ereignis des DrĂŒckens des Kreuzes und das war's.

Es ist Zeit zu zeichnen. Bei der Verwendung von Texturen und beim Rendern werden andere Funktionen zum Rendern verwendet als bei uns bekannten. Um den Bildschirm von gezeichneten Texturen zu löschen, wird die Funktion SDL_RenderClear verwendet . Es malt den Bildschirm mit der Farbe, die wir mit der Funktion SDL_SetRenderDrawColor angegeben haben . Die Funktion SDL_RenderCopy wird zum Rendern der Textur verwendet, und SDL_RenderPresent wird zum Aktualisieren des Bildschirms verwendet. Wir werden sie jetzt schreiben.

  SDL_RenderClear(ren); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderPresent(ren); } 

Wir werden nur die SDL_RenderCopy- Funktion analysieren . Es braucht 4 Bedeutungen. Das erste ist ein Rendering, das zweite ist eine Textur, das dritte ist ein Rechteck, dessen FlĂ€che wir zum Rendern ausschneiden möchten, das vierte ist ein Rechteck, dessen Koordinaten zum Rendern verwendet werden, und die Breite und Höhe dienen zum Ändern der GrĂ¶ĂŸe der Textur.

Rufen Sie als nĂ€chstes die Quit- Funktion auf und geben Sie 0 zurĂŒck .

  quit(); return 0; } 

Darauf werde ich die Lektion beenden, wenn etwas nicht klar war - schreibe und ich verabschiede mich, auf Wiedersehen!

Hier ist ĂŒbrigens der vollstĂ€ndige Code:

 #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init: " << SDL_GetError() << endl; ok = false; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); int flags = IMG_INIT_PNG; if (!(IMG_Init(flags) & flags)) { cout << "Can't init image: " << IMG_GetError() << endl; ok = false; } return ok; } bool load() { bool ok = true; SDL_Surface * temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; ok = false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; ok = false; } SDL_FreeSurface(temp_surf); return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); } int main (int argc, char ** argv) { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } bool run = true; SDL_Event e; while (run) { while(SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { run = false; } } SDL_RenderClear(ren); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderPresent(ren); } quit(); return 0; } 

← Vorherige Lektion | NĂ€chste Lektion →

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


All Articles