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