Dieses Tool setzt meherere HTML-Dateien zu einer HTML-Datei zusammen.
Download: DOS (auch Windows) Version: html2one.zip
Download: Linux Version: html2oneL.zip
Eine weitere WordPress-Website
Dieses Tool setzt meherere HTML-Dateien zu einer HTML-Datei zusammen.
Download: DOS (auch Windows) Version: html2one.zip
Download: Linux Version: html2oneL.zip
Copyright: Entspricht soweit der GNU-Lizenzen. Ausnahme: Wenn Ihr Teile aus dieser Datei und/oder von den Anhängen benutzt, müsst Ihr einen Link auf www.satyria.de in Euren Projekten hinterlassen und verpflichtet diejenigen die Euer Projekt in Teilen oder Insgesamt kopieren, zu diesem Copyright.
Linux ist ein sehr interessantes Betriebssystem. Es ist immer noch stark in der Entwicklung, aber ich selbst sehe darin ein hohes Potential. Es müsste bei der Installation noch so einiges getan werden. Ich selbst hatte so einige Probleme mit meiner Soundkarte, meinen Zusatzlaufwerken auf einem Promise- Kontroller und meiner ISDN-Karte.
Zu mir selbst:
Auf einem VC-20 von Comodore machte ich meine ersten Schritte. In meinem Bekanntenkreis gab es niemanden, der diese Maschine hatte. Dadurch musste ich mich selbst darum kümmern, etwas sinnvolles damit anzustellen. Meine ersten Programmierkenntnisse errang ich auf diesem Computer in BASIC und später kam dann noch Assembler hinzu. Als dann der Amiga auf den Markt kam, wollte ich einen solchen sofort haben. Auch hier gab es das Problem der Softwarebeschaffung, auch hier musste ich mich stark mit dieser Maschine aussetzen. Zunächst Basic, dann „C“ und anschließend Assembler. Besonders interessant war hier mein Projekt eines Compilers. Er war fast fertig gestellt, als dann der Amiga aus der Produktion genommen wurde. Seitdem ist der 386-PC mein Domizil.
Ich selbst benutze den Assembler „GAS“, der bei jeder Standard-Distribution mit installiert wird. Der Assembler ist ein Teil des C-Compilers „GCC“. Die Syntax der einzelnen Befehlen entspricht den der AT&T-Syntax und nicht der INTEL-Norm!!
In diesem Kurs wird nicht die Grundlage der Assemblerprogrammierung beschrieben. Dazu gibt es genügend Informationen im Internet oder im Buchhandel.
In diesem Tutor werde ich versuchen mit Assembler das X-Windows zu programmieren. Dieser Kurs entstand Zeitgleich mit TuxCom, da dort die grundlegende Programmierung des X-Windows notwendig ist.
Alle Programme, die ich hier vorstelle, müssten auf allen Windowsmanagern laufen. Getestet habe ich sie auf KDE und Gnome.
Zunächst ein kleines Programm, welches einfach nur ein Fenster öffnet. Durch anklicken in den Fensterbereich wird das Fenster geschlossen und das Programm beendet.
Hier nun das erste Beispiel:
.extern XOpenDisplay .extern XCreateWindow .extern XMapWindow .extern XNextEvent .extern exit .globl main main: pushl %ebp movl %esp, %ebp pushl $0 call XOpenDisplay addl $4, %esp movl %eax, dpy movl $2048, value_mask movl $4, win_attr+40 pushl $win_attr pushl value_mask pushl $0 pushl $0 pushl $0 pushl $4 pushl $100 pushl $100 pushl $0 pushl $0 movl dpy, %ecx movl dpy, %eax movl 132(%eax), %edx movl %edx, %eax sall $2, %eax addl %edx, %eax movl %eax, %edx sall $4, %edx movl 140(%ecx), %eax pushl 8(%eax,%edx) pushl dpy call XCreateWindow addl $48, %esp movl %eax, win pushl win pushl dpy call XMapWindow addl $8, %esp .L2: pushl $event pushl dpy call XNextEvent addl $8, %esp movl event, %eax cmpl $4, %eax je .L7 jmp .L2 .L7: pushl $0 call exit .Lfe1: .comm dpy,4,4 .comm win,4,4 .comm value_mask,4,4 .comm win_attr,60,64 .comm event,20,4 |
a_source1.s
Kompiliert wird es so:
gcc mini_prog.s -L/usr/X11/lib -lX11 -o mini_prog |
Der Parameter „-L/usr/X11/lib “ kann von der Distribution (hier Slackware oder LRs) abhängig sein. Sie gibt an, an welcher Stelle die X11 Libarys stehen. Ich werde versuchen die einzelnen Ditributionen im Anhang zu dokumentieren.
Das Programm kann nun einfach in einem Windowmanager (getestet in KDE und Gnome), gestartet werden. Wurde die Konsole aus einem Window-Manager gestartet, kann das Programm mit „./mini_prog“ ausgeführt werden. Diese Art des Ausführens, hat den Vorteil, dass Fehlermeldungen direkt in der Konsole angezeigt werden.
Das Programm öffnet nur ein kleines Window, welches von Grund her aussieht, wie es der Windowmanager vorgibt. Da es keine Refrash-Funktion gibt, sieht es aus als ob das Fenster keinen Hintergrund besitzt. Die Funktionen Fenstervergrößern, Iconifizieren und Beenden funktionieren! Wird auf der Fensteroberfläche die linke Taste der Maus gedrückt (die einzige Abfrage!) wird das Programm beendet.
Der Vorteil einer solchen Installation ist, das dieser USB-Stick jederzeit (Minimale Veränderungen) auf anderen Windows Rechnern funktioniert.
Bei mir wurde der Stick als „F“-Laufwerk erkannt, was zur Installation dann wichtig ist. Bitte beachte ausserdem, das Du auf dem Stick ca. 400MByte Speicher frei hast.
Zunächst wurde „mingw“ (Link: http://downloads.sourceforge.net/mingw) auf den USB-Stick installiert. Angabe bei mir: f:\MinGW
Anschließend wurde „msys“ (Link: http://downloads.sourceforge.net/mingw) installiert (f:\msys\1.0)
Bei der Installation wird das Konsolenfenster geöffnet und noch einige Dinge abgefragt. Hier meine Antworten:
y y f:/mingw |
Die Datei unz600xn.exe wurde ins Verzeichnis von \mingw\bin (f:\mingw\bin) kopiert und ausgeführt. Anschließend kann unz600xn.exe gelöscht werden.
unz600dn.zip wird in das Verzeichnis \mingw\bin (f:\mingw\bin) entpackt. Eventuelle Überschreibungen können akzeptiert werden.
Die Datei wget.exe wird in das \mingw\bin (f:\mingw\bin) Verzeichnis kopiert.
Es wird eine Downloadliste mit z.B. Notepad erstellt und den Namen list.txt gegeben. Diese Datei wird in das \mingw (f:\mingw) Verzeichnis kopiert.
Liste:
http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo_1.8.8-2_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo-dev_1.8.8-2_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/expat_2.0.1-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/expat-dev_2.0.1-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/fontconfig_2.7.3-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/fontconfig-dev_2.7.3-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/freetype_2.3.9-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/freetype-dev_2.3.9-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-0.14.5.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-dev-0.14.5.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime-0.17-1.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime-dev-0.17-1.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-tools-0.17.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gnutls_2.4.2-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gnutls-dev_2.4.2-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/hicolor-icon-theme_0.10-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/hicolor-icon-theme-dev_0.10-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/icon-naming-utils_0.8.7-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/icon-naming-utils-dev_0.8.7-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/iso-codes_3.5-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/iso-codes-dev_3.5-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libbzip2-1.0.5-2.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libbzip2-dev-1.0.5-2.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libgnurx-2.5.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libgnurx-dev-2.5.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libgnurx-src-2.5.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libiconv-1.9.1.bin.woe32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libjpeg-6b-4.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libpng_1.2.39-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libpng-dev_1.2.39-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libtiff_3.9.1-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libtiff-dev_3.9.1-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libxml2_2.7.3-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libxml2-dev_2.7.3-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/mozilla-nspr-4.6-winnt-opt.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/mozilla-nspr-dev-4.6-winnt-opt.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/openssl-0.9.7c.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.23-3_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config-dev_0.23-3_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/poppler-0.6.4.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/poppler-data-0.1.1.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/poppler-dev-0.6.4.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/popt-1.10.2-tml-20050828.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/popt-dev-1.10.2-tml-20050828.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/proxy-libintl-20080805.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pthreads-win32-2.7.0.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pthreads-win32-dev-2.7.0.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/regex-spencer-3.8.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/regex.README http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/shared-mime-info_0.51-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/tango-icon-theme-0.8.1.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/tango-icon-theme-dev-0.8.1.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/win_iconv-tml-20080403.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/win_iconv_dll-tml-20080403.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/zlib-1.2.3.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/zlib-dev-1.2.3.zip http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.20/glib_2.20.5-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.20/glib-dev_2.20.5-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.16/gtk+_2.16.6-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.16/gtk+-dev_2.16.6-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/pango/1.24/pango_1.24.5-2_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/pango/1.24/pango-dev_1.24.5-2_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/atk/1.26/atk_1.26.0-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/atk/1.26/atk-dev_1.26.0-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/libglade/2.6/libglade_2.6.4-1_win32.zip http://ftp.gnome.org/pub/gnome/binaries/win32/libglade/2.6/libglade-dev_2.6.4-1_win32.zip http://gnuwin32.sourceforge.net/downlinks/jpeg-bin-zip.php http://gnuwin32.sourceforge.net/downlinks/jpeg-lib-zip.php http://gnuwin32.sourceforge.net/downlinks/tiff-bin-zip.php http://gnuwin32.sourceforge.net/downlinks/tiff-lib-zip.php |
Danach wird eine DOS-Konsole geöffnet und der PATH-Variablen das entsprechende \mingw\bin Verzeichnis bekannt gegeben:
PATH = f:\mingw\bin;%PATH% |
Es wird in das \mingw (f:\mingw) Verzeichnis gewechselt und der Download gestartet:
wget -i list.txt |
Anschließend werden alle ZIP-Dateien entpackt (Eventuelle Überschreibungen können akzeptiert werden):
unzip *.zip |
Jetzt können alle ZIP-Dateien gelöscht werden:
del *.zip |
Leider gibt es hier noch einen Fehler. Das pkg-tool-kit funktioniert noch nicht. Nun könnten wir ständig, bei einem Neustart der Konsole (später) einen EXPORT-Befehl übergeben, aber nachdem dies eine Ähnliche Umgebung wie Linux ist, können wir das auch Automatisieren:
Öffne die Datei „/msys/1.0/etc/profile“. Dort wird als letzte Zeile export PKG_CONFIG_PATH=“/mingw/lib/pkgconfig“ eingegeben und abgespeichert.
So, nun haben wir eine Programmierumgebung, um GTK+-Sourcen zu kompilieren, allerdings muss die MSYS-Umgebung gestartet werden. Dies öffnet eine Konsole, in der UNIX-Befehle gelten.
Hier eine kleine (mini) Unterschiedenliste:
DOS | MSYS |
dir | ls |
cd | cd (Laufwerke müssen auch so angesprochen werden! z.B.: cd f:) |
Alle Programme, die erstellt werden, können zunächst nur in dieser UNIX-Konsole laufen, da in der Windowsumgebung das *.dll Verzeichnis nicht bekannt ist. Nun könnte in der Windowsoberfläche dieser PATH angegeben werden, allerdings liegt aber das Problem dann später daran, sollte man ein Programm weitergeben, könnten bestimmte *.dll fehlen. Ich selbst starte ein Programm in Windows und werte die Fehlermeldungen aus und kopiere dann fehlende *.DLL Dateien in mein Ausführungsverzeichnis. Wenn ich nun ein Programm weitergebe, werden alle anderen Dateien mit kopiert und das Programm müsste überall auf Windows laufen.
Wenn der Stick in einen anderen Rechner gesteckt wird, kann es vorkommen, das der Stick auf einen anderen Laufwerksbuchstaben gemountet wird. Dieses Problem kann in der Datei /msys/1.0/etc/fstab behoben werden.
Öffne die Datei und gibt hier den neuen Pfad für /mingw an. Das war es schon.
Copyright: Entspricht der GNU-Lizenzen. Ausnahme: Wenn Ihr Teile aus dieser Datei und/oder von den Anhängen benutzt, müsst Ihr einen Link auf www.satyria.de in Euren Projekten hinterlassen und verpflichtet diejenigen die Euer Projekt in Teilen oder Insgesamt kopieren, zu diesem Copyright.
Kleiner Zusatz: Solltet Ihr in SDL programmieren wollen und leider auf Linux verzichten müssen, könnt Ihr auch unter Windows mit SDL Programmieren. Auf meiner Seite zum Einrichten der SDL-Biblothek unter Windows, könnt Ihr nachlesen wie man so etwas macht!
Mit diesem Tutor möchte ich Euch ein wenig das SDL (Simple DirectMedia Layer) Programmieren beibringen. Ich selbst habe diesen Tutor mit Ubuntu 7.04 und KDE (Kubuntu) und einigen Zusatzpacketen (sdllib (dev)) (apt-get install libsdl1.2-dev) getestet.
Weitere Infos erhaltet Ihr bei: http://de.wikibooks.org/wiki/SDL
Bitte neue Version verwenden: SDL unter Windows (Update: 28.09.09)
Copyright: Entspricht soweit der GNU-Lizenzen. Ausnahme: Wenn Ihr Teile aus dieser Datei und/oder von den Anhängen benutzt, müsst Ihr einen Link auf www.satyria.de in Euren Projekten hinterlassen und verpflichtet diejenigen die Euer Projekt in Teilen oder Insgesamt kopieren, zu diesem Copyright.
Unter Windows gibt es einige Hilfsprogramme zur Programmierung von Windows. Ich selbst finde hier gcc sehr hilfreich, da ich selbst am meisten unter Linux arbeite. Leider muss ich auch auf Windows-Rechnern arbeiten. Da lag es für mich nah, eine Möglichkeit zu finden, mein Favorit der Bibliotheken (SDL), auch unter Windows zu installieren. Eventuell finde ich auch eine Version, die völlig unabhängig der Installation von Windows läuft. Also Gegoogelt und einige Ideen gefunden. Alle schrieben, es sei sehr leicht und ohne größere Probleme zu installieren, aber nicht eine Version hat funktioniert. Diese Version, die ich nun vorstelle, war zunächst auch nicht fehlerfrei (eventuell immer noch nicht). Aber schaut es Euch einfach mal an:
Achtung: Für das was jetzt kommt, übernehme ich keine Haftung. Sollte hier was Falsches angegeben werden, kann es zu Datenverlusten und auch zu unangenehmen Überraschungen kommen (Systemabstürzen!)! Eine Neuinstallation von Windows ist dann meist unwiderruflich! |
Ich habe hier ein Packet geschnürt, in dem alle wichtigen Dateien vorhanden sind:
SDL-devel(mingw32)
SDL_gfx
SDL_image (Inkl.: JPEG , PNG ( Zlib ), TIFF library)
MinGW
MSYS
Damit ist es nun möglich alle Dateien, die zumindest der Kurs beschreibt, auch unter Windows laufen zu lassen.
Download: Satyria_SDL_0.1.071018.zip (21.7 MB)
MD5SUM: 92d03d49324e15b2df52718bd0e7476c *Satyria_SDL_0.1.071018.zip
Zur Installation wird zurzeit ca. 100 MB freier Festplattenplatz benötigt!
Zunächst wird die Datei heruntergeladen. Unter Windows (ab XP) kann die ZIP-Datei einfach per Doppelklick geöffnet werden und das entstandene Verzeichnis irgendwo hin (Merken!!!) kopiert werden. In einer DOS-Konsole (Ausführen: CMD oder unter Zubehör) wird in das entsprechende Verzeichnis gewechselt und dort der Befehl „install“ ausgeführt. Das Programm möchte nun wissen, wo den die Dateien abgelegt werden sollen (Aufpassen, diese Version überprüft nicht diese Übergabe!).
In meinem Beispiel ist das Zielverzeichnis: „g:\“ (Mein USB-Stick). Nun werden alle Dateien in das entsprechende Verzeichnis kopiert und einige Umgebungsvariablen gesetzt.
Bei der Installation entstehen mehrere Verzeichnisse:
Das ist unser Ausgangspunkt zur Programmierung von SDL. In diesem Verzeichnis existiert die Datei „msys.bat“. Durch einen Doppelklick wird hier eine Unix-ähnliche Umgebung erstellt, in der einige Unix -Programme laufen. Auch unser „gcc“! Mit „cd“ kann in ein Verzeichnis oder auch Partition gewechselt werden (Bei mir mit „cd g:\“ auf den Stick).
Hier ist die „gcc“-Umgebung installiert, sowie alle Librarys und Includes
In diesem Verzeichnis habe ich ein Programm abgelegt, um zu prüfen ob den SDL überhaupt funktioniert. Zum Kompilieren wird die Datei „1.sh“ (einfach so schreiben) gestartet und die Datei „ 1.c“ kompiliert. Allerdings überprüft der Installer nicht die Verzeichnisse in „1.sh“, die zuvor überprüft werden sollten (Einfach mit einem Editor öffnen, verändern und speichern). Ausgeführt wird das Programm mit „1“. Es wird für ca. 2 sek. ein schwarzes Fenster geöffnet. Alle Programme können auch aus Windows oder einer DOS-Konsole gestartet werden!
Auch hier wird die entsprechende Library getestet. „test.sh“ ausführen und anschliesend die Datei „1.exe“ ausführen. Diese Datei ist aus der Org. SDL_gfx Library. Also auch riesige Dateien lassen sich hier Installieren. Sollte es Probleme geben, dann siehe bei test_sdl.
Datei „image.sh“ ausführen und dann das Programm „image.exe“ ausführen. Siehe auch test.sdl.
Allgemein muss ich hier noch darauf hinweisen, das in den entsprechenden Verzeichnissen auch die entsprechenden *.dll Dateien vorhanden sind, damit diese dann auch laufen! Es reicht nicht, nur die *.exe Datei weiterzugeben!
Ausserdem kann in der entsprechenden *.sh nachgeschaut werden, wie denn die Dateien kompiliert werden können. Im Kurs werde ich speziell darauf noch eingehen!
Hier sind alle wichtigen *.dll Dateien, die zum ausführen der Dateien erforderlich sind.
Hier ist eine allgemeine Beschreibung der SDL-Library im HTML-Format. Diese Dokumentation ist direkt von libSDL.org. Dort können auch jederzeit weitere Informationen geholt werden.
Solltet Ihr nun noch ein paar Probleme haben oder sogar einige gute Infos, die den anderen helfen könnten, meldet Euch einfach mal (sdlfehler@satyria.de), aber bitte denkt daran, das ich von euch ein wenig Flexibilität zumuten muss, da ich relative wenig Zeit habe, auf hunderte von Mails zu reagieren. Sollte der Fehler bei der Programmierung entstehen, gibt es genügend Foren, die Euch da weiterhelfen können.
Mit diesem Tutor möchte ich Euch ein wenig das SDL (Simple DirectMedia Layer) Programmieren beibringen. Ich selbst habe diesen Tutor mit Ubuntu 7.04 und KDE (Kubuntu) und einigen Zusatzpacketen (sdllib (dev)) (apt-get install libsdl1.2-dev) getestet.
Aber nun, damit wir auch was sehen, hier das erste Beispiel:
/* Das erste Programm: 1.c */ #include <SDL/SDL.h> //Unter Windows: <SDL.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main (int argc, char *argv[]) { SDL_Surface *screen; //ein Zeiger für ein Screen if (SDL_Init ( SDL_INIT_VIDEO ) != 0) //SDL Initialisierung { printf („SDL Initialisierung fehlgeschlagen: %s\n“,SDL_GetError ()); return EXIT_FAILURE; //Bei Fehler, beenden } atexit (SDL_Quit); //Beim beenden des Programms //wird SDL_Quit ausgeführt screen = SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE); //Erstelle Screen if (screen == NULL) { //Bei Fehler printf („Auflösung nicht gefunden: %s\n“, SDL_GetError ()); //Fehler melden! return EXIT_FAILURE; } SDL_Delay (2000); //Warte 2000 Millisec. printf („Alles OK!\n“); //Beenden mit „Alles OK!“ return EXIT_SUCCESS; } |
Kompiliert wird es unter Linux mit:
gcc `sdl-config –cflags –libs` 1.c -o 1 |
Und unter Windows und MSYS-Konsole wenn auf e:\ installiert ist, so:
gcc -o 1.exe 1.c -Ie:/mingw/include/SDL -Le:/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows |
und ausgeführt wird es mit:
./1 |
Bei diesem Prgramm wird ein SDL-Fenster für 2000 Millisekunden geöffnet.
Na ja, eigentlich kann man dieses Programm nicht wirklich als gut bezeichnen. Ein Fenster wird geöffnet und dann irgendwann wieder geschlossen.
Wir machen es nun ein bisschen spannender und reagieren zumindest mal auf das Schließensymbol.
Dazu müssen wir eine Abfrage erstellen, die dann entsprechend reagieren kann. Statt mit SDL_Delay auf das Ende zu warten, setzen wir hier eine WHILE-Schleife ein:
while (!done) { while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: done = 1; break; } } } |
Dieses Programm ist fast selbsterklärend: Die WHILE-Schleife wird solange fortgesetzt bis done einen Wert bekommen hat. Die nächste WHILE-Schleife holt einen Event (wenn vorhanden) ab, und setzt den Wert in die &event-Struktur. In der SWITCH-Schleife, werden verschieden Events getestet, hier nur beenden, und entsprechend reagiert. Bei SDL_QUIT done = 1.
Mehr muss hier nicht geschehen und unser Programm ist fertig!
Mit dem nächsten Beispiel werden andere Events aufgezeigt:
while (!done) { while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: done = 1; break; case SDL_MOUSEMOTION: printf(„Mausposition: x: %i und y: %i\n“, event.motion.x, event.motion.y); break; case SDL_KEYDOWN: printf( „Taste %s wurde gedrückt\n“, SDL_GetKeyName( event.key.keysym.sym ) ); break; case SDL_KEYUP: printf( „Taste %s wurde Losgelassen\n“, SDL_GetKeyName( event.key.keysym.sym ) ); break; } } } |
Hier Zeigt sich ein kleiner Nachteil des MS-Windowssystems. Da unter Windows keine Textausgabe vorgesehen ist, wird die Textausgabe in eine Datei „sdtout.txt“ umgeleitet und wir sehen selbst zunächst nichts von unserem Ergebnis. Diese Datei kann man aber anschließend in einem Editor durchgesehen werden. Unter Linux läuft es tadellos.
Zu der Maus:
Wie uns dieses Programm verrät sind die X und Y Koordinaten wie folgt verteilt:
x -> von links nach rechts
y -> von oben nach unten
In diesem Kapitel möchte ich ein Bild anzeigen lassen. Auch hier unterstützt uns SDL. In der Grundbibliothek „SDL“ wird die Funktion SDL_LoadBMP angeboten.
image = SDL_LoadBMP („blume.bmp“); |
In das zuvor erstellte Surface wird die entsprechende BMP kopiert. Bei einem Fehler wird im Surface „image“ NULL zurückgegeben. Dies kann nun überprüft werden und entsprechend darauf reagiert werden.
SDL_BlitSurface (image, NULL, screen, NULL); SDL_FreeSurface (image); SDL_UpdateRect (screen, 0, 0, 0, 0); |
Sourcecode: 4.c
Bild: blume.bmp
Alles: 4.zip
Das Surface „image“ wird mit SDL_BlitSurface komplett (NULL) nach screen kopiert und anschliesend mit SDL_FreeSurface gelöscht. Der entsprechende Bildschirm muss noch mit SDL_UpdateRect aktualisiert werden.
Das war es schon!
Diese vorgehensweise hat aber leider einen kleinen Nachteil, den es können nur Unkomprimierte Bitmap-Dateien angezeigt werden. Aber wie immer gibt es da Möglichkeiten, um dieses Problem aus den Weg zu gehen: Das Zauberwort heist: SDL_Image.
Hier zunächst mal die Veränderungen:
#include <SDL_image.h> … image = IMG_Load (“blume.jpg”); … |
Sourcecode: 5.c
Bild: blume.jpg
Alles: 5.zip
Das war es schon. Jetzt können Bilder in den Formaten: GIF, JPG, LBM, PCX, PNG, PNM, TGA, TIF, XCF, XPM und XV geladen werden.
So, nun haben wir ein Bild auf dem Bildschirm, leider unterstützt uns die SDL_image-Library nicht, Bilder wieder zu speichern. SDL selbst bietet bisher nur die Möglichkeit ein Bild im BMP-Format abzulegen.
if (SDL_saveBMP (image,“test.bmp”) !=0) { printf(“Konnte das Bild nicht abspeichern: %s\n“, SDL_GetError()); return EXIT_FAILURE; } |
Sourcecode: 6.c
Bild: blume.jpg
Alles: 6.zip
Besser wie nichts!
Eine kleine Info: Das Zeichnen mit SDL kann auch mit den Funktionen der SDL_gfx Libaray erfolgen. Damit wird es auch einfacher. Laut Literatur würde ein direktes Zeichnen allerdings Performance bringen. Damit Ihr wist was besser ist, könnt Ihr ein paar versuche machen. Aber zunächst zeige ich Euch, wie es ohne GFX geht.
Um mit SDL zeichnen zu können, muss man zunächst den Bildschirm sperren. Dies geschieht mit dem Befehl „SDL_LockSurface“. Wenn alle Pixel gezeichnet wurden muss der Bildschirm wieder freigegeben („SDL_UnlockSurface“) werden.
Hier nun ein Beispiel:
… if (SDL_LockSurface(screen) < 0) { printf („Konnte das Surface nicht sperren: %s\n“, SDL_GetError()); return EXIT_FAILURE; } x=50; y=100; R=0; G=255; B=255; Uint32 *bufp; for (a=0;a<=20;a++) { bufp=(Uint32 *)screen->pixels + (y+a) * screen->pitch / 4 + (x+a); *bufp = SDL_MapRGB( screen->format,R,G,B); } SDL_UnlockSurface (screen); SDL_UpdateRect (screen,0,0,0,0); … |
Sourcecode: 7.c
So schwer war es doch nicht, oder doch? Mit der GFX-Bibliothek wird es meines Erachtens einfacher. Diese Bibliothek unterstützt uns dabei, viel einfacher die Punkte (Pixel) zu zeichnen.
Das gleiche Programm, aber diesmal mit GFX
… #include <SDL_gfxPrimitives.h> … … x=50; y=100; R=0; G=255; B=255; for (a=0;a<=20;a++) { pixelRGBA(screen, x+a, y+a, R, G, B, 255); } SDL_UpdateRect (screen,0,0,0,0); … |
Sourcecode: 8.c
Was war jetzt einfacher? Aber es gibt noch mehr:
Das Zeichnen eines Kreises:
… circleRGBA(screen, x, y, 30, R, G, B, 255); … |
Sourcecode: 9.c
Eine gesamte Auflistung aller Befehle findest Du in meiner SDL_gfx Aufstellung.
DLLINTERFACE int filledPolygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color); DLLINTERFACE int filledPolygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); DLLINTERFACE int texturedPolygon(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, SDL_Surface * texture,int texture_dx,int texture_dy); |
Beispiel:
filledPolygonColor(screen, &rx1[0], &ry1[0], 5, red); // Zeichne ein Mehreck (hier Fünfeck) aus den Koordinaten rx1 und ry1 in „red“ filledPolygonRGBA(screen, &rx1[0], &ry1[0], 5, 255,0,0,255); // Zeichne ein Mehreck (hier Fünfeck) aus den Koordinaten rx1 und ry1 in der Farbe Rot (R=255,G=0,B=0), Alphablending 255 texturedPolygon(screen, &rx1[0], &ry1[0], 5, texture, 100, 100); //Zeichne ein Mehreck mit einer Texture |
gfx_filledPolygonColor.c
gfx_filledPolygonRGBA.c
gfx_texturedPolygon.c
DLLINTERFACE int aapolygonColor(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color); DLLINTERFACE int aapolygonRGBA(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint8 r, Uint8 g, Uint8 b, Uint8 a); |
Beispiel:
aapolygonColor(screen, &rx1[0], &ry1[0], 5, red); // Zeichne ein Mehreck (hier Fünfeck) aus den Koordinaten rx1 und ry1 in „red“ aapolygonRGBA(screen, &rx1[0], &ry1[0], 5, 255,0,0,255); // Zeichne ein Mehreck (hier Fünfeck) aus den Koordinaten rx1 und ry1 in der Farbe Rot (R=255,G=0,B=0), Alphablending 255 |