none
Server einrichten und Positionen abfragen RRS feed

  • Frage

  • Hallo werte Community.

    Ich besuche die 3. Klasse einer höheren technischen Lehranstalt und möchte als Maturaprojekt ein kleines Adventure über einen Server und einer Datenbank schreiben. Der Client basiert auf C# XNA 4.0, der Server auf eine Konsolenanwendung, und die Datenbank wurde von einem Anbieter gehostet (MySQL).

    Lokal ist das ganze relativ gut am laufen. Der Charackter kann sich in der Welt frei bewegen, kann nicht aus den Grenzen raus, kann Häuser betreten um in eine "Neue Welt" zu kommen, ...

    Nun möchte ich das ganze jedoch auch Online machen dh. andere Personen sollen ebenfalls dieser Map beitreten können und sich gegenseitig sehen sowie bemerken wenn Bewegungen ausgeführt werden.

    Leider habe ich kaum Erfahrung mit Networking. Ich weiß nur wie ein Client den Server anfragen kann und der Server eine Antwort zurück gibt. Den Server würde ich vorerst Lokal auf meinen Rechner laufen lassen und später zu einen Root Server auswechseln.

    Nun zu meinen genauen Problem:

    Ein Spieler startet das Spiel, und wird auf die Karte gesetzt. Wenn nun ein 2. Spieler die Karte betritt sollten sich beide Spieler sehen können und dessen Bewegungen. Ebenfalls soll beim schließen des Spiels der Spieler wieder von der Karte verschwinden. Hierbei habe ich keinerlei Ahnung wie dies praktisch um zu setzen wäre.

    Sebastian Hauer

    Samstag, 21. Juni 2014 20:17

Alle Antworten

  • Hi Sebastian,

    das Thema ist jetzt nicht mal eben Erklärt. Ich hab einfach mal nach dem üblichen Verdächtigen gegooglet (Counter Strike ;) ) und den Beitrag gefunden.  Sah jetzt beim Überfliegen ganz gut aus.

    MFG
    Björn

    Samstag, 21. Juni 2014 21:40
  • Ohne mich in Spieleprogrammierung und deinem speziellen Problem auszukennen, würde ich aber sagen, dass der Server, als zentrale Stelle, alle Clients informieren müsste, wenn ein neuer Spieler die Welt betritt bzw. sich ein Spieler in er Welt bewegt, damit jeder Client den aktuelle Zustand der Welt darstellen kann.

    Zum Informieren der Clients vom Server aus, fällt mir als Technik spontan SignalR ein. Allerdings kann ich dir nicht sagen, inwieweit das für euer Spiel geeignet ist.


    Andreas Richter
    Softwareentwickler und -architekt
    http://www.anrichter.net

    Samstag, 21. Juni 2014 22:47
  • Hallo Björn.

    Entschuldige für meine vielleicht etwas schlechte Erklärung.

    Also ich mit 3 Klassenkollegen etwickeln ein 2D Spiel für unser Maturaprojekt. Hierzu habe ich einen Screenshoot eines Spieles rausgesucht, welches gleiche Grundkonzeote wie unseres enthält:

    http://i.neoseeker.com/p/Games/Gameboy_Advance/Role-Playing/Fantasy/pokemon_advance_profilelarge.jpg

    Wenn man sich das Spiel ansieht, sind hier 3 Personen: 1 Junge (Spieler 1), ein Mädchen (Spieler 2) und ein "Computer" (NPC genannt. Als Programmierer stelle ich mir hier folgende Fragen:

    1.) Wie weiß Spieler 1, wo Spieler 2 steht? bzw wie weiß  Spieler 2 wo Spieler 1 steht?

    2.) Der Client müsste laufend die Position der anderen Spieler bekommen, wie müsste soetwas aussehen damit hier keine großen Verzögerungen entstehen?

    Ich weiß zwar, wie ich einen Server Daten schicke und er mir Antwortet nur denke ich ist dies für ein kleines RPG nicht all zu leicht, da es hierbei auch doch auf die Geschwindigkeit der Übertragung ankommt.

    Wichtig könnte auch noch sein das Character Animationen bei Bewegungen machen (zB Füße heben beim gehen, Hände schwenken beim gehen). Wenn ich nun dem Server einfach sage Spieler 2 ist von (1,2) auf (2,2) gegangen, dann würde sich rein nur das Bild in eine andere Koordinate setzen und es würde so wirken als würde das Spiel "hängen" aufgrund der fehlenden Animation.

    Ein kleiner Zusatz:

    Ich habe mir eben zwei Klassen runter geladen. Eine Server und eine Client Klasse. Ich habe hiermit berechnet wie schnell ein String im lokalen Netz zum Server übertragen wird. Das ganze beträgt 5ms. Somit stellen sich 3 Fragen:

    1.) Wie würde sich die Geschwindigkeit beeinflussen, wenn ein anderer Spieler darauf connecten würde?

    2.) Muss der Server immer angefragt werden für die Koordinaten, oder ist es hierbei möglich, dass dieser die Daten automatisch immer an jeden verbundenen Client schickt?

    3.) Der Server ist eine Konsolenanwendung und wartet bis sich 1 Spieler durch folgenden Code verbindet: 

    Socket s = myList.AcceptSocket();

    Wenn jedoch (logisch) ein zweiter Spieler darauf connecten will nimmt er natürlich keine Verbindung an. Wie könnte ich dies abfangen das die Verbindung angenommen wird?

    Hier der Source der Server Klasse:

    try
                {
                    IPAddress ipAd = IPAddress.Parse("Meine IP Adresse");
                    TcpListener myList = new TcpListener(ipAd, 8001);
                    myList.Start();
                    Console.WriteLine("Warte auf Verbindung.");
                    Socket s = myList.AcceptSocket();
                    Console.WriteLine("Connection angenommen von  " + s.RemoteEndPoint);
    
                    string x = "";
                    byte[] b = new byte[100];
                    int k = s.Receive(b);
                    for (int i = 0; i < k; i++)
                    {
                        Console.Write(Convert.ToChar(b[i]));
                        x = x + Convert.ToChar(b[i]);
                    }
                    ASCIIEncoding asen = new ASCIIEncoding();
                    s.Send(asen.GetBytes("Der String "+"" + x + ""+" ist am Server angekommen!"));
                    /* clean up */
                    s.Close();
                    myList.Stop();
                    Console.ReadKey();
    
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error..... " + e.StackTrace);
                    Console.ReadKey();
                }

    Sebastian Hauer

    Sonntag, 22. Juni 2014 00:27
  • Hi Sebatian,
    deine Frage zur Verbindung eines weiteren Spielers kann z.B. mit multithreading gelöst  werden. Jeder Spieler wird im Server in einem separatem thread synchron bedient. Das bedeutet, dass nach dem AcceptSocket ein thread für den angemeldeten Spieler gestartet wird, der dann den Datenverkehr verwaltet. Dach den Start des thread wird in einer Schleife mit AcceptSocket auf die nächste Anmeldung gewartet.

    Alternativ kann man auch mit asynchronen Methoden innerhalb eines threads arbeiten. Alle Spieler werden nach dem Accept in eine Liste eingetargen und jedes asynchrone Ereignis arbeitet mit dem betreffenden Listeneintrag resp. Spieler.

    --
    Peter

    Sonntag, 22. Juni 2014 05:56