Reicht GDI+ für 2D Spiele ?



  • Hallo !

    Wie der Titel schon sagt will ich wissen ob GDI+ (Windows) für 2D Spiele reicht, oder ob ich gleich OpenGL oder DirectX verwenden soll, oder eine ganz andere API wie SDL ? Hab bis jetzt nur mal ein kleines 2D Spiel in Java programmiert...

    Grafisch ist das Spiel nicht aufwendig, so eine art Mario wie damals für den normalen Nintendo.

    lg Christian



  • Hallo

    Wenn es geht, würde ich dir zu XNA und C# raten.

    chrische



  • schau dir auch mal sfml an

    ist für 2D genau richtig, ist alles drin

    kann ich nur empfehlen, finde ich besser als SDL



  • Ich würde gerne bei C/C++ bleiben, deswegen fällt XNA weg.

    sfml kenn ich noch nicht, werd ich mir mal anschaun 🙂

    Danke



  • Hallo

    Chris86 schrieb:

    Ich würde gerne bei C/C++ bleiben, deswegen fällt XNA weg.

    Ich würde mich an deiner Stelle dann auch noch zwischen den beiden entscheiden.

    chrische



  • Nur ein Tip: wenn du dein Programm halbwegs sauber strukturierst, und einige grundlegende Dinge abstrahierst, dann kannst du die Grafik API später relativ leicht austauschen.

    Natürlich könntest du auch gleich 2 "render backends" parallel schreiben, das macht Spass und schmeckt 😉 Du könntest ja z.B. einen Renderer mit SFML und einen mit GDI+ schreiben. Dann kannst du auch gleich vergleichen was schneller ist.

    (Wenn du das versuchst kommst du wahrscheinlich relativ schnell drauf was du wie machen musst damit du zu einer sauberen Trennung zwischen "Spiel" und "Grafik API" kommst)

    Zu deiner eigentlichen Frage: GDI+ sollte vom Feature-Umfang her locker reichen für ein kleines Jump & Run Spiel, auch mit hübsch Alpha-Blending und alldem. Wenn nicht allzuviel am Bildschrim los ist müsste die Geschwindigkeit auch passen.

    Wenn du allerdings Effekte haben möchtest wo eine Grafik nicht Pixel für Pixel abgebildet wird (z.B. Drehen und/oder Zoomen von Grafiken), dann würde ich dir raten gleiche eine 3D API zu nehmen. Wobei hier wenn man nur Direct3D vs. OpenGL vergleicht die "Einsteigerfreundlichere" Wahl sicher OpenGL ist.



  • Wenn das Spiel nur auf Windows laufen soll, wäre HGE auch eine Überlegung wert: http://hge.relishgames.com

    Nutzt DirectX für eben die von hustbaer angesprochenen Effekte (Alphablending, Rotation, Zoom,...), bringt ein nettes Partikelsystem mit, hat m.M.n. ein sehr gutes Design und gute Doku und führt schnell zu Ergebnissen.

    Wenn du Spiel und Grafik so weit wie möglich trennst, könntest du leicht einen HGE-Renderer für Windows und OpenGl für andere OS schreiben.


  • Mod

    Chris86 schrieb:

    Hallo !

    Wie der Titel schon sagt will ich wissen ob GDI+ (Windows) für 2D Spiele reicht, oder ob ich gleich OpenGL oder DirectX verwenden soll, oder eine ganz andere API wie SDL ? Hab bis jetzt nur mal ein kleines 2D Spiel in Java programmiert...

    Grafisch ist das Spiel nicht aufwendig, so eine art Mario wie damals für den normalen Nintendo.

    ja, dafuer sollte GDI reichen. Premature optimierungen machen nicht viel sinn in diesem fall, dass du GDI eh kannst und es eigentlich ausreichen sollte.
    Design alles sehr sauber, dann kannst du zur not spaeter noch auf jede andere API umsteigen. wer weiss, vielleicht kommst du auf die idee es auf dem NDS laufen zu lassen udn dann wuerde dir hier keine der genannten API helfen.

    ich flex mir auch nicht die zaehne wenn meine zahnbuerste reicht, auch wenn eine flex ziemlich cool ist 😉



  • Danke für die vielen Ratschläge 🙂

    Mit GDI hab ich leider auch noch keine Erfahrung ^^ ist alles neu für mich.
    Es wäre sehr interessant 2 API's parallel zu verwenden, und zu sehen wie der unterschied ist, aber glaub ich sollte zuerst mal lernen mit einer API gut umzugehen, danach kann ich mich ja auf eine Zweite stürzen 🙂



  • Wenn du aber direkt von Anfang an den Gedanken an mehrere APIs im Hinterkopf behälst, kannst du die dicksten Designfehler schonmal vermeiden...

    (Was mich daran erinnert, dass ich für ein OpenGL-Projekt noch einen DirectX-Renderer schreiben wollte... 😉 )


  • Mod

    Chris86 schrieb:

    Danke für die vielen Ratschläge 🙂

    Mit GDI hab ich leider auch noch keine Erfahrung ^^ ist alles neu für mich.
    Es wäre sehr interessant 2 API's parallel zu verwenden, und zu sehen wie der unterschied ist, aber glaub ich sollte zuerst mal lernen mit einer API gut umzugehen, danach kann ich mich ja auf eine Zweite stürzen 🙂

    Ein guter weg ist von oben nach unten im code. statt also GDI usw. zu nutzen und wenn du fertig bist ein spiel zu machen, kannst du erstmal so tun als ob das fertig waere und danach erst implementieren.

    wenn du also dein mario spiel wie mario willst, wirst du sicherlich texturen/bilder/sprites laden.

    also machst du dir die klasse

    class CSprite
    {
    };
    

    die erstellst du dann am besten uber eine factory

    class CSpriteFactory
    {
    public:
    virtual CSprite* Create(const char* pSpritename);
    };
    

    und schon hast du was du brauchst und kannst weiter coden, bis du denkst, dass du alles soweit fertig hast, dass wenn es implementiert waere, es auch wirklich auf dem screen zu sehen ist.

    und nun leitest du dir von der factory z.b. eine CTGASpriteFactory ab und die laedt ein TGA als sprite rein. oder eine CSDLSpriteFactory oder CGDISprite factory oder...



  • Ich hab schon mehrere libs getestet.
    Allegro kenne ich von einem kollegen, der findet es ist absolub verbuggt, und veraltet.
    Clan-lib hab ich selbst getestet, und es sind ein paar nette beispiele dabei, und man kann vieles tun, allerdings hat mir dir Strukturierung nichct 100% gefallen, und es gab auch bugs
    SDL hab ich noch nicht viel getestet, ist aber sehr stark verbreitet. Mich störte bisher die geschwindigkeit unter linux, und die nicht objekt orientierte Strukturierung. Aufgrund der starken verbreitung würde ich allerdings sagen, da muss doch was dran sein.
    OpenGL lern ich grade, und wenn nur für 2D sein soll, kann ich sagen ist das ein bisschen über. Es ist nicht leicht sich da einzuarbeiten, weil es so absolut anders funktioniert, als die 2D Programmbibliotheken.
    Angefangen hab ich übrigens mit BlitzBasic und BlitzMax, aber die fallen für dich ja weg, weil es kein c++ mehr ist.
    SFML kannte ich bisher noch nicht, sieht aber ganz nett aus, und unterstützt auch alpha wie rotationen, ich denke ein versuch ist es wert das mal aus źu testen.
    Haaf's game engine würde ich allerdings ausschließen, weil du damit schon von grund auf an jede möglichkeit der Plattformunabhängigkeit ausschließen würdest, genau wie bei gdi+.



  • Krux schrieb:

    von grund auf an jede möglichkeit der Plattformunabhängigkeit

    Bei sinnvollem Design nicht! Siehe rapsos Post.



  • mad_martin schrieb:

    Krux schrieb:

    von grund auf an jede möglichkeit der Plattformunabhängigkeit

    Bei sinnvollem Design nicht! Siehe rapsos Post.

    stimmt, aber man will sich ja nicht unnötig viel Arbeit machen. Dazu müsste man dann ja auch die andere Library kennen.



  • Kommt halt darauf an, was man will. Bisher hab ich das auch nicht so gemacht. Würde ich nochmal ein Projekt (neu-)anfangen, würde ich mir schon des Lerneffektes wegen die Arbeit machen.


  • Mod

    Krux schrieb:

    mad_martin schrieb:

    Krux schrieb:

    von grund auf an jede möglichkeit der Plattformunabhängigkeit

    Bei sinnvollem Design nicht! Siehe rapsos Post.

    stimmt, aber man will sich ja nicht unnötig viel Arbeit machen. Dazu müsste man dann ja auch die andere Library kennen.

    sauberes design hat schon seinen grund, es ist keine mehrarbeit, sondern eine grundlage. quer durch den ganzen source api-abhaengigkeiten zu haben ist die wirkliche mehrarbeit. im nachinein bist du darauf limitiert alle probleme so loesen zu muessen wie es deien api vorgibt, auch wenn es welche mit weit weniger arbeit gibt. du kannst unvorhergesehene dinge (weil du noch keine erfahrung mit der api hattest) sehr suboptimal loesen. z.b. wenn du ploetzlich rausfindest dass d3d9 beim taskswitch alle resourcen freigegeben haben moechte before du das device resettest.
    hast du deine factory und api unabhaengigkeit ist das max 1h tiparbeit. bist du aber ueberall von d3d9 abhaengig, musst du alle stellen finden an denen du ne resource halten koenntest oder du machst erst in diesem moment deinen resourcemanager bzw factory.
    oder du merkst dass sdl sau langsam ist, etwas neues drunter zu setzen ist dann fast ein komplettes neuschreiben...

    Saubers design hat seinen Grund 😉



  • ja Strukturiernung ist wichtig, aber wenn man nur eine API kennt, kann man das Projekt auch schlecht Portieren, wenn diese API nicht plattformunabhängig ist.



  • Krux schrieb:

    mad_martin schrieb:

    Krux schrieb:

    von grund auf an jede möglichkeit der Plattformunabhängigkeit

    Bei sinnvollem Design nicht! Siehe rapsos Post.

    stimmt, aber man will sich ja nicht unnötig viel Arbeit machen. Dazu müsste man dann ja auch die andere Library kennen.

    Nö dazu muss man die andere Library nicht kennen. Dafür braucht man nur etwas Übung und gesunden Hausverstand 🙂



  • Mit ein wenig Doublebuffering und Tricksen reicht GDI auf jeden Fall für normale 2D-Spiele. Wenns aber anspruchvoller werden soll, nicht mehr.



  • Hab jetzt mal angefangen mit GDI danach würde ich gerne OpenGL oder Direct X lernen, aber mal schaun...

    Zur zeit hab ich noch das Problem mit den Flackern, ich bekomm das mit dem double buffering irgendwie nicht hin und Inofmrationen zu GDI finde ich auch nicht viele (GDI nicht GDI+, hab die Headerdatein von GDI+ nicht)

    Danke für die vielen Ratschläge 🙂


Anmelden zum Antworten