Real Time Multiplayer: Double zwischen Clients austauschen?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Real Time Multiplayer: Double zwischen Clients austauschen?

    Hey,
    ich wollte gerade mit dem von Android vorgeschlagenem Code ein Double Wert zwischen mehreren Geräten, die mit Real TIme Multiplayer verbunden sind, austauschen. Dafür wollte ich es wie folgt umprogrammieren

    Quellcode

    1. void sendToAllReliably(double[] message) {
    2. for (String participantId : mRoom.getParticipantIds()) {
    3. if (!participantId.equals(mMyParticipantId)) {
    4. Task<Integer> task = Games.
    5. getRealTimeMultiplayerClient(this, GoogleSignIn.getLastSignedInAccount(this))
    6. .sendReliableMessage(message, mRoom.getRoomId(), participantId,
    7. handleMessageSentCallback).addOnCompleteListener(new OnCompleteListener<Integer>() {
    8. @Override
    9. public void onComplete(@NonNull Task<Integer> task) {
    10. // Keep track of which messages are sent, if desired.
    11. recordMessageToken(task.getResult());
    12. }
    13. });
    14. }
    15. }
    16. }
    Alles anzeigen
    Leider kommt dann bei dem message von .sendReliableMessage... folgender Fehler:
    Wrong 1st argument tpe. Found 'double[]', required: 'byte[]'
    Kann man überhaupt einen double Wert zwischen den Clients hin und her senden oder ist das gar nicht möglich?
    Und wenn es möglich ist: Wie kann ich das sonst noch mache?

    MfG
    Timer
  • Hi Schaue dir doch bitte die Definition der Methoden in der googel api an.

    abstract intsendReliableMessage(GoogleApiClient apiClient, RealTimeMultiplayer.ReliableMessageSentCallback listener, byte[] messageData,String roomId, String recipientParticipantId)Send a message to a participant in a real-time room reliably.

    Das ist eine abstrakte Methode die must du selber scheiben da gib es nur den Methoden Rumpf.
    google.de/url?sa=t&source=web&…Vaw3f2B7gQtspigAiH5Ozp3j9
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • Leider konnte ich erst jetzt weiterprogrammieren und habe dabei bemerkt, dass das mit dem Message Receive nicht klappt. Wenn ich dort das byte zu double ändere geht das leider nicht (required double[] found byte[]):
    Vom Google Tutorial:

    Quellcode

    1. private OnRealTimeMessageReceivedListener mMessageReceivedHandler =
    2. new OnRealTimeMessageReceivedListener() {
    3. @Override
    4. public void onRealTimeMessageReceived(@NonNull RealTimeMessage realTimeMessage) {
    5. byte[] message = realTimeMessage.getMessageData();
    6. }
    7. };
    Das byte[] message habe ich zu double[] message abgeändert
  • Ich habe nun geblickt, welchen Sinn das sendMessage hat. Das ist dafür da, um eine Variable (auch double) als Bytes zu versenden. Dafür muss man den double Wert halt zuerst in Bytes umwandeln. Da hat mir das geholfen:
    stackoverflow.com/questions/29…ay-into-a-double-and-back
    Nun habe ich nur noch das Problem, dass ich verschiedene Variablen versende und ich nicht weiß, wie ich zuordnen kann, zu welcher Variable und zu welchem Spieler (da reichen Zahlen 1-8) dieser Wert gehört. Hat da jmd ne Idee, wie ich das machen kann? Meine Send und Receive Funktionen sehen so aus:

    Quellcode

    1. public static byte[] toByteArray(double value) {
    2. byte[] bytes = new byte[8];
    3. ByteBuffer.wrap(bytes).putDouble(value);
    4. return bytes;
    5. }
    6. public static double toDouble(byte[] bytes) {
    7. return ByteBuffer.wrap(bytes).getDouble();
    8. }
    9. void sendMoney(double moneyPlayer) {
    10. byte[] moneyPlayerBytes = toByteArray(moneyPlayer);
    11. for (String participantId : mRoom.getParticipantIds()) {
    12. if (!participantId.equals(SignIn.mMyParticipantId)) {
    13. Task<Integer> task = Games.
    14. getRealTimeMultiplayerClient(this, GoogleSignIn.getLastSignedInAccount(this))
    15. .sendReliableMessage(moneyPlayerBytes, mRoom.getRoomId(), participantId,
    16. handleMessageSentCallback).addOnCompleteListener(new OnCompleteListener<Integer>() {
    17. @Override
    18. public void onComplete(@NonNull Task<Integer> task) {
    19. // Keep track of which messages are sent, if desired.
    20. recordMessageToken(task.getResult());
    21. }
    22. });
    23. }
    24. }
    25. }
    26. private RealTimeMultiplayerClient.ReliableMessageSentCallback handleMessageSentCallback =
    27. new RealTimeMultiplayerClient.ReliableMessageSentCallback() {
    28. @Override
    29. public void onRealTimeMessageSent(int statusCode, int tokenId, String recipientId) {
    30. // handle the message being sent.
    31. synchronized (this) {
    32. pendingMessageSet.remove(tokenId);
    33. }
    34. }
    35. };
    36. synchronized void recordMessageToken(int tokenId) {
    37. pendingMessageSet.add(tokenId);
    38. }
    39. private OnRealTimeMessageReceivedListener mMessageReceivedHandler =
    40. new OnRealTimeMessageReceivedListener() {
    41. @Override
    42. public void onRealTimeMessageReceived(@NonNull RealTimeMessage realTimeMessage) {
    43. byte[] message = realTimeMessage.getMessageData();
    44. double money = toDouble(message);
    45. }
    46. };
    Alles anzeigen
  • Keiner ne Idee, wie man das leicht macht?

    Wenn nein:
    mir ist die Idee gekommen, dass ich das 8. Byte (so groß sind die Zahlen eh nicht) unterschiedlich beschrifte. Z.B. für den Spieler 2 und die Variable stats mit einer 0 (das ist einfach immer ne 0) + 2 (für Spieler 2) + 0 (für die 1. Variable) die Daten beschrifte. Kostet das viele Ressourcen (bzw wird das 8. Byte auch dann übermittelt, wenn da nichts angegeben wird? Denn die Daten sollen jede Sekunde ausgetauscht werden und dadurch weiß ich nicht, ob das zu sehr aufs Internet geht)?
    Oder hat jmd ne bessere Idee?