libGDX: Как читать и отображать текст из файла .txt построчно после нажатия клавиши? - PullRequest
0 голосов
/ 09 сентября 2018

Я новичок в Java и пытаюсь создать игру типа Visual Novel. То, что я пытаюсь сделать, это отображать текст из текстового файла построчно, нажимая клавишу пробела, как в обычном романе. Я пропустил разные методы, но у меня ничего не получается. Я знаю, что есть Scanner и BufferedReader, но подходят ли они для того, что я делаю? Прямо сейчас все, что происходит, когда я нажимаю «пробел», весь текст появляется на экране, а когда я отпускаю, он исчезает.

Это мой игровой класс:

public class NovelGame extends Game {

public static final int WIDTH = 1366;
public static final int HEIGHT = 768;

public SpriteBatch batch;
public String txtFileString;
public String lines[];
public BitmapFont bitmapFont;


@Override
public void create () {
    batch = new SpriteBatch();
    bitmapFont = new BitmapFont();
    this.setScreen(new MainMenuScreen(this));
    txtFileString = Gdx.files.internal("script.txt").readString();
    String[] anArray = txtFileString.split("\\r?\\n");}



@Override
public void render () {
    super.render();
}}

Это мой класс экрана игры:

public class MainGameScreen implements Screen{

    private Texture img;

    NovelGame game;

    public MainGameScreen (NovelGame game) {
        this.game = game;
    }

    @Override
    public void show() {
        img = new Texture("bck.jpg");

    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // This cryptic line clears the screen.
        game.batch.begin();
        game.batch.draw(img, 0, 0);
        if(Gdx.input.isKeyPressed(Input.Keys.SPACE)){
        game.bitmapFont.draw(game.batch, game.txtFileString,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
        }
        game.batch.end();

    }

У меня была идея показать его, используя while и if, но я не могу точно понять, как это сделать.

РЕДАКТИРОВАТЬ: Я нашел способ отображения текста, но теперь, когда я запускаю свою игру, она начинает бесконечно накапливать один на другой после нажатия пробела.

Код:

public class MainGameScreen implements Screen{

private Texture img;    
NovelGame game;

public MainGameScreen (NovelGame game) {
    this.game = game;
}

@Override
public void show() {
    img = new Texture("bck.jpg");


}

@Override
public void render(float delta) {

    try {
        BufferedReader br = new BufferedReader (new FileReader("C:\\Users\\hydra\\Documents\\JAVA_PROJECTS\\gamespace\\core\\assets\\startd.txt")); 

        while((game.strLine = br.readLine()) != null){
            game.list.add(game.strLine);
     }
        br.close();

     } catch (IOException e) {
         System.err.println("Unable to read the file.");
    }

    if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE)){
        game.showText = true;
    }

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // This cryptic line clears the screen.
    game.batch.begin();
    game.batch.draw(img, 0, 0);


             if(game.showText) {
                 for(int i = 0; i < game.list.size(); i++) {
                System.out.println(game.list.get(i));    
                game.bitmapFont.draw(game.batch, game.list.get(i), 100, 50);
             }
            }

    game.batch.end();


}       

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Я узнал, что я делал неправильно в конце. Я поместил все в метод рендеринга, и поэтому файл читался бесконечно. Мне нужно сделать это только один раз в классе конструктора, а затем поместить его в метод рендеринга.

0 голосов
/ 09 сентября 2018

Проблема здесь. Gdx.input.isKeyPressed возвращает true, если в данный момент нажата только клавиша.

if(Gdx.input.isKeyPressed(Input.Keys.SPACE)){
    game.bitmapFont.draw(game.batch, game.txtFileString,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
}

Чтобы исправить это, добавьте логический флаг, активируйте его только после нажатия клавиши:

if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE)){
    showText = true;
}

А в методе рендеринга:

if (showText) {
   game.bitmapFont.draw(game.batch, game.txtFileString,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
}
...