Näita lobby

images/naita.png

Hoia muutujad

Selleks, et näidata lobbid, peame hoidma järgmised muutujaid

LobbiesListScreen.java

private Table lobbies;
private Map<Integer, Table> lobbyActors = new HashMap<>();

* lobbies tabel hakkab hoidma endas toimijad. Ja lobbyActors kujutis on selleks, et oleks lihtsam leida need toimijaid ja kustutada neid.

Küsi lobbyd

Pärast seda, kui sa said LobbiesListScreen, küsi serverilt näidata lobbid

LobbiesListScreen.java

@Override
protected void createInterface() {
    ...
    ClientLauncher.getInstance().sendUDP(new GetLobbiesPacket());
}

GetLobbiesPacket.java

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class GetLobbiesPacket implements Packet {

    private Map<Integer, Lobby> lobbies;
}

*Kui me saadame serverile päringut, siis me saadame tühja paketti, vastuseks saame sama paketti, aga juba koos lobbidega

Päringu töötlemine serveris

ServerListener.java

@Override
public void received(Connection connection, Object object) {
    switch (object) {
        ...
        case GetLobbiesPacket packet ->
                ServerLauncher.getInstance().getGame().getLobbies(connection.getID());
        ...
    }
}

Game.java

public void getLobbies(int id) {
    ServerLauncher.getInstance().sendToUDP(id, new GetLobbiesPacket(lobbies));
}

Koodi värskendamine

Nüüd on vaja natuke muuta meie koodi. Täpsemalt, värskendame createLobby koodi. Pärast lobbi loomist saadame kõikidele lobbi otsijatele uue lobbi.

public void createLobby(int id) {
    ...
    ServerLauncher.getInstance().sendToAllExceptUDP(id, new GetLobbiesPacket(lobbies));
}

Optimiseerimine

Praegu saadetakse paketti kõigidele mängijatele välja arvatud mängija kes lõi uue lobbi. Selleks, et seda optimiseerida, saaks lisada mängijale uue muutuja, mis hoiaks tema oleku ja kui olek oleks näiteks State.SEARCH siis saata temale paketti.

Vastuse töötlemine kliendil

ClientListener.java

@Override
public void received(Connection connection, Object object) {
    switch (object) {
        ...
        case GetLobbiesPacket packet ->
                Main.getInstance().updateLobbies(packet.getLobbies());
        ...
    }
}

Esialgus vaatame kas mängija on praegu LobbiesListScreen ekraanil, et vältida vigu ja siis lisame uue lobbi ekraanile.

Main.java

public void updateLobbies(Map<Integer, Lobby> lobbies) {
    if (getScreen() instanceof LobbiesListScreen lobbiesListScreen) {
        lobbiesListScreen.clearLobbies();
        for (Lobby lobby : lobbies.values()) {
            lobbiesListScreen.addLobby(lobby);
        }
    }
}

LobbiesListScreen.java

private Table lobbies;
private final Map<Integer, Table> lobbyActors = new HashMap<>();

public void addLobby(Lobby lobby) {
    TextButton lobbyButton = new TextButton(lobby.getName(), skin);
    lobbies.add(lobbyButton).expandX().fillX();
    lobbies.row();
    lobbyActors.put(lobby.getId(), lobbyButton);
}

public void removeLobby(int lobbyId) {
    Table lobby = lobbyActors.remove(lobbyId);
    lobbies.removeActor(lobby);
}

public void clearLobbies() {
    lobbies.clear();
    lobbyActors.clear();
}