Hallo allerseits, dies ist die sechste Lektion in SDL 2 und sie ist klein geworden, aber es lohnt sich. Alle Lektionen sind
hier .
In dieser Lektion werden wir Zeichnungen von Grundelementen zeichnen. Beginnen wir und begrüßen Sie zur Lektion
Lassen Sie uns zunächst sehen, was ein Primitiv ist. Ein grafisches Grundelement ist das einfachste geometrische Objekt, das auf dem Bildschirm angezeigt wird: ein Punkt, ein Liniensegment, ein Rechteck, ein Bogen, ein Kreis usw. In SDL 2 können nur Punkte, Rechtecke und Linien gezeichnet werden.
Kommen wir zum Code
#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL;
Ich werde die Deklaration von Variablen nicht beschreiben, lassen Sie uns fortfahren.
bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } 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); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; }
Initialisieren Sie in
Init SDL 2, erstellen Sie ein Fenster und rendern Sie auch hier nicht.
Ich schreibe die
Ladefunktion nicht , da wir nichts laden müssen.
In der Funktion
Beenden entfernen wir einfach das Fenster, rendern und initialisieren SDL 2 nicht.
void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; }
Ich überspringe den Aufruf der
Init- Funktion und gehe zum interessantesten Teil über. Um ein Rechteck zu zeichnen, müssen wir ein Objekt vom Typ
SDL_Rect erstellen . Seine Koordinaten und Abmessungen werden zum Zeichnen benötigt.
Ein wenig über
SDL_Rect : Dieser Datentyp ist ein Array von 4 Zahlen:
x ,
y ,
w und
h - in dieser Reihenfolge. Das heißt, dieser Code:
SDL_Rect rect = {1, 1, 1, 1}; - völlig richtig.
Damit ist die Theorie zu
SDL_Rect vervollständigt.
Beginnen wir mit dem Schreiben von Code.
SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1);
Hier wurde uns gesagt, der Putz solle schwarz malen und sie mit dem ganzen Fenster füllen. Danach sagten sie, sie sollten weiß malen. Als nächstes haben wir ein Rechteck mit Koordinaten (10; 10) und Dimensionen 50x50 erstellt. Die Funktion
SDL_RenderFillRect zeichnet ein Rechteck.
Das Zeichnen nur des Umrisses des Rechtecks unterscheidet sich nicht wesentlich.
SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2);
Wir haben ein Rechteck erstellt und die Funktion
SDL_RenderDrawRect aufgerufen . Sie zeichnet nur einen rechteckigen Umriss auf dem Bildschirm.
Der nächste Schritt ist das Zeichnen einer Linie.
SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70);
Ein Rechteck wird nicht benötigt, um eine Linie zu zeichnen. Die Funktion
SDL_RenderDrawLine akzeptiert
Renderwerte und vier Koordinaten. Dies sind die Koordinaten des Start- und Endpunkts. Ich beschloss, eine horizontale Linie zu zeichnen, die um 10 Pixel von den Rändern eingerückt war.
Das Zeichnen von Punkten unterscheidet sich fast nicht vom Zeichnen von Linien. Wir rufen die Funktion
SDL_RenderDrawPoint auf und übergeben das Rendering und die Koordinaten des Punktes. Aber nur um einen Punkt zu zeichnen, ist nicht interessant. Schreiben wir
zum Besseren, in dem wir durch 3 Pixel Punkte zeichnen.
for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); }
Wir haben eine horizontale gepunktete Linie von Punkten.
Auf dieser Zeichnung hat aufgehört. Es bleibt nur, den Bildschirm zu aktualisieren, die Pausenzeit einzustellen, zu beenden und
0 zurückzugeben .
SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; }
Damit ist unsere Lektion abgeschlossen. Hier ist der vollständige Code:
#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } 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); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; } int main (int arhc, char ** argv) { if (!init()) { quit(); system("pause"); return 1; } SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1); SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2); SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70); for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); } SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; }
Und ich verabschiede mich von dir, tschüss alle!
<< Vorherige Lektion || Nächste Lektion
>>