SDL 2 Lektionen: Lektion 6 - Grundelemente

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

Primitive


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

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


All Articles