Dgame – pygame für die D Programming Language, Preview
Für die bisher im weiten Spektrum der Spieleprogrammierer recht unbekannte Sprache D Programming Language, welche im Grunde eine weiterentwickelte Form von C++ ist und so gut wie alle, wenn nicht alle, Vorzüge aus C++ besitzt, existieren zur Zeit leider noch recht wenige Lib’s und Frameworks. Dabei weist D viel weniger Mängel & Komplexität auf und ist dazu weniger überladen & wesentlich einfacher zu erlernen, laut meiner bescheidenen Meinung jedenfalls. Dazu kommt, dass die meisten Features und Weiterentwicklungen vom neuen aber noch auf sich warten lassenden Standard von C++ (C++0x) bereits implementiert sind und D somit eine Art modernes C++ darstellt.
Darüber hinaus ist die gesamte C Bibliothek fester Bestandteil und somit ist C Kompatibilität absolut gewährleistet.
Allerdings ist D viel zu neu, als das so viele Frameworks wie für C++, welche ja schon seit anno ’79 auf der Welt ist (D seit 2007, Quelle zu C++, Quelle zu D), existieren könnten. Durch das Projekt Derelict existiert allerdings ein Binding für einige C++ Bibliotheken (darunter SDL & OpenGL bspw.) und auch Allegro existiert bereits in D.
Als alter Python und Pygame Fan vermisste ich allerdings die Einfacheit und vorallen die Objekt-orientierte Benutzung einer solchen Lib., denn sowohl die SDL als auch OpenGL sind beinahe (mir fällt im Moment kein Objekt-orientiertes Beispiel ein) komplett funktional, und das liegt nicht an dem D – Binding, denn auch in der offiziellen Dokumentation zur Erklärung von SDL ansich und dessen Funktionsweise finden sich nur Funktionen, keine Klassen.
Die einzige Grafik Bibliothek in C++ die mir daher gefiel war SFML, da sie völlig Objekt-orientiert funktioniert.
SFML gibt es bereits für Python (PySFML) und auch für D existiert ein Binding (DSFML). Allerdings wird, auf Grund der bis dato mangelnden Verbreitung und Neuheit der Sprache, bisher eher zögerlich an DSFML gearbeitet, weswegen die aktuellste Version auf der 1.3′er Version von SFML beruht, wobei SFML für C++ bereits bei der 2′er Version angelangt ist (Quelle).
Deswegen entschied ich mich letzlich für Derelict. Auch dort existiert zwar ein Binding für SFML, doch dieses wird von Derelict (bislang?!) leider nur Funktional angeboten, was den ganzen Effekt zunichte macht.
Also setzte ich mich daran, einen solchen OOP Wrapper auch für D zu schreiben, welcher, wie Pygame, auf der SDL aufbaut.
Bisher ist dieses schon relativ weiter fortgeschritten und durch das kürzlich inoffiziell implementierte SDL_gfx Binding sind nun auch Zoom und Rotations Funktionen Bestandteil meines Frameworks.
Es fehlt nicht mehr viel und daher denke ich, dass ich bis Mitte des nächsten Monats das komplette Framework veröffentlichen kann.
Aber genug der Worte, es folgt ein kleines Beispiel, wie Dgame zu benutzen ist, mit kommentierten Code versteht sich
import std.stdio;
// load alle modules of Dgame
import Dgame.all;
void main() {
// init all
Dgame.all.init();
// create a 640px wide and 480px high window
DSurface screen = Display.set_mode(640, 480);
//set the title of the window
Display.set_caption("The title of the window");
// load a ball image
DSurface ball = Image.load("grafiken/ball.tga");
ball.set_colorkey(255, 0, 255);
// get the rect of the image
DRect ball_rect = ball.get_rect();
// geht a clock for the elapsed seconds
// and for setting the framerate
Clock clock = Time.get_clock();
byte[2] speed = [2, 2];
bool loop = true;
while (loop) {
// set the framerate to 60 fps max.
clock.tick(60);
/**
fill the window with white color in hex
also you can set the color in rgb, like
[255, 255, 255] or [0xff, 0xff, 0xff], see:
screen.fill(new Color(255, 255, 255));
*/
screen.fill(new Color("#fff"));
// run events
foreach (Event event; DEvent.get()) {
switch (event.type) {
case QUIT:
loop = false;
break;
case KEYDOWN:
// if "ESC" is pushed down, send a quit event
if (event.key == K_ESCAPE) {
DEvent.post(QUIT);
}
break;
case MOUSEBUTTONDOWN:
writefln("mouse x %d, mouse y: %d", event.mouse.x, event.mouse.y);
break;
default:
}
}
// get the current position of the ball
short[2] coords = ball_rect.get_coords();
ushort[2] size = ball_rect.get_size();
float x = coords[0] + size[0], y = coords[1] + size[1];
// check if the ball cross any line
if (x <= size[0] || x >= screen.get_width()) {
writeln("left or right");
speed[0] *= -1;
} else if (y <= size[1] || y >= screen.get_height()) {
writeln("top or bottom");
speed[1] *= -1;
}
// get the modify ball rect
ball_rect = ball_rect.move(speed);
// blit the ball image on the surface
screen.blit(ball, ball_rect);
// flip the screen surface onto the display
Display.flip();
}
}
Dieser Code lädt eine Ball Grafik, welche durch das gesamte Fenster “fliegt” und dabei, sollte er auf eine der Kanten stoßen, zurück “prallt”. So manch’ Python und Pygame Vertrauter wird dieses Beispiel recht bekannt vorkommen
Ok. Geb’ dir dann rückmeldung wie ich damit zurechtkomme
Eine Frage habe ich aber noch: Wie sieht das mit dem kompilieren der .lib Files aus?
Benutzt du DSSS? oder bud/build oder einfach nur DMD? DSSS macht bei mir andauernd Probleme…
Welche .lib Dateien meinst du?
Na die .lib Dateien, die ich zum linken brauche
Nur die Include Dateien bringen ja nix
Mit Code::Blocks hast du das Problem nicht mehr
Siehe d.whosme.de.
Du compilierst wahrscheinlich mittels Konsole oder Poseidon bietet dieses Feature nicht.
Aber bei Code::Blocks braucht man doch auch die Libs! Sonst bekommt man ja Error Meldungen
Was Codeblocks daran ändern soll, ist mir schleierhaft…
Bei Code::Blocks kannst du, wie du in dem Video Tutorial siehst, die .lib Dateien ganz einfach hinzufügen und Code::Blocks erledigt das für dich
Na das sieht doch schon echt super aus!
Viiiiieeeel besser als DerelictSDL!
Du hast es geschafft, SDL nach D zu portieren,
aber du erhältst dabei die D – Syntax!
Ich freu’ mich schon drauf, wenn DGame veröffentlicht wird
Ich lade heut Abend die 1.3 er Version hoch, der Code ist zwar so gut wie unkommentiert (vllt. ändere ich das noch im Laufe des Tages) und ich will noch etwas Performance rauskitzeln.
Schreib dir dann eine PN im Forum.