Näita lobby¶
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();
}