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
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.
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