N-mängijate connection

(timestamp) N-mängijate connection:

27. Mitmete eksemplaride lubamine:

  • Mine Run / Debug Configurations

  • Vali sealt Edit Configurations...

  • Modify options alt vali Allow multiple instances

Mitmete eksemplaride lubamine (Allow multiple instances) tähendab seda, et saate oma arvutis panna käima mitu mängu korraga. Ilma selleta saate jooksutada vaid ühte korraga.

(timestamp) Serveri listeneri korral kasutage,

  • server.sendToAllUDP(object);

et saata teavet kõigile klientidele.

(timestamp) 28. Kliendi create meetodisse lisage listener, et vastu võtta andmeid serverilt:

client.addListener(new Listener.ThreadedListener(new Listener() {
    @Override
    public void received(Connection connection, Object object) {
        System.out.print("received: " + object);
    }
}));

Nüüd saadab server teavet igale connected kliendile.

(timestamp) Klientide eristamiseks kasutage serveris connectionide ID-sid ja haldage mänguobjekte ID-de ja koordinaatidega.

28. Serveri klassi lisage,

  • private Map<Integer, String> gameObjects = new HashMap<>();

et jälgida mänguobjekte.

29. Nüüd lisage see kood serveri listeneri received meetodi sisse:

if (object instanceof String) {
    gameObjects.put(connection.getID(), (String) object);
}
server.sendToAllUDP(gameObjects.entrySet().stream().map(entry -> entry.getKey() + ":" + entry.getValue()).collect(Collectors.joining("|")));

See kood saadab iga connected kliendi ID ja koordinaadid kõigile klientidele.

Teiste klientide nähtavaks muutmine

(timestamp) Teiste klientide nähtavaks muutmine:

Teise näitena teiste klientide nähtavaks muutmiseks kasutame LibGDX-i vara “drop.png”.

30. Kliendi klassi:

  • Lisa Texture opponentImg;

  • Initsialiseeri tekstuur create meetodis: opponentImg = new Texture("drop.png");

Disconnectioni käsitlemine

(timestamp) Disconnectioni käsitlemine:

31. Serveri listeneri korral ülekirjutage disconnected meetod ja eemaldage connected mängijad:

@Override
public void disconnected(Connection connection) {
    gameObjects.remove(connection.getID());
}

32. Muutke serveri edastusjoont serveri listeneri korral:

  • server.sendToAllUDP(gameObjects.entrySet().stream().map(entry -> entry.getKey() + ":" + entry.getValue()).collect(Collectors.joining("|")));

saab

  • server.sendToAllUDP(gameObjects);

Selgitus: Algne koodirida muudab enne saatmist andmed string formaati, et neid oleks lihtsam lugeda.

Uus koodirida saadab koju objekti ilma töötlemiseta, mis võimaldab paindlikumalt kasutada edastatud andmeid kliendi poolel.

Saadetud mänguobjektide käsitlemine kliendil

(timestamp) Saadetud mänguobjektide käsitlemine kliendil:

33. Loo vastaste SpriteBatchide jaoks kaardistus:

  • private Map<Integer, SpriteBatch> opponentBatches = new HashMap<>();

34. Lisage kaart vastu võetud mänguobjektide salvestamiseks kliendile:

  • private Map<Integer, String> receivedGameObjects = new HashMap<>();

35. Render meetodis käitle vastaste renderdamist järgmise koodiga:

for (Map.Entry<Integer, String> entry : receivedGameObjects.entrySet()) {
    int id = entry.getKey();
    if (id == clientId) continue;

    if (!opponentBatches.containsKey(id)) {
        opponentBatches.put(id, new SpriteBatch());
    }

    SpriteBatch b = opponentBatches.get(id);
    String[] coordinates = entry.getValue().split(",");
    b.begin();
    b.draw(opponentImg, Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]));
    b.end();
}

if (receivedGameObjects != null) {
    receivedGameObjects = null;
}

36. Kliendi klassis, lisage muutuja klient ID salvestamiseks:

  • private int clientId;

37. Määrake kliendi ID create meetodis:

  • clientId = client.getID();

38. Kliendi listeneri received meetodis salvestage saadud andmed receivedGameObjects:

if (object instanceof Map) {
    receivedGameObjects = (Map<Integer, String>) object;
}