Meine 2D Engine => EdJin

Posted by eddy14 - 15/02/08 at 08:02 am

Hey guys :P
Seitdem mein Praktikum zuende ist und ich wieder diese Woche viel Freizeit hatte, habe ich mich motiviert mein Traum von einer Spiele-Engine zu verwirklichen. Ich arbeite seit ca. 4 Tagen dran und habe erst heute schöne Fortschritte gemacht :)
Ich benutze dafür SDL und eventuell implementiere ich noch die Physik Engine “Box2D” mit hinein die ja unter der zlib Lizenz steht, was für mich so viel heißt wie: Kompatibel mit der GPL :)
Es hat leider noch keine klare Struktur, ich will aber trotzdem nicht “drauf-los-programmieren” wie ich es fast immer tue. Heute hatte ich z.B. ein paar Ideen um die Programmierung mit meiner Engine einfacher zu gestalten. Es sollte so wenig Code wie möglich brauchen :)
z.B. muss man keine FPS Regelung einbauen oder eine Schleife welches die Tastatur-Eingaben entgegen nimmt. Ersteres übernimmt die Engine bei dem Aufruf Game.finished() (welches gleichzeitig die Main-Loop ausmacht) und letzteres wird mit meinem Event-Handler bearbeitet. Man kann einem Objekt Events “attachen” und “detachen” welches automatisch beim Aufruf von Objekt.refresh() ausgeführt wird (welches gleichzeitig die Anzeige auf dem Bildschirm erneuert).
Der Code ist zurzeit nur ca. ~500 Zeilen groß und (wie ich finde) ziemlich übersichtlich mit schönen Kommentaren :D
So sieht z.B. meine derzeitige Main aus:

EdGame Game(SDL_INIT_EVERYTHING, 640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF, 40, “EdJin Test”);
EdImage testball(Game.screen,”testball.bmp”, 100, 100);
Uint8 *Keys;

int main(int argc, char *argv[])
{

//Attach events to this object:
testball.AttachEvent(KBD_UP, image_up);
testball.AttachEvent(KBD_DOWN, image_down);
testball.AttachEvent(KBD_RIGHT, image_right);
testball.AttachEvent(KBD_LEFT, image_left);

while(!Game.finished())
{
//Main-Loop starts here! :)

//Event-Loop (until all events are handled)
while(Game.GetEvent())
{
switch(Game.CurrentEvent.type)
{
case SDL_QUIT: // User or System wants to quit the Game
Game.finish();
exit(0);
break;
}
}

testball.refresh();
SDL_Flip(Game.screen);

}

return 0;
}

Per attach sag ich ihm dass ich den Event “KBD_UP” (welches für “Keyboard UP”, also die Pfeilhoch-Taste auf der Tastatur, steht) an dieses objekt binden möchte. Und immer wenn dieses Event auftritt (der User drückt auf diese Taste) dann wird die Funktion image_up aufgerufen (das ist ein Pointer auf die jeweilige Funktion).

void image_up(void)
{
if(testball.y > 10)
testball.y -= 10;
}

void image_down(void)
{
testball.y += 10;
}

void image_right(void)
{
testball.x += 10;
}

void image_left(void)
{
if(testball.x > 10)
testball.x -= 10;
}

So könnten diese Funktionen aussehen.
Das sieht doch ganz schick aus oder? :)

If you enjoyed this article please consider staying updated via RSS. Links to your own social media pages could be added here.

2 Responses to “Meine 2D Engine => EdJin”

  1. Kabel says:
    February 15th, 2008 at 15:52

    Hey,

    naja für eine OO-Programmiersprache wäre das keine besonders gute Main, da steht viel zuviel drin, in der main sollen nur methoden aufgerufen werden und sie soll “kurz” sein ;)

    Trotzdem sehr nice,

    mfg

    Kabel

  2. admin says:
    February 16th, 2008 at 08:17

    Hehe, ja ok. Die Main ist blöd :/
    Aber ging ja nur darum zu zeigen was die Engine zurzeit kann. Das wird alles in der Main natürlich gekürzt ( wird ja aber nicht an der Engine, sondern an dem Programmierer der mit der Engine arbeitet, liegen).
    Die ist aber gestern Abend noch kürzer geworden, später werden da wohl nur noch 3-4 Aufrufe ala “GameStart(); GameLoop(); GameEnd();” sein.

Leave a Reply

I would love to hear your view.