Spiel-Oberfläche

TimoH.

Mitglied
Hallo,

ich hätte da einfach mal eine Frage:

Wie soll man Spiel-Oberflächen am besten realisieren. (Menüs, Statusleisten, Fähigkeiten etc.):

Ich arbeite mit ein paar Freunden an einem etwas größeren RPG Projekt (2D) und sind zur Zeit dabei
das Grundgerüst zu schreiben (Also Darstellung etc.).

Jetzt habe ich angefangen mir über oben genanntes Thema Gedanken zu machen und habe auch schon
2 Interfaces gebastelt mit denen ich das realisieren wollte:

Java:
package de.syfy.project.engine.hud;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.image.BufferedImage;

/**
 *
 * @author Timo
 * 
 * Info folgt.
 */
public interface UI_Container {
    
    public void setSize(Dimension d);
    
    public Dimension getSize();

    /*
     * Position relativ zu GamePanel
     * 
     */
    public void setPosition(Point p);
    
    public Point getPosition();
    
    public void setBackground(BufferedImage bg);
    
    public void addItem(UI_Item item);
    
    public void removeItem(UI_Item item);
    
    public void drawContainer(Graphics g);
}

Java:
package de.syfy.project.engine.hud;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.image.BufferedImage;

/**
 *
 * @author Timo
 * 
 * Ausführlichere Info folgt
 */
public interface UI_Item {
    
    public void setImage(BufferedImage img);
    
    public BufferedImage getImage();
    
    public void setSize(Dimension d);
    
    public Dimension getSize();
    
    /*
     * Position ist relativ zu der Position des Containers.
     */
    public void setPosition(Point p);
    
    public Point getPosition();
    
    /*
     * Wird aufgerufen, wenn das Objekt geklickt wird.
     */
    public void itemClick();
    
    /*
     * Wird aufgerufen, wenn der Mauszeiger über das Item kommt
     */
    public void itemHover();
    
    public UI_Container getUIContainer();
    
    public void drawItem(Graphics g);
}

Nun stellt sich mir aber die Frage, ist es eventuell besser Swing bzw. AWT GUI-Elemente zu nutzen,
oder ist es strukturell schöner das dann doch selbst zu machen.

Was ist eure Meinung, würde mich interessieren 🙂

mfg Timo
 
Naja.... Es kommt auf das Spiel an... Wenn du ein schönes Mitteralterspiel machst,
wären moderne Scrollbalken eher hässlich und unpassend. Generell würde ich aber sagen, dass Swing dir gewaltige Möglichkeiten bietet, was das Look&Feel angeht. ALso Finger weg von AWT!

Wenn du nur button brauchst, ist es wohl besser, das selbst zu machen. Aber Sachen wie Listen, Textfelder etc selbst machen kann ewig dauern. Sowieso würde ich kein Java2D für SPiele verwenden.

Ich mache zur Zeit etwas ziemlich ähnliches... Ein 2D Coop-RPG. Mit Slick + Isomtrischen GRafiken... Wenn du Fragen hast... 😉

Aber strukturell ist es wohl schöner, Swing zu nehmen. Sonst fängst du bei null an...
 
na das mit dem bei "null" anfangen ist nicht unser Problem, da wir für dieses Projekt viel Zeit aufbringen werden und wirklich alles von "Unten" aufrollen wollen.

Naja aber du hast wohl recht für dinge wie Listen bzw. Textfelder werden wir dann doch auf Swing zurückgreifen.

Am Ende noch: Was ist an Java2D so schlimm? 🙁
 
Naja für Tetrisspiele und simple Junp'n'Run Spiele gehts vlt noch..

Das Problem ist eifnach die Geschwindigkeit! OpenGL 2D (z.b. die Slick Library) bringt endlosen Performanceschub... einfach durch die Hardwarebeschleunigung... Das zeichnen von Images, das Zeichnen von Primitiven etc... Es kommt immer auf die Komplexität des Spiels an... Bei komplexen Spielen bloß kein Java2D. Bei openGL hat man allerdings ein Problem (Alles hat eben eine Schattenseite...) es ist nicht so leicht ein GUI für OpenGL zu finden. Es gibt da ein paar wie z.B. "Nifty GUI", "FengGUI"...

Ein ausgesprochen gute Lösung wäre es, Swing auf OpenGL zu rendern... Das ist allerdings schwer... Ein Forenmitglied names Marco13 hat Swogl entwickelt, welches genau das kann: Swing auf openGL zu rendern. Es ist LPGL und obwohl die Website lange nicht mehr aktualisiert wurde, ist er in vollem Gange mit einer 2.0 Version^^ Einfach mal ne PM, falls in dieser Richtung Interesse besteht 😉 Ich hab für mein Spiel etwas ähnliches gemacht, allerdings ist mein Spiel nicht OpenSource 😉

Ansonsten viel Glücik weiterhin 😉

Gruß,

Chris
 
Na dann werde ich mich wohl mal mehr informieren, weil ich denke schon dass es ein etwas komplexeres Spiel wird, und wir das so performant wie möglich machen wollen.

Ich hoffe ich kann den code den ich jetzt schon habe einfach anpassen 😀
 
So wir werden jetzt JWJGL nutzen, um unsere Engine zu schreiben 😉.

Slick sieht zwar ganz interessant aus, aber wir wollen es dann doch lieber selbst machen hehe
 
Überschätz Slick nicht 😉 Slick ist keine Engine, es gibt nicht mal einen Szenengraph.. Aber der Voteil ist, dass dir die lästigen und echt nervigen Sachen abgenommen werden. Soundwiedergabe mit OpenAL ist bereit schön zusammengefasst etc... Ist meiner Ansicht nach definitiv einen Blick wert...
 
Swing auf OpenGL zu zeichnen ist eigentlich nicht sonderlich schwer. Wenn ihr euch in die Programmierung vertieft, solltet ihr solche Sachen sowieso recht bald verstehen und selbst lösen können.
Im Wesentlichen schiebt ihr den Rasterinhalt aus Java2D in eine Textur für OGL. Solange ihr beim Aktualisieren der UI aber am Swing-Thread hängt, wird da nichts schneller werden.
Wenn ihr Java2D nur als Zeichnungsbibliothek verwendet, könnt ihr höhere Bildraten erreichen, als die von Java gedeckelten.
Nützen wird euch das aber letztlich auch nichts, weil Java da bereits schnell genug ist. Oder habt ihr vor deutlich mehr als 60fps zu spielen?
Wirklich interessant wird es, wenn ihr zusätzliche Funktionen wie z.B. Shader auf die UI anwenden wollt. Oder wenn ihr statische Objekte habt, die in Java2D umständlich kopiert werden müssen und die ihr stattdessen auf die Grafikkarte schieben könnt.
 
@Kr0e ok^^
naja im endeffekt werden 60FPS ja reichne, soll ja nen RPG werden.

@muckelzwerg
Hab mich jetzt aber mal in LWJGL reingelesen und finde es schon relativ nice gemacht. Wir werden wohl nicht mehr auf Swing zurückgreifen 😀. Also hat sich das erledigt.

Und da wir nur ein 2D Spiel schreiben ist ja die Hardwareauslastung gering... Warum sollen wir den CPU unnötig belasten, wenn
wir Hardwarebeschleunigung "geschenkt" bekommen^^
 
Swing auf OpenGL zu zeichnen ist eigentlich nicht sonderlich schwer.

Hm, es geht nicht darum, Swing zu zeichnen, sondern Swing als funktionsfähiges UI auf OpenGL zu übetragen und das ohne ein sichtbares Fenster 😉 Auf dem Gebiet kenne ich mich inzwischen recht gut aus, es ist möglich, aber es verlangt viel knowhow! vorallem wenn es dann darum geht, das ganze auch noch möglichst fix zu machen 😉

Swing mit openGL ans laufen zu kriegen ist schon eeeeetwas schwerer als SwingUtilities.paintComponent () ;-)
 
TimoH, ich glaube, Du solltest Dich nochmal etwas genauer einlesen und mal ein paar Sachen ausprobieren. 🙂

Kr0e, Du redest doch von den Funktionen die Marco13 im Wesentlichen abgedeckt hat. Und dahinter steckt nicht allzuviel Magic.
Das Blöde an der Sache ist, dass man die eine zusätzliche Kopie der Inhalte nicht umgehen kann, weil Swing dann in einer Art Kompatibilitätsmodus (=langsam) zeichnet, wenn die Zieldatenstruktur nicht bekannt ist.
Das Ergebnis als Textur nach OGL und die Mausereignisse zurückzuschieben ist ja nicht die Welt. Schneller wird es dadurch dann aber nicht.
 
Ein ausgesprochen gute Lösung wäre es, Swing auf OpenGL zu rendern... Das ist allerdings schwer... Ein Forenmitglied names Marco13 hat Swogl entwickelt, welches genau das kann: Swing auf openGL zu rendern. Es ist LPGL und obwohl die Website lange nicht mehr aktualisiert wurde, ist er in vollem Gange mit einer 2.0 Version^^ Einfach mal ne PM, falls in dieser Richtung Interesse besteht 😉

Oder mal bei http://www.java-forum.org/codeschnipsel-u-projekte/120521-swogl-swing-meets-opengl.html#post777842 reinschauen 😉
 
Nein, natürlich ist das mehr Arbeit als ein Bubblesort. 🙂
Aber im Prinzip gibt es ja nur den glTexSubimage()-Weg wenn man eine Softwarebibliothek zum Zeichnen verwenden will.
 

Neue Themen


Zurück
Oben