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

Add a comment »11 comments to this article

  1. OpenGL oder SDL? | Code Arts
  2. Code Arts » Dgame beta
  3. Dgame – Pygame für die D programming language
  4. 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…

    Antworten

    • Welche .lib Dateien meinst du?

      Antworten

      • Na die .lib Dateien, die ich zum linken brauche ;)
        Nur die Include Dateien bringen ja nix :D

        Antworten

        • Mit Code::Blocks hast du das Problem nicht mehr ;) Siehe d.whosme.de.
          Du compilierst wahrscheinlich mittels Konsole oder Poseidon bietet dieses Feature nicht.

          Antworten

          • 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

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

    Antworten

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

      Antworten

*

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress