Spiel mit TCP multiserver

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Spiel mit TCP multiserver

    Hi
    Ich hab ein problem:
    Ich hab mir den multiserver von dem sourcecodeaustausch runtergeladen([VB.NET] Multiserver (TCP)) Und hab es so geänert dass es keinen log mehr macht(Bleibt sonst nach einiger zeit stecken)
    Heißt: es wird immer nur eine zeile übertragen.

    übertragen werden die koordinaten eines bildes (z.B: 10:10 )
    das bild im clienten kann man belibig mit der maus verschieben.
    alles funktioniert....
    aber jetzt möchte ich nicht nur einen punkt sondern beliebig viele , je nach clienten haben.(Also bei 1 clienten 1 punkt ,2c. 2punkte ,3c. 3p. usw..)
    wie vorher erwähnt wird nur eine zeile übertragen

    Bitte um hilfe
    Falls jemand so nett ist mir zu helfen und die projekte benötigt werden werde ich sie demjänigen per pm senden (Möchte es noch nicht veröffendlichen :D )
    Wer Rechtschreibfehler findet darf sie behalten :)
    dann musst du dir ein Protokoll zum übertragen der Daten überlegen. Das ist nicht einfach, denn du willst ja sicher auch noch andere Daten übertragen (ich denke da so an Namen der Spieler, Lebenspunkte, Punktestand, und und und).
    Ich habe sowas mal gemacht bzw arbeite immernoch daran. Ob es die optimale Vorgehensweise ist weiß ich nicht, ich erkläre einfach mal:
    Jedes Datenpaket hat seine eigene Klasse (z.B. MessagePosition, MessagePunktestand, MessageSpielername, etc). An der stelle ist es wichtig bzw sinnvoll mit vererbung zu arbeiten: es gibt eine MessageBase-Klasse und jede Unterklasse erbt von dieser - so lässt sich Code verallgemeinern.
    Die Message-Klassen haben nun Eigenschaften, die sie übertragen und empfangen können, z.b. die Position hat die Single-Werte X und Y sowie eine Blickrichtung. Neben der Klasse gibt es eine Enum vom Typ Byte (sollte ausreichen, ansonsten Integer), die die Messages identifiziert (1 = MessagePosition, 2 = MessagePunktestand, etc). Ebenso muss (sogut wie immer) übertragen werden, welchem Client die Informationen zuzuordnen ist - dafür reicht ein Byte, damit kannst du 256 Clients ansprechen.
    Und schon kann es ans übertragen der Daten gehen, doch dazu wieder etwas anderes: Du solltest die Daten nicht als Zeichenfolge (String) übertragen. Nutze die BitConverter-Klasse um einen primitiven Datentyp in ein Bytearray umzuwandeln bzw umgekehrt. Das ist seh praktisch: ein Single als Zeichenkette braucht IMMER genau 4 Byte - als zeichenkette sähe das anders aus, vgl. 1.4 mit -3.3422. Auf die Weise weißt du von vornherein wie lang eine Message ist.

    Hier mal ein Beispiel wie sich eine Message zusammensetzen kann:

    MessageID + ClientID + X + Y + Blickrichtung
    1 Byte + 1Byte + 4 Byte + 4 Byte + 4 Byte = 14 Byte

    Der Client/Server der nun die Daten via Stream empfängt liest immer nur das erste Byte vom Stream, kann dann feststellen um welche Message es sich handelt und die Restlichen Bytes der Message einlesen (er weiß ja wieviele es sind), eine entsprechnde Message-Instanz erstellen und damit weiterarbeiten.

    Wenn du ein Multiplayer-Spiel proggen willst wirst du imo diesen weg gehen müssen, denn ein Chat eignet sich einfach nicht diese Bandbreite an Informationen zu übertragen. Du musst also einen komplett neuen Code erstellen, der sendet und empfängt - Byte für Byte und nicht Zeile für Zeile. Arbeite dazu in einem Backgroundworker oder Thread. Außerdem musst du dir Gedanken darüber machen wie sich die Clients mit dem Server verbinden - auch dafür muss es eine Message geben.

    Ich habe das so gemacht, dass es eine Liste von Slots gibt (z.B. 8 Stück in der Liste, dann können 8 Spieler zusammen spielen). Ein Slot enthält alle relevanten Informationen wie
    - Spielername
    - Position
    - Ist der Spieler aktiv, also ist dem Slot ein Spieler zugeordnet?
    - SlotID!

    Beim Verbinden wird dem neuen Spieler eine SlotID zugewiesen, sofern eine verfügbar ist. Die SlotID ist also mit der ClientID (habe das wort oben schonmal benutzt) gleichzusetzten. Werden Daten empfangen muss also nur in den entsprechenden Slot geschrieben werden. Das Client-Spiel kann sich nun aus diesen immer aktuellen Datensätzen bedienen. Verändert der Spieler seine Position, dann müssen die Datensätze bei allen Clients angepasst werden - wie?
    Spieler ändert einen Datensatz und sagt der Netzwerk-Klasse welche Message gesendet werden soll. Netzwerk-Klasse sendet Daten an Server, der Server aktualisiert seine Slot-Daten und merk sich, welche (veränderten) Daten er übertragen muss. Nach eine bestimmten Zeit (1/30-Sekunde z.B.) überträgt der Server die geänderten Datensätze an jeden Client und dieser verarbeitet sie entsprechend. Fertig^^

    und damit viel spaß^^