Kliendi kood käigupõhiseks virtuaalseks lauamänguks

Kõik Packetid ja Player klass, mida serveri repository's kasutasime on identsed kliendipoolsega. Vaid updatePosition meetod on kliendi klassis teistsugune.

public void updatePosition(float x, float y) {
        this.position.x = x;
        this.position.y = y;
}

MyClient klass

Loome MyClient klassi ChatServer klassiga suhtlemiseks. kui serveri pool oli kolm meetodit Event Listener'i all, siis kliendi pool on vaid received meetod, kuid siid väljaspool konstrukorit on siin klassis rohkem get ja set meetodeid.

Muutujad - private final Client client - private final int clientID - private boolean yourTurn = false - private boolean firstPlayer = false - private final HashMap<Integer, Player> playersId = new HashMap<>()

public MyClient(LobbyScreen lobbyScreen) {
    client = new Client();
    Network.register(client);

    client.addListener(new Listener.ThreadedListener(new Listener() {
    @Override
    public void received(Connection connection, Object object) {
        if (object instanceof ConnectionPacket pkg) {
            Player Player = new Player();
            Player.setId(pkg.getId());
            playersId.put(pkg.getId(), Player);
        }
        if (object instanceof PositionPacket pkg) {
            Player player = playersId.get(pkg.getId());
            if (player != null) {
                ee.taltech.mygdxgame.packets.Vector2 vector2 = pkg.getVector2();
                float x = vector2.x;
                float y = vector2.y;
                player.updatePosition(x, y);
            }
        }
        if (object instanceof ScorePacket pkg) {
            int score = pkg.score;
            int id = pkg.id;

            Player player = playersId.get(id);
            player.setCurrentPoints(score);
        }
        if (object instanceof CurrentActivePlayerPacket pkg) {
            yourTurn = clientID == pkg.getId();
        }
    }
}));
client.start();

try {
    client.connect(5000, "193.40.255.27", 8080, 8081);
} catch (IOException e) {
    throw new RuntimeException(e);
}
clientID = client.getID();
}
public int getID() {
    return client.getID();
}
public void sendUDP(Object object) {
    client.sendUDP(object);
}
public void sendTCP(Object object) {
    client.sendTCP(object);
}
public Map<Integer, Player> getPlayersId() {
    return playersId;
}
public boolean isYourTurn() {
    return yourTurn;
}
public Client getClient() {
    return client;
}

Põhimängu klass

Mängijate positsiooni uuendamine ja joonistamine toimub mängu põhiklassis. Kõigepealt on vaja muutujat private Map<int, Player> playersId.

Meil on vaja render meetodis enne mängija käiku (ehk enne batch.begin()) mängija asukohta uuendada, saates PositionPacketi.

if (client.getPlayersId().size() > 0) {
    client.getPlayersId().get(clientID).setPosition(this.x, this.y);
    PositionPacket positionPacket = new PositionPacket();
    positionPacket.setId(clientID);
    positionPacket.setVector2(new ee.taltech.mygdxgame.packets.Vector2(this.x, this.y));
    client.sendUDP(positionPacket);
}

Peale mängija käiguvalikut on vaja saata ScorePacket.

ScorePacket scorePkg = new ScorePacket();
scorePkg.id = clientID;
scorePkg.score = 0;
getClient().sendTCP(scorePkg);

Järgmisena saab kõiki mängijaid luua, andes neule uue positsiooni Player klassi meetodi kaudu (järgnevas koodis on kahe mängija ja solo-player positsiooni uuendamise näide).

for (Map.Entry<Integer, Player> entry : client.getPlayersId().entrySet()) {
    int id = entry.getKey();
    Player player = entry.getValue();

    float playerX = client.getPlayersId().get(id).getPosition().x;
    float playerY = client.getPlayersId().get(id).getPosition().y;
    if (client.getPlayersId().size() == 2) {
        player = new Player();
        player.setTexture(pic2);
        player.setPosition(new Vector2(playerX, playerY));
    } else {
        player.updatePosition(playerX, playerY);
        player.setTexture(pic1);
    }
}

Siis saame mängijaid joonistama hakata nende asukoha järgi.

batch.begin();
for (Player player : client.getPlayersId().values()) {
Vector2 playerPosition = player.getPosition();
    if (client.getPlayersId() == 1) {
        batch.draw(pic1, playerPosition.x, playerPosition.y);
    }
    if (client.getPlayersId() == 2) {
        batch.draw(pic2, playerPosition.x, playerPosition.y);
    }
}
batch.end()

PS! Hetkel joonistame render meetodis mängijad iga kord uuesti Texture (PNG) järgi. Protsessori-sõbralikum oleks:

  1. Luua üks Atlas-fail kõigi karakterivalikute Texture'itega.

  2. Lobby Screenil teha (Event) ChangeListener, mis vahetab Actor'eid mängija karakterivaliku järgi.

  3. Teha Sprite'i päriv klass, kus super märgusõnaga konstruktoris saab Atlas-failist leida valitud karakteri screen.getAtlas().findRegion()'iga.

  4. Main klassis teha SpriteBatchile muutuja.

  5. Siis saame peamise mänguklassi render'is kõiki mängijaid joonistada üherealise koodiga: main.getPlayers().getValue().getSprite().draw(main.getBatch()).