# Textbasiertes Adventure



## MrMassachusetts (19. Aug 2016)

Hallo Liebe Community,
ich bin nun neu in Java eingestiegen und wollte ein Textbasiertes Adventure erstellen.
Ich habe schon eins erstellt, nur ich finde es dort nicht so gut, dass es in der Konsole angezeigt wird. Kann ich das hinbekommen, dass in einem Java-Fenster der Text angezeigt wird, dass man durch den vorherigen Text durchscrollen kann und dass es dort 2 Knöpfe zur Auswahl gibt (Antwortmöglichkeit 1 und Antwortmöglichkeit 2) und wenn man diese drückt, soll halt ein bestimmter Text geprintet werden.

Wie kann ich das realisieren?

Vielen Dank schonmal im Vorraus


----------



## Xyz1 (19. Aug 2016)

Schaust du dir mal https://sourceforge.net/projects/javacurses/ an einfach.


----------



## Nuiton (19. Aug 2016)

Wie man das macht? Indem man lernt, zu programmieren. Wenn dein GUI moechtest, dann lerne Swing oder JavaFX.


----------



## Xyz1 (20. Aug 2016)

Naja, wir sind ja hier, zu helfen, nicht zu kritisieren.


----------



## Beno (22. Aug 2016)

Hey MrMassachusetts!

Für den Anfang würde ich eher auf der Command Basis bleiben, aber wenn dir das nicht mehr reicht kannst du auf YouTube ein paar Tutorials über GUI Programmierung anschauen und selber ausprobieren! 
Add-Ons wie WindowBuilder für eclipse sind zwar extrem hilfreich, solltest du aber für den Anfang nicht benutzen damit du alles auch von Hand kannst.  Wenn du soweit bist kannst du ja ein kleines JFrame Fenster erstellen mit 2 Buttons und einem TextFeld (evtl. mit Scrollen) und schauen wie du damit vorankommst! Zur Not einfach Google betätigen oder hier nachfragen!


----------



## Bilal (6. Sep 2016)

Moin,
ich musste in meiner Seminararbeit ein Programm schreiben in dem ich mir in meiner GUI eine eigene Konsole gebaut habe. Da habe ich bisschen recherchiert und bin bei stackoverflow.com auf folgenden Code gestoßen:

```
package nash.misc;

import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;

import nash.content.ContentManager;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;



public class Console extends BorderPane {
    public final TextArea textArea = new TextArea();

    protected final List<String> history = new ArrayList<>();
    protected int historyPointer = 0;

    private Consumer<String> onMessageReceivedHandler;

    public Console() {
        setLayoutX(830 );
        setLayoutY(100 );
        textArea.setEditable(false);
        textArea.setMaxSize(350, 350);
        textArea.setMinSize(350, 350);
        textArea.setStyle(""
                + "-fx-font-size: 14px;"
                + "-fx-font-style: Verdana;"
                + "-fx-font-weight: normal;"
                + "-fx-font-family: Verdana;"
                + "-fx-text-fill: yellow;"
                + "-fx-control-inner-background: black");
        setCenter(textArea);
        println("Game has started. Init. completed");
 
    }



    @Override
    public void requestFocus() {
        super.requestFocus();

    }

    public void setOnMessageReceivedHandler(final Consumer<String> onMessageReceivedHandler) {
        this.onMessageReceivedHandler = onMessageReceivedHandler;
    }

    public void clear() {
        GUIUtils.runSafe(() -> textArea.clear());
    }

    public void print(final String text) {
        Objects.requireNonNull(text, "text");
        GUIUtils.runSafe(() -> textArea.appendText(text));
    }

    public void println(final String text) {
        Objects.requireNonNull(text, "text");
        GUIUtils.runSafe(() -> textArea.appendText(text + System.lineSeparator()));
    }

    public void println() {
        GUIUtils.runSafe(() -> textArea.appendText(System.lineSeparator()));
    }





}
```
Dazu wurde noch eine Unterklasse und eine Utility mitangegeben, die das sichere Laufen und Wrappen (einrücken in die nächste Zeile) der Konsole ermöglichen:

```
public class WordWrapConsole extends Console {
    public WordWrapConsole() {
        super();
        textArea.setWrapText(true);
    }
```


```
import java.util.Objects;

import javafx.application.Platform;

public final class GUIUtils {
    private GUIUtils() {
        throw new UnsupportedOperationException();
    }

    public static void runSafe(final Runnable runnable) {
        Objects.requireNonNull(runnable, "runnable");
        if (Platform.isFxApplicationThread()) {
            runnable.run();
        }
        else {
            Platform.runLater(runnable);
        }
    }
}
```
Hier habe ich ein Screenshot aus meinem Programm, wie das Ganze dann am Ende aussieht. DIe Konsole ist rot umrandet.






Sobald die Konsole voll geschrieben wird, erzeugt die Klasse einen Scrollbalken automatisch.
In der Console-Klasse kannst du dir deine eigenen Printausgaben und sonstigen Funktionen selber definieren. Die Konsole kannst du dann in deiner App erzeugen, wie z.B.:

```
//Klassenattribute
private Scene mainScene;
public Group mainRoot = new Group();
public Stage mainStage;
public Console console ;
// Startmethode der App
@Override
    public void start(Stage primaryStage) throws Exception {
        //main setup
        this.console  = new WordWrapConsole();
        this.mainStage = primaryStage;
        this.mainScene = new Scene(mainRoot, 1200, 600);
        init();
        this.mainRoot.getChildren().add(console);
 
        this.mainStage.setScene(mainScene);
        this.mainStage.setTitle("Nash Equilibrium Game");
        this.mainStage.setResizable(false);
        this.mainStage.show();
 
        gameLoop();
}
```
Dazu müsstest du dich mit der Group-Klasse auseinandersetzen, die wie eine Struktur funktioniert. Diese beinhaltet nämlich alle wichtigen Elemente wie die Gui (Canvas), Konsole, Buttons und sonstige Elemente. Da meine Vorredner schon JavaFX erwähnt hatten und ich diesen auch nutze, würde ich dir empfehlen seine Dok dir mal durchzulesen. Ich finde FX für Java Gaming ziemlich mächtig. Die Buttons kannst du zusätzlich einbauen und dir eine Schnittstelle über einen entfernten Methoden aufruf á la console.ausgabe1() oder console.ausgabe2() verschaffen. Hoffe konnte helfen.
LG Bilal


----------

