Как отобразить итоговый и высокий балл на экране игры? - PullRequest
2 голосов
/ 17 февраля 2020

Я использую libgdx и пытаюсь выяснить, как отобразить итоговый счет, которого достигли мои игроки, и общий высокий балл за их игры, когда игра переходит в игру поверх экрана. Я не уверен, как перенести целое число очков с экрана игры на экран игры.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вариант 1. Сохранение рекордов с использованием настроек

Я думаю, вы хотите закрыть игру (закрыть окно или убить приложение) и сохранить рекорды в следующий раз, когда кто-нибудь сыграет игра (запускает игру или открывает приложение).

В этом случае предпочтения - это путь к go, и вот простой пример:

Класс игры

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences;

public class PreferenceExample extends Game {

    @Override
    public void create() {
        // Initialize the preferences
        Preferences preferences = Gdx.app.getPreferences("examplePreferences");
        // Go to your game screen sending this LibGDX Game and the LibGDX Preferences
        setScreen(new GameScreen(this, preferences));
    }
}

Игра класс экрана

import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.ScreenAdapter;

class GameScreen extends ScreenAdapter {

    private PreferenceExample game;
    private Preferences preferences;

    GameScreen(PreferenceExample game, Preferences preferences) {
        // Store reference to LibGDX Game
        this.game = game;
        // Store reference to LibGDX Preferences
        this.preferences = preferences;
    }

    @Override
    public void render(float delta) {
        if (Gdx.input.isKeyJustPressed(Input.Keys.L)) {
            saveHighScore(MathUtils.random(3));
            goToGameOverScreen();
        }
    }

    // Call this whenever you want to save the high score
    private void saveHighScore(int highScore) {
        preferences.putInteger("High score", highScore);
        preferences.flush();
    }

    // Call this whenever you want to switch to the game over screen
    private void goToGameOverScreen() {
        game.setScreen(new GameOverScreen(preferences));
    }
}

Класс игры поверх экрана

import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.ScreenAdapter;

class GameOverScreen extends ScreenAdapter {

    private Preferences preferences;
    private int highScore;

    GameOverScreen(Preferences preferences) {
        // Store reference to LibGDX Preferences
        this.preferences = preferences;
    }

    @Override
    public void show() {
        // Load high score, default value is 0 in case you didn't store it properly
        highScore = preferences.getInteger("High score", 0);
    }

    @Override
    public void render(float delta) {
        // Do something with the high score you retrieved
        System.out.println(highScore);
    }
}

Предупреждение : помните, что методы хранения и извлечения из Preferences чувствительны к регистру, поэтому рекомендуется поместить String со ссылкой на значение переменной, чтобы минимизировать ошибки.

Вариант 2. Передача высокого балла между экранами

Возможно, вы не Не нужно хранить рекорды, когда игра закрыта, поэтому передача информации о рекордах с одного экрана на другой должна быть проще, вот пример:

Класс игры

import com.badlogic.gdx.Game;

public class ScreenToScreenExample extends Game {

    @Override
    public void create() {
        // Go to your game screen sending this LibGDX Game and the LibGDX Preferences
        setScreen(new GameScreen(this));
    }
}

Класс игрового экрана

import com.badlogic.gdx.ScreenAdapter;

class GameScreen extends ScreenAdapter {

    private ScreenToScreenExample game;
    private int highScore;

    GameScreen(ScreenToScreenExample game) {
        // Store reference to LibGDX Game
        this.game = game;
    }

    // Call this whenever you want to save the high score
    void saveHighScore(int highScore) {
        this.highScore = highScore;
    }

    // Call this whenever you want to switch to the game over screen
    void goToGameOverScreen() {
        game.setScreen(new GameOverScreen(highScore));
    }
}

Класс игрового экрана

import com.badlogic.gdx.ScreenAdapter;

class GameOverScreen extends ScreenAdapter {

    private int highScore;

    GameOverScreen(int highScore) {
        this.highScore = highScore;
    }

    @Override
    public void render(float delta) {
        // Do something with the high score you retrieved
        System.out.println(highScore);
    }
}
0 голосов
/ 17 февраля 2020

Это, вероятно, не лучший способ, но вы можете сохранить счет в основном классе, который расширяется Game.

import com.badlogic.gdx.Game;

public class MyGame extends Game {
    private int score;

    // Add getters and setters
}

Тогда в ваших классах экрана вы можете сделать:

MyGame myGame = (MyGame) Gdx.app.getApplicationListener();
// Then you can set
myGame.setScore(score);
// or get the score
int score = myGame.getScore();

Если у вас есть несколько значений для хранения, вы можете создать класс и сохранить его экземпляр в своем классе MyGame. Вы поместите score и другие свойства в этот класс.

Вы также можете создать метод stati c в классе MyGame, который выполнит приведение для вас:

public static MyGame get() {
    return (MyGame) Gdx.app.getApplicationListener();
}

Тогда вы можете сделать MyGame.get().setScore(score); или: int score = MyGame.get().getScore();

...