Lobby sisenemine

images/sisenemine.png

Töötle ekraanis oleva lobbi vajutamist

JoinLobbyClickListener.java

@AllArgsConstructor
public class JoinLobbyClickListener extends ClickListener {

    private final int lobbyId;

    @Override
    public void clicked(InputEvent event, float x, float y) {
        ClientLauncher.getInstance().sendUDP(new JoinLobbyPacket(lobbyId));
    }
}

Lisame see listener iga lobbile.

LobbiesListScreen.java

public void addLobby(Lobby lobby) {
    TextButton lobbyButton = new TextButton(lobby.getName(), skin);
    lobbyButton.addListener(new JoinLobbyClickListener(lobby.getId()));
    ...
}

Päringu töötlemine serveris

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

Lisame mängija lobbisse ja saadame kõigidele mängijatele lobbis, et uus mängija sisenes.

Game.java

public void joinLobby(int id, int lobbyId) {
    Player player = players.get(id);
    Lobby lobby = lobbies.get(lobbyId);
    lobby.joinLobby(player);
    for (Player currentPlayer : lobby.getPlayers().values()) {
        ServerLauncher.getInstance().sendToUDP(currentPlayer.getId(), new PlayerJoinedLobbyPacket(player, lobby));
    }
}

PlayerJoinedLobbyPacket.java

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class PlayerJoinedLobbyPacket {

    private Player player;
    private Lobby lobby;
}

Vastuse töötlemine kliendis

Töötle vastust

ClientListener.java

@Override
public void received(Connection connection, Object object) {
    switch (object) {
        ....
        case PlayerJoinedLobbyPacket packet ->
                Main.getInstance().joinLobby(packet.getPlayer(), packet.getLobby());
        ...
    }
}

Koodi värskendamine

Main.java

public void joinLobby(Player player, Lobby lobby) {
    if (player.getId() == currentPlayer.getId()) {
        currentLobby = lobby;
        Gdx.app.postRunnable(new SetScreenRunnable(new LobbyScreen(currentLobby)));
    } else {
        if (getScreen() instanceof LobbyScreen lobbyScreen) {
            lobbyScreen.addPlayer(player);
        }
    }
}

LobbyScreen.java

private final Map<Integer, Actor> players = new HashMap<>();

public void addPlayer(Player player) {
    Label playerNameLabel = new Label(player.getName(), skin);
    playersTable.add(playerNameLabel).expandX().fillX();
    players.put(player.getId(), playerNameLabel);
    playersTable.row();
}

Ja kui mängija sisenes lobbisse, siis lisame teda kõigi mängijate ekraanidele.

LobbyScreen.java

@Override
protected void createInterface() {
    ...
    for (Player player : lobby.getPlayers().values()) {
        addPlayer(player);
    }
}