Как сохранить высокий балл в LIBGDX

#javascript #java #android #android-studio

Вопрос:

 public class spacegame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture background;
    Texture ship;
    Texture gameover;



    float shipY = 0;
    float velocity = 0;
    int gamestate=0;
    float gravity = 2;
    int highscore;
    int score = 0;
    int scoringrock = 0;

    BitmapFont font;

    Circle shiprectangel ;
    // ShapeRenderer shapeRenderer ;

    Rectangle[] rockrectangle;

    float gap = 450;
    float maxrockoffset;
    Random randomgenerator;

    float rockvelocity = 8;

    int numberofrocks = 4;
    float[] rockX = new float[ numberofrocks];
    float[] rockoffset = new float[numberofrocks];
    float distancebetweenrocks;

    Texture rock;
    Texture rock2;

    @Override
    public void create () {
        batch=new SpriteBatch();
        background=new Texture("background.png");
        ship = new Texture("ship.png");
        rock = new Texture("rock.png");
        rock2 = new Texture("rock2.png");
        shiprectangel = new Circle();
    //  shapeRenderer = new ShapeRenderer();
        rockrectangle = new Rectangle[numberofrocks];
        gameover = new Texture("gameover.png");

        font = new BitmapFont();
        font.setColor(Color.RED);
        font.getData().setScale(10);

        maxrockoffset = Gdx.graphics.getHeight() / 2 - gap / 2 - 100;
        randomgenerator = new Random();
        distancebetweenrocks = Gdx.graphics.getWidth() * 3/5;




            startgame();


    }

    public  void startgame() {

        shipY=Gdx.graphics.getHeight() / 2 - ship.getHeight() / 2;

        for (int i = 0 ; i < numberofrocks; i  ) {


            rockoffset[i] = (randomgenerator.nextFloat() - 1.5f) * (Gdx.graphics.getHeight() - gap 
       - 400);
            rockX[i] = Gdx.graphics.getWidth() / 2 - rock.getWidth() / 2   Gdx.graphics.getWidth() 
         i * distancebetweenrocks;

            rockrectangle[i] = new Rectangle();


        }

    }

    @Override
    public void render () {

        batch.begin();
        batch.draw(background, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        



        if (gamestate == 1) {




            if (rockX[scoringrock] < Gdx.graphics.getWidth() / 2) {

                score  ;

                Gdx.app.log("score", String.valueOf(score));

                if (scoringrock < numberofrocks - 1) {

                    scoringrock  ;

                }else{

                    scoringrock = 0;

                }
            }





            if (Gdx.input.isTouched()) {


                velocity = -30;


            }

            for (int i = 0 ; i < numberofrocks; i  ) {


                if (rockX[i] < - rock.getWidth()) {

                    rockX[i]  = numberofrocks *distancebetweenrocks;
                    rockoffset[i] = (randomgenerator.nextFloat() - 1.5f) * 
       (Gdx.graphics.getHeight() - gap - 200);

                }else {

                    rockX[i] =  rockX[i] - rockvelocity;



                }

                rockX[i]=rockX[i] - rockvelocity;

                batch.draw(ship, Gdx.graphics.getWidth() / 2 - ship.getWidth(), shipY);
                font.draw(batch,String.valueOf(score), 100,1000);

                batch.draw(rock, rockX[i], Gdx.graphics.getHeight() / 2   gap / 3   
      rockoffset[i]);
                //  batch.draw(rock2, Gdx.graphics.getWidth() / 2 - rock2.getWidth() / 
      2,Gdx.graphics.getHeight() /2 - gap / 2 - rock2.getHeight()   rockoffset);


                rockrectangle[i] = new Rectangle(rockX[i],Gdx.graphics.getHeight() / 2   gap / 3   
      rockoffset[i], rock.getWidth(), rock.getHeight());

            }

            if (score > highscore) {

                highscore = score;

            }


            if (shipY > 0 ) {

                velocity = velocity   gravity;
                shipY-=velocity;

            }else {

                gamestate = 2;
            }

        }else  if (gamestate == 0){


            font.draw(batch,String.valueOf(highscore), 100, 1000);
            if (Gdx.input.justTouched()) {

                gamestate = 1;


            }

        } else if (gamestate == 2){

            batch.draw(gameover,Gdx.graphics.getWidth() / 2 - gameover.getWidth() /2 
      ,Gdx.graphics.getHeight() / 2 - gameover.getHeight() /2 );
            font.draw(batch,String.valueOf(highscore), 100, 1000);


            if (Gdx.input.justTouched()) {

                gamestate = 1;
                startgame();
                score =0;
                scoringrock =0;
                velocity = 0;
            }
        }










    //  shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    //  shapeRenderer.setColor(Color.RED);

        shiprectangel.set(Gdx.graphics.getWidth() * 1/2, shipY   ship.getHeight() / 
    2,ship.getWidth() * 3/7);

    //  shapeRenderer.circle(shiprectangel.x,shiprectangel.y,shiprectangel.radius);


        for (int i = 0 ; i < numberofrocks; i  ) {


        //shapeRenderer.rect(rockX[i],Gdx.graphics.getHeight() / 2   gap / 3   rockoffset[i], 
       rock.getWidth(), rock.getHeight());


        if (Intersector.overlaps(shiprectangel, rockrectangle[i])) {

            gamestate = 2;


        }



        }
        //  shapeRenderer.end();
        batch.end();
    }


}
 

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

Ответ №1:

Используйте экземпляр настроек. Смотрите здесь

https://www.programmersought.com/article/3503962478/

 Preferences prefs = Gdx.app.getPreferences("Highscore");
prefs.putInteger("highscore", 10);
prefs.flush();
int highScore = prefs.getInteger("highscore",0);//0 is default for first run
 

Комментарии:

1. В методе create() считайте значение рекордов по умолчанию равным 0 (поскольку оно изначально не воспроизводилось). Во время игрового процесса вы уже работаете с полем рекордов. Поместите постоянство в метод pause () (который вы в настоящее время не используете) ApplicationAdapter (как и для некоторых целей, таких как Android, вы не обязательно знаете, когда приложение закрыто, но вы знаете, когда оно приостановлено). Пожалуйста, отметьте ответ как принятый, если все в порядке.