# Dialogbox im Spiel - Text in Blöcke aufteilen



## it_is_all (24. Jul 2017)

Hi Leute,
ich bin gerade in der Planungsphase eines Adventure-Games.
Werde viele Dialoge umsetzen müssen, die ähnl. wie auf dem unteren Bild in einer Box dargestellt werden, deren Platz auf eine bestimmte Anzahl von Zeichen begrenzt ist.

Ich stelle mir das so vor, dass ich den Text in eine txt-Datei schreibe und eine Methode diesen dann in Blöcke von z.B. 300 Zeichen einteilt, die dann in der Box angezeigt werden und sobald man auf "weiter" klickt, den nächsten 300-Zeichen-Block des selben txt-Dokuments, usw. bis Text am Ende in der Datei. Würde dann viele versch. txt-Dateien erstellen...

Wie findet Ihr den Ansatz? Habt Ihr iwelche Methoden-Namen, sodass ich mich darin mal einlesen kann? Oder würdet ihr die Sache anders lösen?

Ich danke Euch wirklich von Herzen für Euer Bemühen im Voraus!
MFG Dennis


----------



## Blender3D (25. Jul 2017)

```
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;

public class TextResource {
    private String source = null;

    /**
     * Manages string resource file structure.
     *
     * @param source
     */
    public TextResource(String source) {
        this.source = source;
    }

    /**
     * Appends data text to specified category.
     *
     * @param name
     *            Category name.
     * @param text
     *            Data text.
     * @return
     */
    public boolean add(String name, String text) {
        if (!createNameDirectory(name))
            return false;
        Vector<String> data = toCategoryStringVector(name);
        data.add(text.trim());
        return saveStringVector(name, data);
    }

    /**
     * Checks if name category directory and data file exist. If not they will
     * be created .
     *
     * @param name
     *            Category name.
     * @return True if successful.
     */
    private boolean createNameDirectory(String name) {
        boolean ok = true;
        String msg = "Can't create data category " + name;
        if (name == null || name.length() == 0)
            return error(msg);
        File file = new File(getLocationDirectoryString(name));
        if (!file.exists()) {
            file.mkdirs();

        }
        File data = new File(getLocationFileString(name));
        if (!data.exists()) {
            try {
                ok = data.createNewFile();
            } catch (IOException e) {
                return error(msg);
            }
        }
        if (!file.exists() || !ok)
            return error(msg);
        return true;
    }

    private boolean error(String msg) {
        System.err.println(msg);
        return false;
    }

    private boolean existsCategoryDirectory(String name) {
        if (name == null || name.length() == 0)
            return false;
        File dir = new File(getLocationDirectoryString(name));
        return dir.exists();
    }

    /**
     * @param name
     *            Category name.
     * @return String of categories directory location.
     */
    private String getLocationDirectoryString(String name) {
        return source + "/" + name + "/";
    }

    /**
     * @param name
     *            Category name.
     * @return String of categories data location.
     */
    private String getLocationFileString(String name) {
        return getLocationDirectoryString(name) + "data.txt";
    }

    /**
     * Gets data at position of specified category.
     *
     * @param name
     *            Category name.
     * @param pos
     *            Position's id.
     * @return String or null.
     */
    public String get(String name, int pos) {
        boolean ok = existsCategoryDirectory(name);
        if (!ok)
            return null;
        Vector<String> data = toCategoryStringVector(name);
        if (pos < 0 || pos >= data.size())
            return null;
        return data.get(pos);

    }

    /**
     * @return String[] containing available categories.
     */
    public String[] getAllCategories() {
        File tmp = new File(source);
        if (!tmp.exists())
            return null;
        return tmp.list();
    }

    public boolean insert(String name, String text, int pos) {
        if (!createNameDirectory(name))
            return false;
        Vector<String> data = toCategoryStringVector(name);
        if (pos >= data.size())
            return add(name, text);
        if (pos < 0)
            pos = 0;
        data.insertElementAt(text, pos);
        return saveStringVector(name, data);
    }

    /**
     * Removes data at position of specified category.
     *
     * @param name
     *            Category name.
     * @param pos
     *            Positions id.
     * @return Removed data if successful. Otherwise null.
     */
    public String remove(String name, int pos) {
        if (!createNameDirectory(name))
            return null;
        Vector<String> data = toCategoryStringVector(name);
        if (pos < 0 || pos >= data.size())
            return null;
        String text = data.remove(pos);
        return saveStringVector(name, data) ? text : null;
    }

    /**
     * Removes specified category.
     *
     * @param name
     *            Category name.
     * @return True if successful.
     */
    public boolean removeCategory(String name) {
        boolean ok = existsCategoryDirectory(name);
        if (!ok)
            return false;
        String dir = getLocationDirectoryString(name);
        FileOperation.deleteDirecoryContent(dir);
        return FileOperation.deleteFile(dir);
    }

    private boolean saveStringVector(String name, Vector<String> data) {
        if (data == null || name == null || name.length() == 0)
            return false;
        FileStreamOut out = new FileStreamOut(getLocationFileString(name), "write " + name + " error!");
        Iterator<String> it = data.iterator();
        while (it.hasNext())
            out.writeLine(it.next().trim());
        out.close();
        return true;
    }

    public int sizeOfCategory(String name) {
        boolean ok = existsCategoryDirectory(name);
        if (!ok)
            return 0;
        Vector<String> data = toCategoryStringVector(name);
        return data == null ? 0 : data.size();
    }

    /**
     * @param name
     *            Category name.
     * @return Vector<String> Containing categories data or null.
     */
    public Vector<String> toCategoryStringVector(String name) {
        String fileName = getLocationFileString(name);
        File f = new File(fileName);
        if (!f.exists())
            return null;
        FileStreamIn in = new FileStreamIn(fileName, "read " + name + " error!");
        String line = null;
        Vector<String> data = new Vector<String>();
        while ((line = in.readLine()) != null)
            data.add(line.trim());
        in.close();
        return data;
    }
}
```


```
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JOptionPane;

public class FileStreamIn {
    private FileInputStream fin = null;
    private InputStreamReader in = null;
    private BufferedReader br = null;
    private String file = null;
    private String msg = null;

    public FileStreamIn(String file, String msg) {
        this.msg = msg;
        this.file = file;
        try {
            fin = new FileInputStream(file);
            in = new InputStreamReader(fin);
            br = new BufferedReader(in);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.err.println("open error " + file);
            Error();
        }
    }

    public void close() {
        try {
            br.close();
            in.close();
            fin.close();
        } catch (IOException e) {
        }
    }

    public boolean isValid() {
        return br != null;
    }

    public String readLine() {
        String line = null;
        if (br == null)
            return null;
        try {
            line = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("read error " + file);
            Error();
        }

        return line;
    }

    public void Error() {
        JOptionPane.showMessageDialog(null, file, msg,
                JOptionPane.INFORMATION_MESSAGE, null);
    }

    public BufferedReader getBr() {
        return br;
    }
}
```


```
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JOptionPane;

public class FileStreamOut {
    private FileWriter fw = null;
    private BufferedWriter bw = null;
    private String file = null;
    private String msg = null;

    public FileStreamOut(String file, String msg) {
        this.file = file;
        this.msg = msg;
        try {
            fw = new FileWriter(file);
            bw = new BufferedWriter(fw);
        } catch (IOException e) {
            System.err.println("open error " + file);
            Error();
        }
    }

    public void close() {
        try {
            bw.close();
            fw.close();
        } catch (IOException e) {
        }
    }

    public boolean isValid() {
        return bw != null;
    }

    public void Error() {
        JOptionPane.showMessageDialog(null, file, msg,
                JOptionPane.INFORMATION_MESSAGE, null);
    }

    public BufferedWriter getBw() {
        return bw;
    }

    public boolean writeLine(String line) {
        if (line == null)
            return false;
        String lineSeparator = System.getProperty("line.separator");
        try {
            bw.write(line + lineSeparator);
        } catch (IOException e) {
            Error();
            return false;
        }
        return true;
    }
}
```


```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileOperation {

    /**
     * Deletes file.
     *
     * @param file
     * @return boolean
     */
    public static boolean deleteFile(final String file) {
        File dest = new File(file);
        if (!dest.exists() || dest.isDirectory())
            return false;
        return dest.delete();
    }

    /**
     * Deletes all files in directory dir.
     *
     * @param dir
     * @return Number of delete files.
     */
    public static int deleteDirecoryContent(final String dir) {
        int cnt = 0;
        if (dir == null)
            return 0;
        File directory = new File(dir);
        if (!directory.isDirectory() || !directory.exists())
            return 0;
        String[] list = directory.list();
        String seperator = getSystemFileSeperator();
        for (String file : list) {
            if (deleteFile(directory.getAbsolutePath() + seperator + file))
                cnt++;
        }
        return cnt;
    }


}
```
Die Klasse TextResource könnte Dir vielleicht helfen.


----------



## it_is_all (25. Jul 2017)

Hilft mir wenig die 1000 Zeilen Code 
Hab mich bissel eingelesen in TextResource (Danke)...
Und wie bekomme ich das hin, dass ein Text in 200 Zeichen-Einheiten zerlegt wird?
MFG


----------



## Blender3D (26. Jul 2017)

TextResource baut ein FileSystem auf. Du hast eine Datalocation .
z.B, TextResource  tR = new TextResource( "./data" );
mittels

tR.add( "raum1", "Mein Text  Nr0" );
tR.add( "raum1", "Mein Text Nr1" );
...
tR.add( "raum2", "Mein Text Nr0" );
tR.add( "raum2", "Mein Text ist hier Nr1" );
...
Baust Du Dir Deine Texte auf.
mittels
String text = tR.get( "raum2", 1 );
---> text = "Mein Text ist hier Nr1"
kannst Du die Texte wieder beziehen.
Im Prinzip  wird ein File erzeugt das die Texte Zeilenweise beinhaltet.
Für Zeilenumbrüche verwende einfach eine Steuerzeichen das Du selbst auswertest.
z.B. "Zeile1|Zeile 2|Zeile 3"
so kannst Du für Dein Advendure für jeden Raum Deine Texte abspeichern und verwalten.
Der Vorteil ein Text der nur 5 Zeichen benötigt braucht nur 5 Zeichen. Wenn Du mehr als 300 Zeichen brauchst geht das auch.


----------



## it_is_all (26. Jul 2017)

Wirklich danke für die Hilfe!
Aber: Das ist alles viel zu kompliziert!

Mach jetzt mit Scanner und split()....
Peace


----------

