# Spiel-Oberfläche



## TimoH. (22. Jun 2011)

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:


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


```
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


----------



## Kr0e (22. Jun 2011)

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


----------



## TimoH. (22. Jun 2011)

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?


----------



## Kr0e (22. Jun 2011)

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


----------



## TimoH. (22. Jun 2011)

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


----------



## TimoH. (23. Jun 2011)

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


----------



## Kr0e (23. Jun 2011)

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


----------



## muckelzwerg (23. Jun 2011)

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.


----------



## TimoH. (23. Jun 2011)

@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^^


----------



## muckelzwerg (23. Jun 2011)

Mit der Entscheidung für lwjgl hast Du aber doch die Frage nach der UI noch nicht geklärt.


----------



## TimoH. (23. Jun 2011)

naja schon, damit werden wir diese auch selbst machen


----------



## Kr0e (23. Jun 2011)

muckelzwerg hat gesagt.:


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


----------



## muckelzwerg (23. Jun 2011)

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.


----------



## Marco13 (23. Jun 2011)

Kr0e hat gesagt.:


> 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


----------



## Kr0e (23. Jun 2011)

Naja, aber trivial ist es jedenfalls nicht...


----------



## muckelzwerg (23. Jun 2011)

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.


----------

