Entwicklung: Unterschied zwischen den Versionen

Aus SEGA-DC.DE
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(34 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''An wen richtet sich diese Anleitung?'''
Der Dreamcast gehört zu den interessantesten Plattformen für Hobby-Programmierer. Zur Programmierung ist nichts weiter als einiges an kostenloser Software aus dem Internet und natürlich einer Dreamcast erforderlich. Nach wie vor wird für die Dreamcast neue Homebrew-Software entwickelt.  
Diese Anleitung richtet sich an alle, die grundlegende Kenntnisse in der Programmierung mit C oder C++ haben und ihre Dreamcast-Entwicklungsumgebung bereits konfiguriert haben. Eure Kenntnisse müssen nicht überragend sein, es reicht völlig, wenn ihr wisst was Variablen, Klassen, Header, Zeiger und Funktionen sind. In dieser Anleitung lernt ihr, wie man mit Hilfe von SDL für die Dreamcast-Konsole programmiert.  


Fangen wir mit ein paar Headerdateien an:
Mit [[KallistiOS]] steht ein legales und kostenloses Entwicklersystem zur Verfügung, dass sich durchaus auch mit den offiziellen SEGA-Tools messen kann. Programmiert wird mit den Programmiersprachen [[C]] und [[C++]], die beide eine Art de-facto-Standard in der Informatik und insbesondere in der Spieleprogrammierung darstellen. Für besonders rechenintensive Anwendungsbereiche kann auf der Dreamcast auch [[Assembler]] verwendet werden.


#include <kos.h>
Auch du kannst Programme für Dreamcast schreiben! Auf den folgenden Seiten wollen wir angehenden Dreamcast-Entwicklern helfen, mit der Dreamcast-Programmierung anzufangen.
#include <stdio.h>
#include <SDL.h>
#include <SDL_dreamcast.h>


kos.h ist der Standard-Header von KallistiOS, stdio.h ist eion Header aus der C-Standardbibliothek, SDL.h ist der Header der SDL-Bibliothek und SDL_dreamcast.h enthält Dreamcast-spezifische Teile von SDL. Das ganze ist also nichts wirklich neues.
Hier findet ihr Kurse, Anleitungen und mehr, die euch helfen für die Dreamcast-Konsole zu entwickeln.


SDL_Surface *screen = NULL;
==Einrichten==
SDL_Surface *bild= NULL;
*[[Entwicklungsprogramme]] - Hier findet ihr eine Übersicht aller Programme, die ihr zum Entwickeln für Dreamcast benötigt
*[[Dreamcast-Entwicklungumgebung unter Linux einrichten]]
*[[Dreamcast-Entwicklungsumgebung unter Windows einrichten]]
*[[SDL einrichten]]
*[[DC Dev ISO|Dreamcast Development Environment 4]] - [[fackue]] hat eine vorkonfigurierte Dreamcast-Entwicklungsumgebung für Windows zusammengestellt, die alles enthält was für die Dreamcast-Dreamcast-Entwicklung notwendig ist.


Hier deklarieren wir 2 Objekte der Klasse SDL_Surface. SDL_Surface ist eine Klasse aus SDL und kann Bilder und Ähnliches enthalten. Die gesamte Anzeige des Bildschirms wird auch als ein Objekt gesehen. Auf dieser screen-Variable werdet ihr die Variable "bild" auch später "blitten" - sprich in die screen-Variable laden. Dazu aber später.
==Programmieren==


Hier erstellen wir eine Funktion, die für uns später eine Datei "hallo_welt.bmp" ausliest, in das aktuelle Anzeigeformat konvertiert und dann diese in das Objekt "bild" speichert.
====KallistiOS====
*[[Hallo Welt mit KallistiOS]]
*[[Kleine Einführung in die Dreamcast-Programmierung mit SDL]]
*[[Übersicht über den Dreamcast-RAM]]


SDL_Surface *bild_laden( const char* dateiname)  {
====libronin====
   
*[[libronin-Tutorials]] - Auch für [[libronin]] haben wir einige Tutorials zusammengestellt. Wir raten euch trotzdem mit [[KallistiOS]] zu programmieren. libronin gilt heute als veraltet.
    SDL_Surface* BildGeladen = NULL;
    SDL_Surface* optimiertesBild = NULL;
    BildGeladen = SDL_LoadBMP( filename );
   
    if( BildGeladen != NULL ) {
        optimiertesBild = SDL_DisplayFormat( BildGeladen );
       
        SDL_FreeSurface( BildGeladen );
       
    }
   
    return optimiertesBild;
}


==Probleme?==


Diese Funktion gibt ein SDL_Surface zurück - was nötig ist, damit das ganze auch in die bild-Variable geladen werden kann. Die ersten zwei Variablen, die wir hier definieren sind nur ein Zwischenspeicher. Richtig interessant wird's erst hier: BildGeladen = SDL_LoadBMP( dateiname );.
In unserem [http://www.sega-dc.de/forum/viewforum.php?f=24 Programmierforum] könnt ihr euch gegenseitig Tipps geben und bekommt bei Problemen Hilfe.
Hier wird in die weiter oben definierte Variable Bild mit Hilfe der Funktion SDL_LoadBMP ein Bild geladen. dateiname ist hierbei das Argument vom char-Typ, das der Funktion bild_laden am Anfang übergeben wird. SDL_LoadBMP lädt nur Bitmaps, andere Dateiformate können mit Hilfe einer weiteren Funktion aus einer weiteren Header-Datei der SDL-Bibliothek benutzt werden, allerdings werden wir in dieser kleinen Einführung vorerst nicht darauf zu sprechen kommen. In der nächsten if-Abfrage prüfen wir, ob in BildGeladen erfolgreich ein Bild gespeichert werden konnte. Falls ja wird mit Hilfe von SDL_DisplayFormat das Bild, das momentan in BildGeladen gespeichert ist, in das Format der aktuellen Anzeige umgewandelt und dann in optimiertesBild gespeichert. Sprich: Wenn das Bild ein 24bit-Bitmap ist und das Zielsystem auf 32bit-Auflösung läuft, dann erledigt diese Funktion die Umwandlungs-Arbeit für euch. Mit SDL_FreeSurface( BildGeladen ); löschen wir das alte Objekt, das nun nicht mehr gebraucht wird. Zu guter letzt geben wir das optimierte Objekt als Rückgabewert der Funktion bild_laden mit return optimiertesBild; zurück. Jetzt ist unsere Funktion einsatzbereit.


Jetzt kümmern wir uns mal um die Hauptunkfunktion:
==Nützliche Programme==


int main(int narg,char**arg) {
*[[1ST READ.BIN Checker]]
*[[IP.BIN|Über die IP.BIN]]
  SDL_Init( SDL_INIT_EVERYTHING );
  screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
 
  bild = bild_laden("hallo_welt.bmp");
 
  SDL_Rect offset;
 
    offset.x = 0;
    offset.y = 0;
   
    SDL_BlitSurface( bild, NULL, screen, &offset );
 
  SDL_Flip( screen );
}


Die main()-Funktion wird ganz normal wie auf dem PC aufgerufen. mit SDL_Init( SDL_INIT_EVERYTHING ); initialisieren wir die SDL-Bibliothek und mit screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE ); setzten wir den Video-Modus. Die Argumente, die an die Funktion übergeben werden sind: Breite, Höhe, Bit und um das letzte Argument müsst ihr euch vorerst gar nicht kümmern.
==Debugging und Testen==


Als nächstes rufen wir unsere oben definierte Funktion auf.
Zum Debuggen und Testen der Programme gibt es grundsätzlich drei Möglichkeiten:
SDL_Rect offset ist ein Rechteck, das wir brauchen, um festzulegen, ab welchen Koordinaten später das Bild angezeigt werden soll. Da das ganze ab dem oberen Bildschirmrand angezeigt werden soll, setzen wir die x- und y-Koordinaten auf 0. Mit SDL_BlitSurface( bild, NULL, screen, &offset ); "blitten" wir unser Objekt bild auf das Objekt screen.


[[Bild:SDLTut1.gif]]
*'''Testen mit Emulatoren''' - Es gibt verschiedene gute Dreamcast-Emulatoren für den PC. Ein Emulator ist wohl die schnellste und einfachste Methode ein Dreamcast-Programm zu testen. Allerdings verhalten sich Emulatoren nicht immer so wie ein echter Dreamcast, es kann also pasieren, dass manche Programme im Emulatoren nicht so laufen, wie auf einer wirklichen Konsole.


screen beinhaltet also nun unser Objekt bild.  
*'''Coder's Cable''' oder '''[[Breitband-Adapter]]''' - Mit dem seriellen Kabel (dem [[SEGA_Zubehör#Coders_Cable|Coders Cable]]) und auch mit dem [[Breitband-Adapter]], sowie mit dem Programm [[dc-load]] ist es möglich, Programme direkt auf den Dreamcast hochzuladen und dort direkt auf der Konsole auszuführen.


screen ist wie bereits oben gesagt, der gesamte Bildschirm. Das erste Argument von SDL_BlitSurface( bild, NULL, screen, &offset ); ist das Objekt, das in das andere Objekt kopiert bzw "geblittet" werden soll. Das zweite Argument würde angeben ob nur ein bestimmter Teil des im ersten Argument übergebenen Bildes kopiert werden soll. Da wir aber das gesamte Objekt kopieren möchten, nehmen wir hier NULL. Das dritte Objekt hier ist das Objekt, in das das erste Objekt kopiert werden soll. Das vierte Argument, vom Typ SDL_Rect, gibt an, an welcher Position das ganze dann angezeigt werden soll. Danach wäre das Objekt screen auch fertig. Doch dann müsst ihr mit SDL_Flip( screen ); noch den Bildschirm "aktualisieren". Dann ist euer Programm fertig und eure Dreamcast-Konsole zeigt ein schmuckes Bild aus der Datei hallo_welt.bmp an! Was ihr in diese Datei malt, bleibt letztendlich euch überlassen....
*'''CDs brennen''' - Brennt euer Programm auf eine CD und testet es direkt auf dem Dreamcast.


Dieses Programm wird sich leider auch nicht selbst beenden, dass heißt, wenn ihr genug von eurem Bild habt, dann müsst ihr eure Konsole mit einem Druck auf die Powertaste ausschalten.
==Links==


Die Datei main.c, könnt ihr einfach erstellen, in dem ihr den Inhalt der mit "Code" markierten Beispiele einfach in eine Datei kopiert und diese dann main.c nennt.
Es gibt mehrere große englische Webseiten, die ebenfalls das Thema Dreamcast-Programmierung behandeln.


Das Makefile, das ihr zum Kompilieren benötigt, ist hier:
*[http://dcemulation.org/?title=Development DCEmulation.org-Programmierbereich]
*[http://dcemulation.org/phpBB/viewforum.php?f=65 DCEmulation.org-Programmierforum]
*[http://www.dcemu.co.uk/vbulletin/forumdisplay.php?f=15 DCEmuk UK-Programmierforum]


TARGET = main
[[Kategorie:Hauptrubrik]][[Kategorie:Programmierung]]
OPTFLAGS=-O3 -fomit-frame-pointer
KOS_CFLAGS+= -I$(KOS_BASE)/../kos-ports/include/SDL-1.2.9 $(OPTFLAGS)
all: $(TARGET).bin
include $(KOS_BASE)/Makefile.rules
.SRCS  =  main.c \
OBJS = $(.SRCS:.c=.o)
clean:
  rm -f $(OBJS) $(TARGET).elf $(TARGET).bin
 
$(TARGET).elf: $(OBJS)
  $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET).elf $(KOS_START) \
      $(OBJS) -lSDL_129 -lm $(OBJEXTRA) $(KOS_LIBS)
 
$(TARGET).bin: $(TARGET).elf
  $(KOS_OBJCOPY) -R .stack -O binary $(TARGET).elf $(TARGET).bin
 
run: $(TARGET).bin
  $(KOS_LOADER) $(TARGET).bin
 
 
Die Dateien "Makefile" und "main.c" müssen irgendwo in eurem Cygwin-Ordner sein. Öffnet einfach die Cygwin-Konsole, geht in den Ordner in dem ihr die beiden Dateien abgespeichert habt und gebt "make" ein. Kurz darauf dürftet ihr eine "main.elf"-Datei haben, eine ausführbare Dreamcast-Datei!

Aktuelle Version vom 15. September 2012, 16:41 Uhr

Der Dreamcast gehört zu den interessantesten Plattformen für Hobby-Programmierer. Zur Programmierung ist nichts weiter als einiges an kostenloser Software aus dem Internet und natürlich einer Dreamcast erforderlich. Nach wie vor wird für die Dreamcast neue Homebrew-Software entwickelt.

Mit KallistiOS steht ein legales und kostenloses Entwicklersystem zur Verfügung, dass sich durchaus auch mit den offiziellen SEGA-Tools messen kann. Programmiert wird mit den Programmiersprachen C und C++, die beide eine Art de-facto-Standard in der Informatik und insbesondere in der Spieleprogrammierung darstellen. Für besonders rechenintensive Anwendungsbereiche kann auf der Dreamcast auch Assembler verwendet werden.

Auch du kannst Programme für Dreamcast schreiben! Auf den folgenden Seiten wollen wir angehenden Dreamcast-Entwicklern helfen, mit der Dreamcast-Programmierung anzufangen.

Hier findet ihr Kurse, Anleitungen und mehr, die euch helfen für die Dreamcast-Konsole zu entwickeln.

Einrichten

Programmieren

KallistiOS

libronin

Probleme?

In unserem Programmierforum könnt ihr euch gegenseitig Tipps geben und bekommt bei Problemen Hilfe.

Nützliche Programme

Debugging und Testen

Zum Debuggen und Testen der Programme gibt es grundsätzlich drei Möglichkeiten:

  • Testen mit Emulatoren - Es gibt verschiedene gute Dreamcast-Emulatoren für den PC. Ein Emulator ist wohl die schnellste und einfachste Methode ein Dreamcast-Programm zu testen. Allerdings verhalten sich Emulatoren nicht immer so wie ein echter Dreamcast, es kann also pasieren, dass manche Programme im Emulatoren nicht so laufen, wie auf einer wirklichen Konsole.
  • CDs brennen - Brennt euer Programm auf eine CD und testet es direkt auf dem Dreamcast.

Links

Es gibt mehrere große englische Webseiten, die ebenfalls das Thema Dreamcast-Programmierung behandeln.