Menüü¶
Ekraani loomine¶
Main menu ja ka igasuguste teiste screenide jaoks tuleks klassi implementeerida Screen
liides (interface).
Sellega lisanduvad meetodid nagu show()
, render()
, resize()
, pause()
, resume()
, hide()
ja dispose()
.
public class MenuScreen implements Screen {
private Stage stage;
private final Skin skin;
private SpriteBatch batch;
private ExtendViewport viewport;
public MenuScreen() {
// Constructor logic
}
@Override
public void render(float delta) {
// Called for rendering screen
}
@Override
public void resize(int width, int height) {
// Called when window has been resized
}
@Override
public void show() {
// Called when this screen becomes the current screen
}
@Override
public void hide() {
// Called when this screen is no longer the current screen
}
@Override
public void pause() {
// Called when the application is paused
}
@Override
public void resume() {
// Called when the application is resumed from paused state
}
@Override
public void dispose() {
// Clean up resources when the screen is no longer needed
}
}
Lisaks on vaja LibGDX poolt antud Scene2d, mis lihtsustab igasuguste mängu kasutajaliideste (UI), atribuute, mida meetodites kasutada nagu:
- Lava (
Stage
) - Mis hõlmab kõiki kasutajaliidese (UI) komponente nagu nupud, tabelid jms. Kasutus: Lood lava (
stage
), kuhu lisada oma ekraani komponendid.
- Lava (
Skin
- Vajalik UI (kasutajaliidese) komponentide stiili korrigeerimiseks. See pakub ressursse nagu erinevad tekstuurid, fontid, värvid ning ka muud visuaalsed vahendid.Kasutus:
Skin
-ile peab lisama kas JSON faili, texture atlase või muu stiili kohta sisaldavat infot ning edaspidi saab seda erinevate komponentide stiliseerimiseks kasutada.
SpriteBatch
- Tekstuuride, kujundite ja muu 2D-graafika “joonistamiseks” ekraanile. Oluline nt taustapiltide renderdamiseks.Kasutus: Defineerida
SpriteBatch
instance ja kasutuselrender()
meetodi sees.
- Vaateava (
Viewport
) - Pole otseselt vajalik, kuid väga soovitatav akna suuruse muutmiseks ja erinevateks kuvasuheteks (aspect ratio). Kasutus:
Viewport
luuakse ja antakse lavale (stage
) initsialiseerimise ajal.
- Vaateava (
Näide example-game'st¶
Järgnevas näites on TitleScreen
, mis rakendab Stage
ja Table
komponente menüü loomiseks.
Ekraanil on kaks nuppu: “Start” ja “Exit”. Nuppude kaudu saab kas mängu alustada või rakendusest väljuda.
/**
* TitleScreen represents the main menu of the game, where players can choose to start the game or exit.
* It listens for user input and directs user to different screens, for example TitleScreen -> GameScreen.
*/
public class TitleScreen extends ScreenAdapter {
private final Stage stage;
public TitleScreen(Game game) {
stage = new Stage();
// NB! important line - will make the stage listen for user input
// For example when this is not set no hover or click events will be triggered
Gdx.input.setInputProcessor(stage);
// menu buttons
var startButton = getButton(20, "Start", () -> {
// send a message to the server that the player wants to join the game
ServerConnection.getInstance().getClient().sendTCP(new GameJoinMessage());
game.setScreen(new GameScreen(game));
});
var exitButton = getButton(20, "Exit", () -> Gdx.app.exit());
// positioning the buttons. you can think of the following as a table (or flexbox) in HTML
var table = new Table();
table.setFillParent(true);
table.add(startButton).padBottom(20);
table.row();
table.add(exitButton);
stage.addActor(table);
}
/**
* Renders the TitleScreen, clearing it and drawing the buttons.
*
* @param delta time since last frame.
*/
@Override
public void render(float delta) {
super.render(delta);
// clear the screen
Gdx.gl.glClearColor(192 / 255f, 192 / 255f, 192 / 255f, 1); // to get that win 95 look
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// draw the buttons
stage.act(delta);
stage.draw();
}
@Override
public void resize(int width, int height) {
super.resize(width, height);
stage.getViewport().update(width, height, true);
}
}
Nagu näha, Stage
luuakse konstruktoris, Table
kasutatakse nuppude paigutamiseks,
ning render()
meetodis kutsutakse stage.act()
ja stage.draw()
. Lisaks määratakse
Gdx.input.setInputProcessor(stage)
, et Stage
saaks kasutaja sisendit vastu võtta.
Meetodid¶
show()
- Initsialiseerib hetkese ekraani koos lava (stage
), vaateava (viewport
), kasutajaliidese (UI) komponentide ja muuga. Kasulik oleks selle jaoks teha abistavaid meetodeid näiteks nuppude lisamiseks, muidu läheb meetod pikaks kui iga nupu konfiguratsioon sinna lisada. Näiteks:
@Override
public void show() {
viewport = new ExtendViewport(1280, 720);
stage = new Stage(viewport);
spriteBatch = new SpriteBatch();
backgroundTexture = new Texture(Gdx.files.internal("menubackground.jpg"))
// Table for the buttons visible on screen.
buttonTable = new Table();
buttonTable.setFillParent(true);
stage.addActor(buttonTable);
// Buttons and logic ... //
Gdx.input.setInputProcessor(stage);
render()
- Lähtestab hetkese ekraani, et järgmist joonistada. Vastutab igal kaadril (frame) ekraani, nuppude jne renderdamise eest, joonistabSpriteBatch
abil lava (stage
). Näiteks:
@Override
public void render(float delta) {
// clear the screen ready for next set of images to be drawn
Gdx.gl.glClearColor(.1f, .1f, .15f, 1); // screen color
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// Draw the background image
spriteBatch.setProjectionMatrix(stage.getCamera().combined);
spriteBatch.begin();
spriteBatch.draw(backgroundTexture, 0, 0, stage.getWidth(), stage.getHeight());
spriteBatch.end();
// tell our stage to do actions and draw itself
stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f));
stage.draw();
resize()
- Kutsutakse välja ekraani suuruse muutmisel ning värskendab lava (stage
) ja vaateava (viewport
) vastavalt uuele suurusele.pause()
- Kasutusel mängu ajal, et mängu peatada nt esc nuppu vajutades.resume()
- Meetod mängu jätkamiseks.hide()
- Saab kasutada selleks, kui ekraani enam ei kuvata, hea näiteks ressursside puhastamiseks või käimasolevate tegevuste peatamiseks.dispose()
- Kutsutakse välja kui seda ekraani pole enam vaja, nagu mängu kinnipanekul. Eemaldab kasutatavad ressursid, nagu tekstuurid, lavad (stage
) ja muu ehk tagab korraliku “puhastuse” selleks, et ei tekiks mälulekkeid või üleüldist ressursside raiskamist. Näiteks
@Override
public void dispose() {
stage.dispose();
backgroundTexture.dispose();
spriteBatch.dispose();
Gdx.input.setInputProcessor(null);
}