Uue lobby loomine

Järgmiseks etappiks realiseerime lobbide loomine.

images/loo.png

Lisa lobby class

Loo lobby klass shared kaustas.

Lobby.java

@Getter
@NoArgsConstructor
public class Lobby {

    private static int nextId = 0;

    private int id;
    private String name;
    private Map<Integer, Player> players;

    public Lobby(Player player) {
        this.id = nextId++;
        this.name = generateLobbyName(player);
        this.players = new HashMap<>();
        joinLobby(player);
    }

    public void joinLobby(Player player) {
        players.put(player.getId(), player);
    }

    private String generateLobbyName(Player player) {
        return String.format("%s's lobby", player.getName());
    }
}

Töötle nupu vajutamist

LobbiesListScreen.java

@Override
protected void createInterface() {
   ...
   TextButton addLobbyButton = new TextButton("Add Lobby", skin);
   addLobbyButton.addListener(new CreateLobbyClickListener());
   ...
}

CreateLobbyClickListener.java

public class CreateLobbyClickListener extends ClickListener {

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

Saadame lihtsalt tühja CreateLobbyPacket, sest meile polegi midagi vaja välja arvatud mängija ID, mida me saame koos päringuga vaikimisi.

CreateLobbyPacket.java

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class CreateLobbyPacket {

    private Lobby lobby;
}

*Hoiame lobby muutuja vastuseks serverilt. Kuid päringuks saadame tühja paketti

Päringu töötlemine serveris

ServerListener.java

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

Lisame uue kujutise lobbideks, et hoida neid serveril.

Game.java

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

public void createLobby(int id) {
    Player player = players.get(id);
    Lobby lobby = new Lobby(player);
    lobbies.put(lobby.getId(), lobby);
    ServerLauncher.getInstance().sendToUDP(id, new CreateLobbyPacket(lobby));
}

Vastuse töötlemine kliendis

ClientListener.java

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

Main.java

public void joinLobby(Lobby lobby) {
    currentLobby = lobby;
    Gdx.app.postRunnable(new SetScreenRunnable(new LobbyScreen(currentLobby)));
}