Gegner in Online Jump'n'Run

  • GM 8

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

  • Gegner in Online Jump'n'Run

    Ich habe ein Problem bei meinem Onlinespiel.
    Ich möchte Mobs (Gegner) einbauen, aber hab keinen Plan wie ich die Kollisionsabfrage machen sollte.
    Der Server weiß die Position der Blocks nicht, und so kann er den Clients nicht sagen, wo der Gegner jetzt hinlaufen soll.
    Ich habs mit der Idee "Alle Clients sehen dasselbe" probiert, und zwar so, dass jeder Client die Gegner einzeln steuert, dabei kam auch nichts heraus.
    Hoffe Jemand weiß eine Antwort.
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Und wieso kam dabei nichts raus? Denn so würde ich es auch umsetzen. Vor allem die Kollisionen nicht vom Server machen lassen...

    Also, ich vermute mal, du meinst soetwas, wie auf den Gegner draufspringen. Dann handelt der Client es ab, der draufgesprungen ist und sendet diese Information an alle weiter.
  • Nein, so hab ichs nicht gemeint.
    Beispiel: Player steht neben Gegner. Server sagt: geh zum Player, und sendet die X und Y Koordinate des Gegners weiter.
    Aber der Server weiß nicht, wo die Blocks sind, also "schwebt" der Gegner zum Player, weil er keine Kollisionen erkennt.

    Wenn ich das über den Client mach, passiert folgendes: JEDER Spieler sieht etwas komplett anderes, weil ja nicht immer die Koordinaten komplett gleich sind.
    Und das ist außerdem eine ziemlich schlechte Variante, da bei einem Server-overload die Spieler etwas "laggen", und so das Ergebnis verfälscht wird.
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Ja, so ist das nunmal... Wenn ein Client entscheidet, der Gegner folgt jetzt mir, muss er das allen mitteilen, die Richtung und Position vom Gegner, sowie die Information, wem er folgt. Wer zuerst kommt, malt zu erst. Normalerweise fällt es den anderen Spielern ja nicht auf, dass die Positionen leicht abweichen, weil sie ja keinen absolut korrekten Status kennen. Erst wenn du Positionen usw. korrigierst, kann ein Zuckeln entstehen. Sowas solltest du aber auch rein clientseitig verbessern, falls überhaupt. Also z.B. Zwischenanimationen einfügen, die den Gegner schnell in eine andere Richtung gehen lassen.
    Trotzdem sollte das alles nicht wirklich nötig sein. Du benutzt schon UDP? Evtl kannst du ja mal was zeigen...
    Aber du solltest davon wegkommen es Serverseitig zu machen, außer du machst alles auf dem Server, wie auch die "Blocks" und sämtliche Berechnungen. Dies hätt aber einige Nachteile.
    Eine Mischung lässt sich natürlich auch machen, wie du es bereits geplant hattest. Aber in dem Fall sollte der Server nur mitteilen, wem der Gegner folgt, und nicht wie er folgt. Das sollten die Clients berechnen...
  • Ja, ich werde es warscheinlich so machen:
    Server schickt HP usw., Clients machen die Bewegung.

    UDP? Was genau meinst du damit?

    edit: Nein, funktioniert nicht. Das erwartete traf ein: Ein Spieler betritt einen Room, aber alle Mobs sind bereits bei einem anderen Player.
    Da die Mobs erst created werden, gehen sie dann zum nächsten Spieler, und so sind die Mobs bei zwei Clients an komplett anderen stellen.
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von levarris07 ()

  • Ich wollte wissen, wie du die Verbindungen realisiert hast, z.B. mit welchem Protokoll -> UDP (User Datagram Protocol).

    Aber ich befürchte das ist nicht dein Problem...
    Wenn du also ermöglichst, dass sich ein Spieler zur Laufzeit einklinken kann, dann musst du natürlich bei jedem Erstellen eines Objektes erstmal prüfen, wo dieses sich gerade befindet, was es macht, ob es überhaupt noch existiert usw.
    Dazu brauchst du natürlich die Möglichkeit diese Daten aus einer sicheren Quelle erfragen zu können. Wenn der Server die Daten nicht immer aktuell, oder gar nicht hat, musst du eben einen Clienten fragen. Da du höchst wahrscheinlich nicht die Möglichkeit implementiert hast, einen Clienten direkt zu fragen, musst du über den Server eine Rundfrage starten.
    Entweder weiß der Server, wer die zuverlässigsten Daten hat, z.B. weil ein bestimmter Client zuletzt die Daten dieses Objektes geupdated hat (am besten zwischenspeichern der Daten) oder er muss eben alle Clients fragen, wo die Gegner gerade bei ihnen sind und entscheiden, welches die besten Daten sind.
    Ich hoffe du kannst mir etwa folgen... ich würde eine Methode machen, wie etwa getDataFromObject(id); über die du dem Server die ID deinen Objektes übergibst und je nachdem, wie du es realisierst, schickt der Server die Antwort.
    Bei den ganzen CreateEvents ist es also unerlässlich, dass es zu Anfang zuckeln wird und hier und da was nicht konsistent ist. Deshalb würde ich einfach ein paar Sekunden Ladebildschirm über alles legen, je nachdem, wie lange es braucht.