Satyria

SDL2 mit MSYS2 zur Programmierung installieren

Als erstes ist es wichtig, in welcher Umgebung das MSYS2 installiert wird. Für Windows 10 mit 64-Bit werden die Pakete für „x86_64“ benötigt. Sollte man allerdings eine 32-Bit Umgebung haben, sollte man auch die entsprechenden „i686“ Pakete verwenden. Leider stimmt diese Aussage nicht. Ich konnte bisher nicht herausbekommen, welche Version die richtige ist. Ich habe zwei Rechner, jeweils mit Windows 10 und 64Bit. Auf dem einen geht nur die 32-Bit-Version, auf dem anderen die 64-Bit-Version. Man muss es leider einfach versuchen, welche die richtige ist. Sollte hier jemand mehr wissen, kann er mich gerne per Mail anschreiben: SDL@satyria.de.

Ich beschreibe hier mal die 64-Bit Installation, sollte die 32-Bit Version installiert werden, so müsst ihr einfach das „x85_64“ durch „i686“ ersetzen:

Download: http://repo.msys2.org/distrib/x86_64/msys2-x86_64-20190524.exe

Downloadseite: https://www.msys2.org/

Diese Datei wird ausgeführt und wir verwenden zur einfachen Beschreibung die Standard Vorgaben.

Sobald MSYS2 installiert ist müssen wir es aktualisieren:

pacman -Syu

Da in der Regel auch das Programm „pacman“ aktualisiert wurde, muss das MSYS2 „böse“ beendet werden. Gestartet kann es dann wieder mit „Windowstaste“ und über die Tastatureingabe von „msys2“ findet Windows das Programm wieder. Sobald die Konsole wieder gestartet ist wird das MSYS2 mit folgenden Befehl weiter aktualisiert:

pacman -Su

Damit man nun programmieren kann, werden nun auch alle Development Dateien geladen:

pacman -S msys2-devel

Dieser Befehl installiert nun auch gcc, welches wir für die Programmierung benötigen. Bereits jetzt können wir in „C“ programmieren. Da wir allerdings nun SDL2 verwenden wollen, müssen wir noch ein paar Sachen dazu installieren. Damit wir uns zumindest eine Zeile sparen, installieren wir gleich SDL2_image. Durch die Abhängigkeiten dieses Pakets wird dann auch gleich das SDL2 selbst installiert:

pacman -S mingw-w64-x86_64-SDL2_image

Weiter empfehlende Pakete sind dann:

pacman -S mingw-w64-x86_64-SDL2_gfx
pacman -S mingw-w64-x86_64-SDL2_mixer
pacman -S mingw-w64-x86_64-SDL2_net
pacman -S mingw-w64-x86_64-SDL2_ttf
pacman -S mingw-w64-x86_64-smpeg2

Als Test benutzen wir das erste Programm im Kurs: 1.c und kopieren es nach C:\msys64\home\"name"\ für diese installation. Bei 32-Bit nach C:\msys32\home\"name"\ . Für „name“ ist das Verzeichnis, welches das MSYS2 für das Benutzer-Home erstellt hat. Kompiliert wird es bei 64-Bit dann mit folgenden Befehl:

gcc -o 1.exe 1.c -Ic:/msys64/mingw64/include -Lc:/msys64/mingw64/lib -lmsys-2.0 -lSDL2main -lSDL2 -mwindows

Bei 32-Bit dann:

gcc -o 1.exe 1.c -Ic:/msys32/mingw32/include -Lc:/msys32/mingw32/lib -lmsys-2.0 -lSDL2main -lSDL2 -mwindows

Gestartet wird das Programm mit:

./1.exe

SDL-Programmierung / Mehrecke

int polygonColor (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint32 color)
int polygonRGBA (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int aapolygonColor (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint32 color)
int aapolygonRGBA (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int filledPolygonColor (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint32 color)
int filledPolygonRGBA (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int texturedPolygon (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, SDL_Surface *texture, int texture_dx, int texture_dy)
rendererRenderer des Fensters
vxFeld mit x-Positionen
vyFeld mit y-Position
nAnzahl Ecken
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)
textureSDL_Surface mit einer Texture
dx, dyDelta x und Delta y der Texture

Beispiel:

Sourcen: poly.c

<Dreiecke | GFX Übersicht | Beziers >

SDL-Programmierung / Dreiecke

int trigonColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)
int trigonRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int aatrigonColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)
int aatrigonRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int filledTrigonColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)
int filledTrigonRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
rendererRenderer des Fensters
x1,x2,x3x-Position
y1,y2,y3y-Position
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)

Beispiel:

Sourcen: dreieck.c

<Ellipsen | GFX Übersicht | Mehrecke >

SDL-Programmierung / Ellipsen

int ellipseColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color)
int ellipseRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int aaellipseColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color)
int aaellipseRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int filledEllipseColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color)
int filledEllipseRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
rendererRenderer des Fensters
xx-Position
yy-Position
rxRadius X-Achse
ryRadius Y-Achse
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)

Beispiel:

Sourcen: ellipse.c

<Kreise | GFX Übersicht | Dreiecke >

SDL-Programmierung / Kreise

int circleColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color)
int circleRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int arcColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)
int arcRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int aacircleColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color)
int aacircleRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int filledCircleColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 r, Uint32 color)
int filledCircleRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int pieColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)
int pieRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int filledPieColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)
int filledPieRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
rendererRenderer des Fensters
xx-Position
yy-Position
radRadius
startBeginn des Ausschnittes (in Grad)
endEnde des Ausschnittes (in Grad)
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)

Beispiel:

Sourcen: kreis.c

<Rechtecke | GFX Übersicht | Ellipsen >

SDL-Programmierung / Rechtecke

int rectangleColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)
int rectangleRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int roundedRectangleColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color)
int roundedRectangleRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int boxColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)
int boxRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int roundedBoxColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color)
int roundedBoxRGBA (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
rendererRenderer des Fensters
x, x1, x2x-Position
y, y1, y2y-Position
radRadius Ecke
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)

Beispiel:

Sourcen: rechteck.c

<Linien | GFX Übersicht | Kreise >

SDL-Programmierung / Linien

int hlineColor     (SDL_Renderer *renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color)    
 int hlineRGBA      (SDL_Renderer *renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a)    
 int vlineColor     (SDL_Renderer *renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color)    
 int vlineRGBA      (SDL_Renderer *renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)    
 int lineColor      (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)    
 int lineRGBA       (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)    
 int aalineColor       (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color)       
 int aalineRGBA     (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 r, Uint8 g, Uint8 b, Uint8 a)    
 int thickLineColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 width, Uint32 color)    
 int thickLineRGBA  (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 width, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
rendererRenderer des Fensters
x, x1, x2x-Position
y, y1, y2y-Position
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)
widthDicke der Linie

Beispiel:

Sourcen: line.c

<Punkte | GFX Übersicht | Rechtecke >

SDL-Programmierung / Punkte

int pixelColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Uint32 color)
int pixelRGBA (SDL_Renderer *renderer, Sint16 x, Sint16 y, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
rendererRenderer des Fensters
xx-Position
yy-Position
colorDie Farbe des Pixels (Format 0xRRGGBBAA)
rRotanteil
gGrünanteil
bBlauanteil
aalphablendig (Deckung zum Hintergrund)

Beispiel:

Sourcen: pixel.c

< GFX Übersicht | Linien >

SDL-Programmierung / gfx_Programmierung

Auf den Bildschirm zeichnen

Eine kleine Info: Das Zeichnen mit SDL kann auch direkt in SDL2 erfolgen. Dies würde laut Literatur auch Performance bringen. Hier in dieser Beschreibung verzichte ich allerdings darauf. Ich verwende dazu die Funktionen aus der SDL_gfx Libary.

Die SDL_gfx Libary bietet hier einige Funktionen an. Darunter das Zeichnen von Punkten, Quadraten, Kreise usw. Aber fangen wir erstmal klein an, mit den Pixeln.

Als Ausgang verwenden wir den Source Code 3.c. Allerdings modifizieren wir es ein wenig, da wir auf das Laden eines Bildes verzichten.

Damit zerstören wir die Anzeige des Bildes, welches uns für diese Versuche stören würde.

Zunächst müssen wir es dem Kompiler mitteilen, dass wir die SDL_gfx Libarys benötigen und laden die entsprechenden Headers.

Die Funktion, die wir als erstes verwenden, ist pixelRGBA(). In dieser wird zunächst angegeben, auf welchem Ziel der Pixel gezeichnet werden soll -> renderer. Der Pixel wird dann an die Position x und y gemalt in der Farbe (Rot (255), Grün (0), Blau(0)) und mit voller Deckung (255).

Sourcecode: 4.c

Da wir wieder eine zusätzliche Bibliothek verwenden, müssen wir dies auch wieder bei der Kompilierung berücksichtigen:

Für 32-Bit

gcc -o 4.exe 4.c -Ic:/msys32/mingw32/include -Lc:/msys32/mingw32/lib -lmsys-2.0 -lSDL2_gfx -lSDL2_image -lSDL2main -lSDL2 -mwindows

Und für 64-Bit:

gcc -o 4.exe 4.c -Ic:/msys64/mingw64/include -Lc:/msys64/mingw64/lib -lmsys-2.0 -lSDL2_gfx -lSDL2_image -lSDL2main -lSDL2 -mwindows

Das Zeichnen eines Kreises

Hier nochmal kurz eine andere Funktion als Beispiel. Wir zeichnen einen Kreis.


  circleRGBA(render, x, y, 30, R, G, B, 255);
… 

Sourcecode: 5.c

Eine gesamte Auflistung aller Befehle findest Du in meiner SDL_gfx Aufstellung.

<< Übersicht | < Bilder anzeigen und speichern | Auf Eingaben reagieren >

« Zurückblättern - Weiterblättern »