Nifty oder doch Swing ?!

TheMuh

Mitglied
Wenn mir für die 3D Darstellungen Fenster(Canvas) ausreichen, ist es dann ratsamer Nifty oder Swing für die gleichzeitig anzuzeigende GUI drumherum zu nehmen ?

Meine Frage ist insbesondere
(1) führt das Einbetten von jmonkey in Swing Oberflächen zu Performanceeinbusen oder ist das egal
(2) ist es sinnvoll mit nifty in jmonkey zu arbeiten, insbesondere dann wenn ich gleichzeitig gui und 3d-Teile brauche, also nifty nur als eingebettete Textur nutzen kann ... ?


ganz praktisches beispiel was ich machen will:

- Den klassischen Chat innerhalb gängiger MMO-Spiele ... nifty oder swing ?
 

Evil-Devil

Top Contributor
Nifty oder was eigenes. Dein Applikation ist schließlich primär über JME realisiert. Warum also nicht auch direkt dann die Ingame UIs darüber lösen.

Leider gibt es kein Scaleform für Java, das wäre mal was feines =)
 

thewulf00

Bekanntes Mitglied
Es wird immer davor gewarnt, Swing auf einer OpenGL-Oberfläche zu verwenden. Aber Marco13 aus dem Forum hat da ein Projekt am Laufen, um diese Probleme zu beheben.

Ich empfehle ganz klar Nifty.
 

TheMuh

Mitglied
hmmmm oke erstmal danke für eure meinung......

Sollte ich das spiel "nur" über jmonkey machen frage ich mich

(1) wie werden in jmonkey textinputfelder gemacht ? ich finde dazu kein Tutorial
(2) die GUI ist ja eine feste 2D Oberfläche das restliche Bild soll aber schon im 3d Raum beweglich und skalierbar sein ..geht das gleichzeitig? ... ok, es gibt ja auch jmonkey HUDS .. nur sind die wohl nicht wirklich interaktiv nutzbar oder ?

P.S.: Hier sind HUD's ja grundsätzlich gut erklärt ... aber wie gesagt, kann ich einzelne Elemente(z.b. Grafikbild) der HUD anklickbar also interaktiv nutzbar machen und steuern, als z.b. daraus einen Button oder ein Chatinputfeld erstellen ?
jMonkeyEngine.org | Head-Up Display (HUD)
 
Zuletzt bearbeitet:

thewulf00

Bekanntes Mitglied
Also Du musst Dir erstmal überlegen, was mit der Maus sein soll. Wenn Du eine Spielfigur hast, die per Maus läuft oder sieht (Ego-Perspektive), wie willst Du dann noch GUI-Elemente anklicken?

Dazu gibt es folgende Lösungen:
- 2-Modi-Betrieb: Du schaltest per Taste zwischen GUI (mit benutzbarer Maus) und Spielersicht (mit Maussichtsteuerung) um.
- Mausfreie Steuerung: Du steuerst das Spiel per Tastatur und nutzt die Maus zum Klicken in der GUI.
- Mausfreie GUI: Du steuerst den Spieler/die Spielfigur per Maus und bedienst die GUI nur per Tastatur.

Ich rate dringend davon ab, mehrere 3D-Engines zu mischen! Du kannst aber gerne die jeweilige Basis der Engine mitbenutzen (z.B. LWJGL bei jME3).

Die jMonkeyEngine bietet einen rootNode, an den alles in der Spielwelt gehängt wird, und eine guiNode, die alle HUDs, d.h. GUI-Elemente bekommt. Die GUI-Elemente werden dann automatisch 2D-gerendert, damit man es als HUD sehen kann. Ist super einfach.
 

Kr0e

Gesperrter Benutzer
Sogar 3D GUI Elemente sind mit etwas know-how auch moeglich. Nifty muss hierbei in ein FrameBufferObjekt gerendert werden und anschliessend muss die Textur auf ein Objekt geklebt werden...

Kurz zu der Grundfrage: Ich finde Nifty auch gut, aber ich mag die Bedienung nicht. Ich finde es vollkommen ueberfluessig und unnoetig bei einem Javaprogramm, die GUI ansich ueber XML zu definieren. Klar, die Styles etc mahcne Sinn... Aber der Rest nicht... Vorallem weil man ja sowieso Java-Callbacks braucht, um Nifty zu sagen, welche Callback-Impl dann fuer welchen Event noetig ist...

Ich verstehe auch nicht, warum JME3 da direkt in deren Core genommen hat... Es gibt da weit bessere und ausgereiftere Loesungen: TWL. Sieht auch noch besser aus...

Marco13 hat Swogl am Laufen, ein Projekt, das es dir ermoeglicht, Swing virtuell in eine Textur zu rendern und mit dieser kannst du dann anstellen was du willst... Seine Beispiele sind echt lustig :D (Swing auf einem Bunny 3D Modell :D)

Aber nun gut, was du nehmen willst, ist im Endeffekt deine Entschiedung...

Achja: Swogl
 
Zuletzt bearbeitet:

TheMuh

Mitglied
@thewulf00

erstmal vielen dank für deine ausführliche antwort.

ich brauche keine Steuerung aus der EgoPerspektive, da die 3D Darstellung sich im grunde auf eine isometrische Darstellung im Stile von Civilization und co beschränkt ... ich hab nichtmal eine Figur die darin in echtzeit bewegt werden muss sondern ein spielprinzip wie in civilization. d.h. die figuren bwegen sich runden bzw tickbasiert und das einzige was in der 3D Darstellung mit der Maus interaktiv anklickbar sein sollte wären einzelne gebäude und objekte um informationen oder spielbefehle geben zu können ...

also auf deine antwort basierend würde ich das nun weiterdenken:

mir reicht es wenn ich die 3D welt per cursortasten drehen kann, da dies ein reines gimmick sein soll
wenn ich also die Mausteuerung auf die gui lege, kann ich dann trotzdem einzelne objekte der 3d Welt für die maus anklickbar machen ?
 

thewulf00

Bekanntes Mitglied
Nun, dann ists ja einfach: Du implementierst Mouse- und KeyListener auf das gesamte Fenster und entscheidest dann bei jedem Tastendruck, wer den annehmen soll (die Einheit, oder die GUI), und bei jedem Klick liest Du die Mauskoordinaten aus und übergibst es der GUI.
 

Fu3L

Top Contributor
Ja, das dürfte dann noch möglich sein. Siehe MMORPGs in denen man den Chat auch noch anklicken kann und Echtzeitstrategiespiele, wo du auch die Gebäude noch auswählen kannst. (Die vorhe genannte Einschränkung war ja nichts Java-Spezifisches^^)

@Kr0e: Würdest du denn den Einsatz von TWL mit JMonkey empfehlen? Ich hab mein großes Projekt erst einmal zum Aufbau der Spiellogik auf 2 Raumdimensionen beschränkt, würde aber später nach Möglichkeit das ganze wieder in die dritte Raumdimension übertragen (wenn ich auch schon etwas mehr Wissen erlangt habe über OpenGL und co^^) und dafür wüsste ich auch gerne, wie ich am besten passende Menüs erstellen könnte^^

Edit: Speziell zur JME: Hier wird weiter unten erklärt, wie man zB ein Inventar mit JME Bordmitteln erstellen kann^^
 

TheMuh

Mitglied
Nun, dann ists ja einfach: Du implementierst Mouse- und KeyListener auf das gesamte Fenster und entscheidest dann bei jedem Tastendruck, wer den annehmen soll (die Einheit, oder die GUI), und bei jedem Klick liest Du die Mauskoordinaten aus und übergibst es der GUI.

vielen dank für deine hilfe!

zwei letzte dinge noch:
(1) wenn ich ein objekt(z.b. eine einheit) in der 3d-landschaft anklicke, die mauskoordinaten auslese und dann an die gui weitergebe, wie merkt mein programm dann das eigentlich ein element der 3d landschaft angesteuert werden soll und beispielsweise ein popup fenster für die einheit geöffnet werden soll ?
(2) wie macht man textinputfelder ?
 

Kr0e

Gesperrter Benutzer
Hi!,

also ich arbeite auch zur Zeit an einem isometrischen Spiel, aber ich mach das halt 2D mit isometrischen GRafiken... Da mein LEveleditor zu komplex ist, um es vernuenftig mit TWL oder Niftz hinzubekommen, hab ich eine aehnliche Loesung wie Swogl geschrieben. Ich wollte halt unbedingt die GUI mit dem Matisse Editor erstellen...

Generell kannst du auch TWL mit JME benutzen. Immerhin ist Nifty ja auch erst spaeter reingekommen. Man braucht dafuer einen InputHandler, der quasi die JME Inputsachen auf TWL uebertraegt. Vlt gibt es da ja sogar schon was...

Ein Vorteil von TWL: Die haben einen Themeeditor... Damit kann man quasi eigene Themes erstellen, was ziemlich angenehm ist. Bei Nifty waere das ein XML Fight :D

Ich denke, du solltest dich fragen, ob es Sinn macht, fuer ein isometrisches Spiel eine 3D Engine zunehmen. Kostenlose 2D Gebaeudegrafiken gibt es ueberall... Aber gute 3D Modells... Schon seltener...

EDIT: Natuerlich sieht es schoener aus... garkeien Frage^^
 

Fu3L

Top Contributor
(1) wenn ich ein objekt(z.b. eine einheit) in der 3d-landschaft anklicke, die mauskoordinaten auslese und dann an die gui weitergebe, wie merkt mein programm dann das eigentlich ein element der 3d landschaft angesteuert werden soll und beispielsweise ein popup fenster für die einheit geöffnet werden soll ?

Siehe den Link den ich postete ;)

Womit TextInput Fields? MIt Nifty erklärt dir das besser jemand anders, müsste selbst wieder probieren^^
 

thewulf00

Bekanntes Mitglied
wenn ich ein objekt(z.b. eine einheit) in der 3d-landschaft anklicke, die mauskoordinaten auslese und dann an die gui weitergebe, wie merkt mein programm dann das eigentlich ein element der 3d landschaft angesteuert werden soll und beispielsweise ein popup fenster für die einheit geöffnet werden soll ?
jME macht das für Dich. Du sagst ihm, wo im Fenster geklickt wurde, und bekommst dann das 3D-Objekt, was darunter liegt.

Der Link von Fu3L erklärt das gut.
 

TheMuh

Mitglied
aaaahhh oke ...

d.h. ich muss einfach nur alle elemente die mit der maus ansteuerbar sein sollen ,egal ob 2d oder 3d an die shootables anhängen ...

na wenn das so einfach ist .... klasse ^^

danke euch für die info... :toll:
 

TheMuh

Mitglied
Siehe den Link den ich postete ;)

Womit TextInput Fields? MIt Nifty erklärt dir das besser jemand anders, müsste selbst wieder probieren^^

danke für den Link! mir war eben bisher nicht klar das diese vorgehensweise auch für hud elemente gilt ;)

bzgl. "textinputfeld"
ich brauche einfach eine möglichkeit um in dem HUD eine Chateingabe zu ermöglichen .. am besten ohne nifty :/
 

Evil-Devil

Top Contributor
Ein Chat im HUD ist letzten Endes nichts anderes als eine Aneinanderreihung von Texturen. Du hättest da einmal die Textur(en) für deine Chatbox und die Textur die deine alphanumerischen Zeichen enthält.

Bei deinem Iso Spiel könntest du ganz normal übers Color-Picking den HUD Bereich in einer Farbe färben bzw. die einzelnen anklickbaren HUD Elemente in einer abgewandelten. Also grundlegend GUI Color wäre blau und die Schaltflächen auf der GUI dann in 255 verschiedenen Farbabstufungen von Blau. Nur so eine Idee. Klickt also der User in den Chatbereich, muss eine entsprechende Logik einen Cursor anzeigen lassen sowie bei Tastatureingabe die entsprechenden Zeichen aus der alphanumerischen Textur holen und anzeigen.

An sich ist ein HUD nicht großartig anders als das 3D das du darstellst. Meist ist es eben "nur" 2D und wird über die Spielwelt drüber gelegt.

Wenn du das ganze auf die Spitze treiben willst, dann könntest du es sogar so entwickeln das HUD Elemente bei Bedarf durchklickbar sind und man sie nur auf den jeweiligen Schaltflächen deaktivieren, minimieren oder whatever kann. DEine Möglichkeiten sind da fast grenzenlos ;)
 

TheMuh

Mitglied
Ein Chat im HUD ist letzten Endes nichts anderes als eine Aneinanderreihung von Texturen. Du hättest da einmal die Textur(en) für deine Chatbox und die Textur die deine alphanumerischen Zeichen enthält.

Bei deinem Iso Spiel könntest du ganz normal übers Color-Picking den HUD Bereich in einer Farbe färben bzw. die einzelnen anklickbaren HUD Elemente in einer abgewandelten. Also grundlegend GUI Color wäre blau und die Schaltflächen auf der GUI dann in 255 verschiedenen Farbabstufungen von Blau. Nur so eine Idee. Klickt also der User in den Chatbereich, muss eine entsprechende Logik einen Cursor anzeigen lassen sowie bei Tastatureingabe die entsprechenden Zeichen aus der alphanumerischen Textur holen und anzeigen.

An sich ist ein HUD nicht großartig anders als das 3D das du darstellst. Meist ist es eben "nur" 2D und wird über die Spielwelt drüber gelegt.

Wenn du das ganze auf die Spitze treiben willst, dann könntest du es sogar so entwickeln das HUD Elemente bei Bedarf durchklickbar sind und man sie nur auf den jeweiligen Schaltflächen deaktivieren, minimieren oder whatever kann. DEine Möglichkeiten sind da fast grenzenlos ;)

also wenn ich dich richtig verstehe mach das so

(1) Chatbereich ans Hud mittels Texturen heften& Chatbereich erhält bei entsprechendem Mausklick den Fokus
(2) Solange der Fokus auf den Chatbereich steht gehen alle Texteingaben an die Chateingabetextur weiter und wird dort mittels Textwiedergabe angezeigt
(3) Bei bsp. drücken von Return wird der eingebene String einfach an den Chatlog angehängt und das Chateingabefenster wieder geleert
(4) Der Fokus der Chatkonsole geht wieder weg, sobald die Maus ausserhalb des Chatfensters gedrückt wird

... sozusagen ein chat "from the scratch" ok ....
 

Evil-Devil

Top Contributor
also wenn ich dich richtig verstehe mach das so

(1) Chatbereich ans Hud mittels Texturen heften& Chatbereich erhält bei entsprechendem Mausklick den Fokus
(2) Solange der Fokus auf den Chatbereich steht gehen alle Texteingaben an die Chateingabetextur weiter und wird dort mittels Textwiedergabe angezeigt
(3) Bei bsp. drücken von Return wird der eingebene String einfach an den Chatlog angehängt und das Chateingabefenster wieder geleert
(4) Der Fokus der Chatkonsole geht wieder weg, sobald die Maus ausserhalb des Chatfensters gedrückt wird

... sozusagen ein chat "from the scratch" ok ....
Yepp, das wäre die kurze Zusammenfassung meiner vielen Worte.

DIeses Verhalten kann man bei nahezu jedem gängigen MMO beobachten. Einige setzen den Fokus auf den Chat bereits beim betätigen der Return Taste, falls nicht gerade ein anderes Fenster offen ist bzw. lassen das Verhalten konfigurierbar.
 

Empire Phoenix

Top Contributor
Nifty mag ich net, war mir zu dumm mit XML's
TWL sieht sehr gut aus, aber da es direct opengl calls verwendet ist es mit JME nciht komplett kompatible(da du den state manipulierst den JMe eigentlich erwartet) Habe es dennoch versucht aber nie zum laufen bekommen.
Benutze jetzt ein eigenes System das Swing änhliche API hat und auf Quads sowie einen RawInputListener basiert.

Swing um jme kann zu problemen führen aber solle amchbar sein, bei etwas einarbeitung.
Ebenfalls möglich sit es Swing in Jme zu benutzen, indem man das Graficobject selber implementiert und das direct auf eine JMe Textur rendern lässt. (Oder alternativ ein bufferdimage und das zu eienr Texture convertiert) Speziell das umwandelt hat jedoch massiver performanceverluste, da das normale grafics object stark optimiert ist.
 

TheMuh

Mitglied
Nifty mag ich net, war mir zu dumm mit XML's
TWL sieht sehr gut aus, aber da es direct opengl calls verwendet ist es mit JME nciht komplett kompatible(da du den state manipulierst den JMe eigentlich erwartet) Habe es dennoch versucht aber nie zum laufen bekommen.
Benutze jetzt ein eigenes System das Swing änhliche API hat und auf Quads sowie einen RawInputListener basiert.

Swing um jme kann zu problemen führen aber solle amchbar sein, bei etwas einarbeitung.
Ebenfalls möglich sit es Swing in Jme zu benutzen, indem man das Graficobject selber implementiert und das direct auf eine JMe Textur rendern lässt. (Oder alternativ ein bufferdimage und das zu eienr Texture convertiert) Speziell das umwandelt hat jedoch massiver performanceverluste, da das normale grafics object stark optimiert ist.

thx für meinung .....
- nifty halte ich aus meiner noch laienhaften einschätzung allein schon deswegen für recht sinnfrei, da es nur overlayed oder ohne mauseingaben realisierbar ist ... daher fürn chatsystem wohl eher unbrauchbar

@Empire Phoenix meinst du die lösung "JME3 Canvas in a Swing GUI" führt zu erheblichen performanceverlusten oder hält sich das im rahmen ?
Hat jemand anderes Erfahrung mit diesem Weg ?
 

Kr0e

Gesperrter Benutzer
Wenn du Swogl benutzt, brauchst du noch nen InputHandler, der JME-Input an Swogl iwie weiterreicht, sonst gehts nicht...
 

Fu3L

Top Contributor
da es nur overlayed oder ohne mauseingaben realisierbar ist ... daher fürn chatsystem wohl eher unbrauchbar

Wie meinst du das? Natürlich kannst du in der Nifty Gui mit der Maus navigieren.

Mal ne doofe Frage nebenbei (lohnt nich als eigenen Thread): Wie mache ich, ohne Application zu verändern eine Pausenfunktion in JME? Ich habs zwar hinbekommen, aber ich kann nicht überblicken, ob das "die feine Art" ist und immer funktioniert bzw. ohne Nebenwirkungen^^
 

thewulf00

Bekanntes Mitglied
Benutzt Du Application oder SimpleApplication?
Die Application selbst reagiert ja pausierend auf den Focus-Verlust. Evtl. kannst Du das zu Deinem Vorteil nutzen? (Also z.B. der Application den Focusverlust vortäuschen)

Lass uns doch an Deiner Variante teilhaben.
 

Evil-Devil

Top Contributor
Ne "Pause" ist doch nichts anderes als das Anhalten der Spiellogik. Ansonsten renderst du weiterhin den letzten bekannten Zustand.
 

thewulf00

Bekanntes Mitglied
Ja richtig, aber Teile der Spiellogik nimmt einem die jME ab, und genau das ist Sinn der Sache. Diese kann man dann leider nicht anhalten.
 

Kr0e

Gesperrter Benutzer
Klar.. musst halt das Objekt, auf dem die Textur klebt mit einem Ray beschiessen und dann die Koordinaten entnehmen und weiterleiten... Aber ist schon etwas komplexer als die normale Nutzung...
 

TheMuh

Mitglied
Klar.. musst halt das Objekt, auf dem die Textur klebt mit einem Ray beschiessen und dann die Koordinaten entnehmen und weiterleiten... Aber ist schon etwas komplexer als die normale Nutzung...

genau diese lösung könnte mir bei meiner anderen frage evtl. helfen ..
--- >http://www.java-forum.org/spiele-mu...121290-mousecontrol-jme-canvas-swing-gui.html

könntest du mir da etwas Code oder weitergehende Info geben, bitte ?
kann ich das irgendwie auf meinem swing canvas casten und dann an die jme umgebung weitergeben ?
 

Fu3L

Top Contributor
Ja richtig, aber Teile der Spiellogik nimmt einem die jME ab, und genau das ist Sinn der Sache. Diese kann man dann leider nicht anhalten.

Genau, deswegen habe ich SimpleApplication kopiert und diese Änderung in update() vorgenommen:

Java:
if(!pause) {
       rootNode.updateLogicalState(tpf);
}

Und natürlich die Variabel pause hinzugefügt. Damit funktioniert es, auch wenn ich wie gesagt nicht weiß, ob es Konsequenzen hat, die über das Gewünschte hinausgehen^^ (insbesondere, weil sich die Ausrichtung der Kamera nach dem Wiederaufnehmen des Spiels unter Umständen ändern kann^^)

Edit: Das mit dem onLostFocus pausieren ist irgendwie noch tiefer verankert^^ Auf die Idee das FocusEvent vorzutäuschen bin ich aber nicht gekommen^^
 
Zuletzt bearbeitet:

thewulf00

Bekanntes Mitglied
Verwende doch lieber
Code:
paused
.
Application nutzt das intern für die Info, ob es wegen Focus-Verlust pausiert ist, oder nicht. Da die Variable
Code:
protected boolean paused
ist, kannst Du sie ebenfalls lesen und schreiben.

Diese umzubiegen, für die eigenen Zwecke, dürfte völlig ausreichend sein. Bedenke dabei noch den Einfluss von Focus-Lost usw. (Entweder überschreiben, oder die Variable pauseOnFocus auf false setzen (per Setter))
 

Fu3L

Top Contributor
Wenn ich von SimpleApplication erbe und alle meine pause = true/false durch paused = true/false ersetze, friert das Bild ein und taut danach nicht mehr auf^^ Vllt muss man wirklich da noch mehr beachten^^
Und ich hab mal einen alten Stand rausgekramt, wo ich ne pause-variable nur für meine eigenen Logiksachen nutzte, da bewegt sich der Charakter einfach auf der Stelle weiter, weil die Animation trotzdem passiert und bei jeder Animation auf pause abzufragen finde ich ätzend^^
 

Ähnliche Java Themen


Oben