Grafische Aufbesserung mit GDI+



  • Ich erstelle im Moment das Spiel "Pong" und bin nun am Ende angekommen. Alles läuft, jedoch sieht das Spiel sehr langweilig aus.
    Hier ein Blick: http://www.pic-upload.de/view-19103508/pong.jpg.html
    Das ganze läuft mit GDI+ und nun suche ich nach Möglichkeiten, das ganze zu verschönern.

    Gefallen würde mir z.B. sowas:
    http://screenshots.de.sftcdn.net/de/scrn/74000/74303/space-ping-pong-14.jpg
    Hierbei würde mich interessieren, wie ich dieses leuchten hinbekomme.

    Und das hier:
    http://www.zock.com/8-Bit/D_Pong.HTML
    Hier geht es darum, dass diese Linien hinter dem Ball bzw. dem Schläger herlaufen.

    Diese beiden Effekte würde ich gerne benutzen. Bekomme ich das in GDI+ hin, wenn ja wie?
    Ansonsten würden mich auch die Alternativen Möglichkeiten zu GDI+ interessieren. Vielen Dank schon einmal!



  • Erst einmal möchte ich darauf hinweisen, dass GDI+ wegen seines Nutzens von .NET keine besonders schnelle Grafik-Bibliothek und eigentlich für GUI und Bildbearbeitung vorgesehen ist.
    Für Spiele würde ich dir eher zu Direct2D raten.

    Das Leuchten kann durch Blurring/Verwischung oder entsprechend ausgerichtete Gradients/Farbverläufe erzeugt werden, da diese Verfahren (oder eigentlich nur das Blurring) allerdings teuer sind und dein Spiel flüssig laufen soll, würde ich dir zum Rendern von Bildern empfehlen, welche diese leuchtenden Elemente enthalten.

    Die Bewegungsspuren kannst du dadurch erzeugen, dass du von einem bewegenden Objekt die letzten x Positionen speicherst. Bei jedem Grafik-Update malst du das Objekt an diesen Positionen, allerdings mit steigender Transparenz äquivalent zum Alter der jeweiligen Position, und aktualisierst diese.



  • blackevil673 schrieb:

    Diese beiden Effekte würde ich gerne benutzen. Bekomme ich das in GDI+ hin, wenn ja wie?

    Entweder du loggst die einzelnen Wegpositionen des Balls und zeichnest für jede einzelne das Rechteck nochmal, aber diesmal je nach Alter der Position mit einer unterschiedlichen Graustufe, je älter, desto dunkler
    oder du verwendest so ne Art Stencilbuffer und merkst dir über einen Vektor, wo die einzelnen Rechecke lagen und die machst du dann dunkler als die jüngeren Objekte.

    Ansonsten würden mich auch die Alternativen Möglichkeiten zu GDI+ interessieren.

    OpenGL oder DirectDraw ist wesentlich schneller als GDI+.

    Ich würde an deiner Stelle auf OpenGL setzen, damit kannst du dann jede Menge Effekte auch beschleunigen. Geht auch in 2d.



  • Youka schrieb:

    Erst einmal möchte ich darauf hinweisen, dass GDI+ wegen seines Nutzens von .NET keine besonders schnelle Grafik-Bibliothek

    GDI+ ist tatsächlich nicht besonders schnell, benutzt aber kein .NET.



  • Mechanics schrieb:

    Youka schrieb:

    Erst einmal möchte ich darauf hinweisen, dass GDI+ wegen seines Nutzens von .NET keine besonders schnelle Grafik-Bibliothek

    GDI+ ist tatsächlich nicht besonders schnell, benutzt aber kein .NET.

    Richtig, es ist genau umgekehrt, der System.Drawing Kram benutzt GDI+... 😉

    Ich würde übrigens zu SFML raten.



  • Danke schon einmal für eure Antworten.
    Diese haben mich soweit gebracht: http://www.pic-upload.de/view-19110910/pong.jpg.html

    Ihr habt mir nun verschiedene Dinge vorgeschlagen. Da wäre einmal Direct2D, dann OpenGL und SFML.
    Wo sind denn die prägnanten Unterschiede? Und habt ihr noch Anregungen zu dem gezeigten Programm?
    Ansonsten danke für die Hilfe!



  • SFML ist eine einfache, kleine Library, die bei vernünftiger Performance vermutlich alles bietet, was du brauchst. SFML verwendet intern OpenGL; du kannst OpenGL (oder Direct3D) natürlich auch direkt verwenden, was allerdings entsprechend aufwändiger ist. Direct3D und OpenGL sind beides low-level APIs über die du mit der Grafikkarte reden kannst. Wenngleich das ein sehr interessantes Thema für sich ist, sofern es dir eher darum geht, möglichst schnell und einfach Spiele umzusetzen, bist du mit fertigen Libraries besser beraten. Direct2D ist eine Library für 2D (Vektor-)Grafik die auf Direct3D aufsetzt und nicht unbedingt direkt für Spiele gedacht...



  • blackevil673 schrieb:

    Gefallen würde mir z.B. sowas:
    http://screenshots.de.sftcdn.net/de/scrn/74000/74303/space-ping-pong-14.jpg
    Hierbei würde mich interessieren, wie ich dieses leuchten hinbekomme.

    Das sind einfach Bitmaps die idealerweise additiv geblendet werden, bzw. eine (IMO schlechte) Annäherung kann man auch mit normalem Alpha-Blending erreichen.

    http://www.zock.com/8-Bit/D_Pong.HTML
    Hier geht es darum, dass diese Linien hinter dem Ball bzw. dem Schläger herlaufen.

    Zwei Möglichkeiten:

    1. N alte Positionen aufheben und die Objekte N-mal rendern, immer mit abnehmender "Stärke". Auch hier wieder mit additivem Blending.
    2. Anstatt einfach das alte Bild durch ein neues zu ersetzen, kombinierst du das alte und das neue Bild z.B. 50/50.

    Umsetzen kannst du das mit jeder Grafik-API. Der Unterschied besteht nur darin wie viel dir die jeweilige API abnimmt. Bei Direct3D oder OpenGL z.B. musst du im Prinzip nur sagen "ich will additiv blenden", und die API macht das. Bei anderen APIs kann es sein dass du alles auf der CPU machen musst, also die Farbwerte der einzelnen Pixel selbst berechnen und in die Bitmap setzen.

    Bei GDI+ kenne ich z.B. keine Möglichkeit additives Blending zu machen ausser eben die einzelnen Farbwerte in der Bitmap selbst zu modifizieren. Alpha-Blending geht allerdings, siehe z.B.: http://www.codeproject.com/Articles/9778/Alpha-Blending-using-GDI
    Wird aber auch nicht wirklich schnell sein, da GDI+ alles in Software macht.

    ----

    blackevil673 schrieb:

    Danke schon einmal für eure Antworten.
    Diese haben mich soweit gebracht: http://www.pic-upload.de/view-19110910/pong.jpg.html

    Bis auf das komische Artefakt im "Ball-Trail" in der Mitte (ein "Nachbild" des Balls ist zu hell - vermutlich wurden da zwei Bilder übereinander gezeichnet) sieht das ja schonmal nicht schlecht aus.

    Ihr habt mir nun verschiedene Dinge vorgeschlagen. Da wäre einmal Direct2D, dann OpenGL und SFML.
    Wo sind denn die prägnanten Unterschiede? Und habt ihr noch Anregungen zu dem gezeigten Programm?
    Ansonsten danke für die Hilfe!

    SFML ist "nur" ein Wrapper um OpenGL und einige Libraries zum Laden von Grafiken etc. SFML 1.x ist was ich mich erinnern kann nicht wirklich geeignet für das was du machen willst, da man über die SFML Wrapper keinen Zugriff auf viele Features hat (z.B. additives Blending).
    SFML 2.0 könnte gehen, müsstest du selbst mal nachsehen welche Möglichkeiten man da hat. Der Vorteil von SFML gegenüber "selbst machen" mit OpenGL ist halt dass einiges deutlich einfacher wird. z.B. das Laden von Grafiken aus Files.

    Mit Direct2D hab ich keine Erfahrung, ich weiss nichtmal was man mit der API genau machen kann und was nicht.

    Und mit OpenGL bzw. auch Direct3D kannst du im Prinzip alles machen was Bitmaps, Polygone oder auch 3D Objekte angeht. Und du kannst damit (fast) alles was die Hardware kann auch in Hardware berechnen lassen. Dafür gibt's keinen direkten Support für Dinge wie Text, Kreise/Ellipsen zeichnen etc. Mit beiden APIs musst du dich um viele Dinge selbst kümmern, und auch erstmal einiges an Code schreiben bevor du überhaupt den ersten Pixel am Bildschirm hast.

    ps: Auch welche Programmiersprache du verwendest spielt hier eine Rolle. Mit C++ kannst du auf die genannten APIs/Libraries direkt zugreifen. Mit C# dagegen nur auf GDI+, für die anderen müsstest du dir da passende Wrapper suchen.



  • dot schrieb:

    Direct2D ist eine Library für 2D (Vektor-)Grafik die auf Direct3D aufsetzt und nicht unbedingt direkt für Spiele gedacht...

    Direct2D ist der Nachfolger von GDI/GDI+, wobei intern Direct3D Befehle mit hochoptimierten Code für 2D Rendering verwendet werden.
    Ein Blick auf die Interfaces zeigt bereits die vielen Möglichkeiten und mit dem hardwarebeschleunigten Rendering ist es für Spiele mehr als geeignet.
    Für ein einfaches 2D Spiel, in dem nur diverse Shapes und Text vorkommen, finde ich D2D sinnvoller als eine 3D API wie OpenGL oder Direct3D.



  • hustbaer schrieb:

    Mit C++ kannst du auf die genannten APIs/Libraries direkt zugreifen. Mit C# dagegen nur auf GDI+, für die anderen müsstest du dir da passende Wrapper suchen.

    Anstatt C# könnte man auch Java mit LWJGL verwenden.
    http://de.wikipedia.org/wiki/Lightweight_Java_Game_Library

    Wäre zumindest sinnvoller wenn man noch kein C++ kann, denn der Umstieg von C# zu Java ist ziemlich trivial.
    Dafür gibt's dann auch noch den Bonus der Plattformunabhängigkeit, etwas, dass man sich trotz Mono bei .NET Anwendungen mit C# nie ganz sicher sein kann, wenn man nicht aufpaßt.



  • Ja, man kann viele Sprachen verwenden.

    Da der OP nicht geschrieben hat was er verwendet, hab' ich einfach mal die unter Windows üblichsten Sprachen angenommen.

    Mit Python/pygame kann man angeblich auch ganz gut arbeiten.
    Und wenn's "native" sein soll geht natürlich auch C, irgendwas aus der Pascal-Derivat-Kiste uswusf.


Anmelden zum Antworten