GDi+ Frage

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.

    Hi.

    Ich wollte mal wieder ein Multiplayerspiel machen.
    In diesem Thread hatte ich es ja soweit geschafft.
    Nun. Ich weiss wie man jedes mal, wenn ein Player joint eine neue Figur in GDI zeichnen kann.
    Diese kann man auch bewegen.

    Nun, um die Koordinaten an andere weiter zu bringen, muss diese Figur irgendwie einen Namen bekommen.
    Aus der Nachricht filter ich dann wie auch im Thread X und Y raus, und setze die Figur dahin.

    Doch wie benenne ich diese dynamische Figur nun jedes mal anders, um sie zu unterscheiden?

    Danke sehr.

    Mfg. TGS :)
    Ich kenne jetzt dein gesamtkonzept nicht, aber die Frage hört sich so an, als ob das mit gut um gesetzter Objektorientierung gar kein Problem darstellen würde. Spieler-Objekte hast du jetzt gar nicht erwähnt. Du überspringst die Logik und gehst vom Netzwerkverkehr direkt zum Zeichnen?

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Geb jedem Spieler doch eine ID, ein Byte wäre dafür bereits ausreichend. Aber ohne halbwegs passende Datenstruktur wird das nichts. Hast du etwas in die Richtung? Also Klassen wie "Spieler" usw? Du musst die Netzwerknachrichten schließlich immer genau dem passenden Spieler zuordnen können.

    Btw ist es dann Job des Servers einem Client der sich verbinden möchte eine freie ID zuzuteilen, ggf zu sagen "nein, ist nicht".
    Das einfachste, um eine eindeutige ID zu bekommen ist Guid.NewGuid.
    Weil die Guid-Structure ist dazu erfunden, eindeutig zu sein - ansonsten kann die ungefähr garnix.

    Damit kann ein Client einfach eine ID vorgeben, und die dem Server mitteilen - (wo ansonsten der Server die ID generieren müsste, udn der Client müsste extra deswegen nachfragen).
    Eine ganze GUID zu übertragen ist für den Netzwerkverkehr allerdings relativ "belastend", verglichen mit einer kurzen ID. Übrigens würde ich IDs oder GUIDs vom Server vergeben lassen, nicht von den Spielern selbst. Zum einen ist die Wahrscheinlichkeit der Einzigarteigkeit bei GUIDs dann höher, zum anderen wäre das System dann angreifbar, wenn ein Client sich absichtlich die ID eines schon vorhanden Clients aussucht.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Du brauchst nicht mal ne ID, sobald du mit nen Spieler verbindest auf den Server, hast du seine IP : Port, dadurch kann man jeden Spieler gut erkennen.
    So mach das ich meistens immer.

    Du musst nicht unbedingt eine ID vergeben.
    Du musst ja auch jeden Spieler einen eigenen Netzwerkstream zuweißen, dann erweiterst du einfach deine Klasse mit ne Proberty und fügst noch was hinzu.
    Der Server sendet dann einfach an jeden Client die Info, inkl Spielername, ID, IP etc... Wie ihr wollt.

    Wenn ich ein Client - Server - Client Spiel erstellen würde, dann erstelle ich mir ne Klasse namens "Spieler", der Server bestitz eine List(Of Spieler), die kannst du dann immer übertragen sobald was geschieht am Server.
    Der Client will ja auch schließlich wissen, wer online ist und wer die Verbindung grade geschlossen hat.
    Du brauchst nicht mal eine explizite ID für einen Spieler. Klar, soll ein Spieler einen Namen o. ä. haben. Jedoch hast Du, bei gutem Klassendesign, eine Referenz auf den jeweiligen Spieler, welche die meisten Überlegungen hinfällig machen. Klar entsteht diese Referenz im Grunde aus dem Socket, der sich zum Server verbindet. Jedoch brauchst Du Dich nicht um die explizite Übertragung einer GUID o. ä. kümmern. Wie gesagt: Bei gutem Design.

    EDIT: Die Momente, an denen man erkennt, welchen Mist man aus dem Mund hat fallen lassen, sind echt unbeschreiblich. Nichts für ungut. Post bitte ignorieren.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()

    bei Client-Server-Client muss man sehr wohl eine Art von ID übertragen. IP wäre möglich, aber das möchten die wenigsten. Also einfach eine andere ID verwenden. Der Server braucht von den einzelnen Spielern keine ID zu empfangen, da diese ID sozusagen nur ein geheimer Primärschlüssel ist. Die IDs können außerdem auch zur Laufzeit erstellt werden. Und jenachdem macht es auch keinen Sinn auf einem Server für Games > 255 Spieler zu verwalten, eigt. sollte somit bereits ein Byte genügen. Andernfalls, falls es sich um nur eine Welt für Alle Spieler handelt, kann man die Welt unterteilen in "Teilwelten", dadurch braucht man nur pro Teilwelt die IDs und muss für die Spieler auch eben nur diese Aktuallisieren.
    Jedoch würde ich aus Prinzip trotzdem einfach ein UInt32 nehmen, aber dies sollte dann auch wirklich genügen. Vorallem ist die Frage, ob ein Server so viel verarbeitet bekommt :D
    Dafür sollte man nämlich dann das ganze auch noch in Teilserver unterteilen, die alle miteinander kommunizieren, aber das geht für ein privat Erstelltes Game viel zu weit^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Wieso mögen es die wichtigsten?!

    Man sollte natürlich bei so nen Projekt keine Strings hin und her senden:)
    Sollten scho verschlüsselte Bytes sein, so sieht man auch nicht ob es sich um eine IP handelt oder nicht.
    @SpaceyX
    Wie würdest du das machen? Da fällt mir nur das Proxy-Pattern ein um "so zu tun als hätten alle die selbe Spieler-Instanzen".

    Mein System für einen quasi-2D-Shooter hat so ausgesehen:
    Server und Clienten haben eine List(of Spieler). Es gibt einen GameLoop. Während der Update-Routine eines Clienten werden iwelche Aktionen getätigt (Beispiel: ein Schritt vorwärts, etc) und entsprechende Nachrichten erstellt. Im Anschluss werden diese an den Server weitergeleitet. Die Serverlogik aktualisiert auf Grundlage der Nachricht die eigenen Spielerdaten und sendet die Nachricht ggf an die anderen Clients: eine Positionsangabe geht z.B. alle Clients etwas an, eine Team-Chat-Nachricht hingegen nur eine bestimmte Gruppe, ...
    Damit die einzelnen Clients + der Server die Nachrichten einer Spielerinstanz zuordnen können hatte ich immer eine ID vom Typ Byte eingesetzt. Die war neben der NachrichtenTypID auch Bestandteil eines jeden NachrichtenHeaders - darum ist ein relativ kleiner Byte auch Vorteilhafter gegenüber einer kompletten IP-Adresse oder Spielernamen. Mehr als 255 Spieler (eine ID würde ich 'opfern' um den Server identifizieren zu können) sind eh recht unüblich - falls doch angestrebt muss man einen anderen Datentyp verwenden.

    Edit: Hat sich @SpaceyX dann wohl erledigt xD
    @FreakJNS: Hab meinen Post bereits vor 5 Min. storniert. Weiß auch nicht, was ich mir dabei gedacht habe.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @n1nja: Und trotzdem könnten dann böse Menschen in nem Spiel joinen und hätten Lokal die IPs der anderen Spieler, da diese ja als IDs verwendet werden. Zur Not ahmt er das Protokoll nach, ansonsten liest er es einfach aus dem Speicher aus. Da bringt es nichts, wenn es auf dem Weg verschlüsselt wird.

    Btw. nicht wichtigsten, sondern wenigsten ;)
    Außerdem ist es ja kein Problem einfach eine inkrementelle ID zu verwenden, die der Server einem Spieler zuordnen kann, sobald dieser joint, somit nutzt man die Bytes optimal aus. (Wenn eine kleinere ID frei wird, kann man diese ja wieder verwenden). Aber bei den IPs sind Bereiche ja für alles Mögliche vorbelegt. Auch wenn du wohl nie die 2^32 Spieler auf so einem Server haben wirst, so werden die 4 Bytes der IP sogesehen recht schlecht benützt(also nat. nur für diesen zweck^^)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---