Pollimine

Kasutaja sisendit saab kõige lihtsamini kätte sisendseadmete pollimisega. Mõned olulisemad meetodid:

  • Gdx.input.isTouched() tagastab true kui kasutaja klõpsab hiirega aknale. Töötab ka puutetundlike ekraanide puhul

  • Gdx.input.getX() tagastab hiireklõpsu või ekraanipuudutuse x-koordinaadi

  • Gdx.input.getY() tagastab hiireklõpsu või ekraanipuudutuse y-koordinaadi. NB! OpenGL puhul on y-koordinaadi väärtus 0 hoopis ekraani alumises servas, mistõttu tuleb korrektseks asukoha määramiseks lahutada hiireklõpsu y-koordinaat akna kõrgusest: Gdx.graphics.getHeight() - Gdx.input.getY()

  • Gdx.input.isKeyPressed() tagastab, kas etteantud klaviatuuri klahvi vajutatakse. Näiteks Gdx.input.isKeyPressed(Input.Keys.W) kontrollib, kas W klahvi hoitakse praegu all.

Rohkem infot Wikis

Asenda kood järgnevaga ja proovi nii hiire klõpsu kui ka WASD klahve:

package ee.taltech.iti0301.libgdxdemo;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;

public class libgdxDemo extends ApplicationAdapter {
    ShapeRenderer shapeRenderer;

    float circleX = 200;
    float circleY = 100;

    @Override
    public void create() {
        shapeRenderer = new ShapeRenderer();
    }

    @Override
    public void render() {

        if (Gdx.input.isTouched()) {
            circleX = Gdx.input.getX();
            circleY = Gdx.graphics.getHeight() - Gdx.input.getY();
        }

        if(Gdx.input.isKeyPressed(Input.Keys.W)){
            circleY++;
        }
        else if(Gdx.input.isKeyPressed(Input.Keys.S)){
            circleY--;
        }

        if(Gdx.input.isKeyPressed(Input.Keys.A)){
            circleX--;
        }
        else if(Gdx.input.isKeyPressed(Input.Keys.D)){
            circleX++;
        }

        Gdx.gl.glClearColor(.25f, .25f, .25f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
        shapeRenderer.setColor(0, 1, 0, 1);
        shapeRenderer.circle(circleX, circleY, 75);
        shapeRenderer.end();
    }

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

|Liigutatav ring|

Pollimine reaalses mängus

Eelmises näites saime kasutaja sisendi otse kätte pollimise abil. Päris mängudes ei kasutata pollimist ainult selleks, et liigutada kujundeid. Tavaliselt muudetakse sisend konkreetseteks mängutoiminguteks, nt liikumiseks või tulistamiseks, ning need saadetakse edasi serverile.

Alljärgnevas näites pollitakse klaviatuuri sisendit ja saadetakse vastav sõnum serverisse (PlayerMovementMessage). Terve projekti saate vaadata siin.

/**
* Kuulab kasutaja sisendit GameScreenis ja saadab
* liikumise/laskmise sõnumid serverile.
*/
public class PlayerInputManager {

    public void handleMovementInput() {
        var movementMessage = new PlayerMovementMessage();

        if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.A)) {
            movementMessage.setDirection(Direction.LEFT);
        } else if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.D)) {
            movementMessage.setDirection(Direction.RIGHT);
        } else if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.W)) {
            movementMessage.setDirection(Direction.UP);
        } else if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.S)) {
            movementMessage.setDirection(Direction.DOWN);
        }

        if (movementMessage.getDirection() != null) {
            ServerConnection
                .getInstance()
                .getClient()
                .sendUDP(movementMessage);
        }
    }

Tulistamissisendi töötlemine

Meetod handleShootingInput() kontrollib, millist nooleklahvi (ÜLES, ALLA, VASAKULE, PAREMALE) vajutatakse, ning seab selle suuna PlayerShootingMessage (server) objekti. Kui suund on määratud, saadetakse sõnum serverile.

    /**
    * Töötleb mängija tulistamissisendit.
    *
    * See meetod kontrollib, millist nooleklahvi (ÜLES, ALLA, VASAKULE, PAREMALE) vajutatakse,
    * ning seab suuna PlayerShootingMessage objekti. Kui suund on määratud,
    * saadetakse see sõnum UDP kaudu serverisse.
    */
    public void handleShootingInput() {
        var shootingMessage = new PlayerShootingMessage();

        if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.LEFT)) {
           shootingMessage.setDirection(Direction.LEFT);
        } else if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.RIGHT)) {
           shootingMessage.setDirection(Direction.RIGHT);
        } else if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.UP)) {
           shootingMessage.setDirection(Direction.UP);
        } else if (Gdx.input.isKeyPressed(com.badlogic.gdx.Input.Keys.DOWN)) {
           shootingMessage.setDirection(Direction.DOWN);
        }

        if (shootingMessage.getDirection() != null) {
           ServerConnection
               .getInstance()
               .getClient()
               .sendUDP(shootingMessage);
        }
    }
}

Sisendi töötlemine

Gdx.input.isKeyPressed meetodi abil saab kontrollida, millist klahvi mängija parasjagu vajutab. Selle põhjal tehakse mängus vastavad tegevused, nt liikumine või tulistamine.

Liikumine

Kui vajutatakse W , A , S või D klahvi, luuakse liikumissõnum, mis sisaldab liikumissuunda. See sõnum saadetakse serverile, kus seda kasutatakse mängija asukoha muutmiseks.

Tulistamine

Kui vajutatakse nooleklahvi, luuakse tulistamissõnum, mis sisaldab tulistamissuunda. Ka see sõnum saadetakse serverile, mis seejärel käivitab tulistamise vastavas suunas.

Serveriga suhtlus

Sõnum saadetakse serverisse järgmise käsuga: ServerConnection.getInstance().getClient().sendUDP(message) Server saab selle sõnumi ja käivitab vastava tegevuse, nt liigutab mängijat või käivitab tulistamise.

Mänguloogika

Mängudes ei tohi kasutaja sisendi põhjal toiminguid kohe kliendipoolsel rakendusel teha (nt liigutada tegelasi või muuta olekuid). Selle asemel tuleb sisend muuta konkreetseks sõnumiks, mis saadetakse serverile.

Selline lähenemine tagab, et mänguloogika jääb serveripõhiseks. Tänu sellele saab mängu lihtsamalt hallata, testida ja mitme mängijaga mängudes kõikide tegevusi sünkroonis hoida.