Satyria

Das Tool html2one

Dieses Tool setzt meherere HTML-Dateien zu einer HTML-Datei zusammen.

Download: DOS (auch Windows) Version: html2one.zip
Download: Linux Version: html2oneL.zip

Assembler und X-Programmierung

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. 

Vorwort

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.

Das erste Programm

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.

Installation von GTK+ unter Windows

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

Den USB-Sticks auf andere Rechner benutzen

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.

SDL Programmierung (Start)

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.

Inhalt

Weitere Infos erhaltet Ihr bei: http://de.wikibooks.org/wiki/SDL

SDL-Bibliothek unter Windows

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!

Aber wie geht man nun mit dieser Datei um

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.

Das entstandene Verzeichnis

Bei der Installation entstehen mehrere Verzeichnisse:

msys

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

MinGW

Hier ist die „gcc“-Umgebung installiert, sowie alle Librarys und Includes

test_sdl

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!

test_gfx

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.

test_image

Datei „image.sh“ ausführen und dann das Programm „image.exe“ ausführen. Siehe auch test.sdl.

test_xxxx

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!

dll

Hier sind alle wichtigen *.dll Dateien, die zum ausführen der Dateien erforderlich sind.

docs

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.

Das erste Programm

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;

1.c

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

2.c

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

3.c

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

Bilder anzeigen lassen

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!

Auf den Bildschirm zeichnen

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.

SDL-Programmierung / Das Zeichnen eines gefüllten Mehrecks

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

SDL-Programmierung / Das Zeichnen eines Mehrecks mit Antialiasing

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 

gfx_aapolygonColor.c
gfx_aapolygonRGBA.c

Weiterblättern »