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:
FlaggenSDL_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
â