Edetabel

Edetabeli loomine

Edetabeli peamine eesmärk on anda mängijale ülevaade mängu hetkeseisust. See võib kuvada näiteks mängijate punktiskoori, meeskondade võite-kaotusi või team deathmatch režiimis mängijate tapmiste ja surmade suhet. Edetabel on oluline osa kasutajaliidesest (UI), mis aitab mängijatel oma progressi ja positsiooni teistega võrrelda.

Tavaliselt kuvatakse edetabelit mängu ajal klahvivajutusega (näiteks Tab) või mänguvooru lõppedes.

Koodinäide

Leaderboard klass

package io.github.some_example_name.lwjgl3;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

import java.util.*;
import java.util.stream.Collectors;

public class Leaderboard {
    private boolean visible;
    private Map<String, Integer> playerScores; // Map mängijatest ja nende punktidest

    public Leaderboard() {
        this.visible = false;
        this.playerScores = new HashMap<>();

        // Ajutine näidiseks
        playerScores.put("Player1", 13);
        playerScores.put("Player2", 3);
        playerScores.put("Player3", 7);
        playerScores.put("Player4", 11);
    }

    // Muuda leaderboardi playerlisti
    public void setPlayerScores(Map<String, Integer> players) {
        playerScores.clear();
        playerScores.putAll(players);
    }

    // Muuda leaderboardi nähtavust
    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    // Rendering
    public void render(SpriteBatch spriteBatch, BitmapFont font) {
        if (this.visible) {
            int y = Gdx.graphics.getHeight() - 20;

            // Lihtne sorteerimine, reaalsuses võiks edetabeli andmed olla kättesaadavad Leaderboardile mujalt juba eelsorteerituna
            List<Map.Entry<String, Integer>> sortedScores = playerScores.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                .collect(Collectors.toList());

            for (Map.Entry<String, Integer> entry : sortedScores) {
                String playerName = entry.getKey();
                int points = entry.getValue();
                font.draw(spriteBatch, playerName, 20, y); // Nimi
                font.draw(spriteBatch, String.valueOf(points), 200, y); // Punktide arv
                // Siia saab veel lisada mängijate väärtusi
                y -= 20;
            }
        }
    }
}
  • setPlayerScores() uuendab playerScores uuele mappile.

  • setVisible() muudab UI nähtavust.

Mängu põhiklassis(ApplicationAdapter) on vaja luua Leaderboardi objekt ning ühendada Tab klahv nähtavuse muutmisega.

libgdxDemo.java

package io.github.some_example_name.lwjgl3;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.MathUtils;

public class libgdxDemo extends ApplicationAdapter {
    ShapeRenderer shapeRenderer;
    Leaderboard leaderboard; // Leaderboard klass
    SpriteBatch spriteBatch; // Spritebatch klass
    BitmapFont font; // Bitmap font

    float r = MathUtils.random();
    float g = MathUtils.random();
    float b = MathUtils.random();

    @Override
    public void create () {
        shapeRenderer = new ShapeRenderer();
        leaderboard = new Leaderboard(); // Loo leaderboard
        spriteBatch = new SpriteBatch(); // Loo spritebatch
        font = new BitmapFont(); // Loo font

        Gdx.input.setInputProcessor(new InputAdapter() {
            // Sisendi võtmine leaderboardi jaoks
            @Override
            public boolean keyDown(int keycode) {
                if (keycode == Input.Keys.TAB) {
                    leaderboard.setVisible(true);
                }
                return true;
            }

            @Override
            public boolean keyUp(int keycode) {
                if (keycode == Input.Keys.TAB) {
                    leaderboard.setVisible(false);
                }
                return true;
            }

            @Override
            public boolean keyTyped (char key) {
                r = MathUtils.random();
                g = MathUtils.random();
                b = MathUtils.random();
                return true;
            }

            @Override
            public boolean touchDown (int x, int y, int pointer, int button) {
                r = MathUtils.random();
                g = MathUtils.random();
                b = MathUtils.random();
                return true;
            }
        });
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(r, g, b, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // Spritebatchi renderdamine
        spriteBatch.begin();
        leaderboard.render(spriteBatch, font);
        spriteBatch.end();
    }

    @Override
    public void dispose () {
        shapeRenderer.dispose();
    }
}

Kuidas kood töötab?

  • Leaderboard klass hoiab endas mängijate nimesid ja punkte (playerScores) ning boolean-väärtust visible, mis määrab, kas edetabelit kuvatakse.

  • render() meetod joonistab edetabeli ekraanile ainult siis, kui visible on true. Enne joonistamist sorteeritakse mängijad punktide alusel.

  • libgdxDemo klass loob Leaderboard objekti.

  • InputAdapter seotakse mängu sisendiga, et Tab-klahvi all hoides muuta leaderboard.visible väärtust true ja klahvi vabastamisel false.

Mõtteid parendamiseks

Kuigi see kood töötab, pole see päris mängu jaoks optimaalne. Siin on mõned ideed, kuidas seda edasi arendada:

  • Andmetöötluse optimeerimine: Andmete sorteerimine render() meetodis on ebaefektiivne. Parem oleks andmeid sorteerida ainult siis, kui skoorid muutuvad, ja hoida sorteeritud nimekirja kuvamiseks valmis.

  • Scene2D teegi kasutamine: SpriteBatchi ja fikseeritud koordinaatide ("maagiliste numbrite") asemel võiks kasutada libGDX-i Scene2D.ui teeki. See võimaldab luua kasutajaliideseid tabelite ja muude elementidega, mis haldavad paigutust automaatselt ja kohanevad erinevate ekraanisuurustega.

  • Koodi head tavade jälgimine: Mängu andmed (nagu skoorid) võiksid asuda eraldi andmeklassis, mitte otse UI klassis. Leaderboard klassi ülesandeks jääks siis ainult andmete visualiseerimine.

  • InputMultiplexeri rakendamine: Kui mängu lisandub teisi interaktiivseid elemente, tuleks InputAdapteri asemel kasutada InputMultiplexerit, et hallata mitut sisendiallikat korraga.

Kasulikud lisamaterjalid

Scene2D.ui: Ametlik dokumentatsioon libGDX-i võimsa kasutajaliideste loomise teegi kohta. libGDX Wiki: Scene2D.ui

InputMultiplexer: Dokumentatsioon sisendite haldamise kohta, kui mängus on mitu komponenti. libGDX Wiki: Input Handling