Multiplayer
Übersicht

MiKotBetreff: Multiplayer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gutnabnd.
Ich bin dabei, ein Multiplayerspiel zu basteln. Nun, kein Multiplayerspiel ohne Netzwerk. Ein bisschen kenne ich mich da jetzt schon aus, wie man ein laufendes Netzwerk erstellt und sich Nachrichten schickt. Allerdings ist das ja nur die halbe Miete. Bei einem richtigen Spiel müssen ja alle Rechner synchronisiert sein, ihre Framerate halten, Fehler behandeln und vor allem flüssig laufen. Dazu brauche ich nun ein grundlegendes Konzept. Zunächst relevantes vom Spiel: Jeder steuert ein Fahrzeug, mehr verrat ich nich. Mein jetziges Konzept: Pro Frame wird die Spielschleife mehrmals durchlaufen, damit man auch auf zwei Rechnern mit verschiedenen Framerates spielen kann. Im Folgenden nenne ich nicht einen Bildaufbau, sondern einen Spielschleifendurchlauf "Frame". Der Host hat ein Dynamisches Feld, in dem er Tastaturereignisse mit einem zugehörigen Aktionszeitpunkt speichert. Beispiel: Der Host drückt die Leertaste -> Das Kommando "Leer" wird mit einer zugehörigen Zeitangabe (in Anzahl Frames nach Spielstart oder so) an die Liste angefügt, die Zeit ein paar Frames nach dem aktuellen -> Mit jedem Frame werden alle Tastaturkommandos der Liste durchgegangen und wenn der Zeitpunkt erreicht ist, wird reagiert. Ein Client drückt die Leertaste -> "Leer" wird mit einer zugehörigen Zeitangabe an den Host gesendet, der es seiner Liste anfügt -> usw. In jedem Frame sendet der Host an alle Clients alle Positionen der Fahrzeuge Die eingebaute Zeitverzögerung sorgt dafür, dass die Reaktionszeit nach einem Tastendruck immer gleichlang ist und das Spiel auf allen Rechnern identisch abläuft. Geht das so? Von der Übertragungsrate und Rechenleistung und sowas? Wenn nicht, würde ich mich über ein besseres Konzept freuen. Danke im Vorraus, Mikot |
||
![]() |
Jack |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein Netzwerkspiel. Wieso kein anderes ![]() ![]() ![]() |
||
MiKotBetreff: Re: |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich möchte eben ein Netzwerkspiel haben. Dann brauch ich 1. keine KI und 2. kenne ich kein Spiel, was alleine mehr Spaß macht und Splitscreen is ja wohl voll zum...
Ich habe aus einem anderen Eintrag erfahren, dass UDP sinnvoller ist als DP, mach ichs halt mit UDP. Ich wüsste nur dennoch gern, ob das Konzept in Ordnung ist. thx |
||
![]() |
DA |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
ich würde es einfach so machen, das wenn eine Taste gedrückt wurde die bestätigung direkt an den anderen Spiele gesendet wird. Wen du das Spiel über Internet machen würdest, wäre sowas vielleicht gut. Aber da wir ja im Heimnetzwerk sind und alles sehr schnell abläuft wegen 100 mbit/s denke ich nicht das es da syncronschwiriegkeiten geben würde. So sehe ich das zumindest. Mfg DarkAngel |
||
Deutscher Blitz Basic Chat |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Für ein Peer2Peer Netzwerk hört sich das doch schon ganz gut an.
Für Server-Client würde das sofortige Übertragen der Infos wohl ausreichen. Hier gilt dann: Der Server hat immer recht und versorgt die Clients mit den Spielerpositionen. So bleibt es schön synchron. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
CodeMaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...und es kann nicht gecheatet werden ![]() |
||
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.
Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102 |
![]() |
diGGaGruppenKaspar |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja die spieler senden ja die position an den server demzufolge... (auch eben nur teilweise) | ||
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und glaubte im Licht der Straßenlampe Den Geist unseres jahrhunderts auf der Straße zu sehen Der uns sagte, daß wir alle am Rande des Abgrunds stehen. - Al Steward Athlon 64 3000+ / Radeon 9600 / 1024mb ddram |
CodeMaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Ein Client drückt die Leertaste -> "Leer" wird mit einer zugehörigen Zeitangabe an den Host gesendet, der es seiner Liste anfügt -> usw.
Zitat: -> Mit jedem Frame werden alle Tastaturkommandos der Liste durchgegangen und wenn der Zeitpunkt erreicht ist, wird reagiert. Der Spieler selbst verändert seine Position dadurch doch nicht...
Übrigens würde ich die Reaktionszeit weglassen. Ist doch egal, die Daten des Hosts kommen eh mehr oder weniger gleichzeitig bei den Clients an, ob nun mit oder ohne Wartezeit. Außerdem würde mich persönlich eine Einsatzverzögerung der Tasten, die größer als die bedingte Sende- und Empfangsgeschwindigkeit zwischen mir und dem Server ist, stören (wenn nicht sie selbst es schon tun würde)... |
||
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.
Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102 |
![]() |
Shodan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei dogfight hab ich es so gemacht:
Bis auf das ermitteln von laufenden Netzwerkspielen im Joinmenü ist alles mit DirectPlay gemacht. Ohne Probleme ![]() -Generell fragt jeder Teilnehmer, auch der Host, pro Schleifendurchlauf max. 10 Netzwerknachrichten ab. ( Wegen der Performance. Hab ewig daran getestet ![]() -Alle Clienten senden ihre Pos.,Ausrichtung ca. alle 30 ms an den Host. Ist die Framerate niedrig ( 20FPS) gehts halt eben nur alle 50 ms. Dieser schreibt alles in eine Liste und schickt diese ebenfalls alle 30 ms an alle -Abgefeuerte Waffen der Clienten werden sofort an den Host gesendet. Der Host sammelt alle während einer Schleife eingehenden Nachrichten, schreibt sie in eine Liste und schickt sie sofort an alle. -Alle anderen Ereignisse wie Explosionen, Spielertod, etc. werden vom jeweiligen Spieler an alle geschickt. Da die Zahl dieser Nachrichten gegenüber der Zahl der Schleifendurchläufe relativ gering ist, kommt es höchst selten zu einem Stau von Netzwerknachrichten.( Da müssen schon extreme Einbrüche in der Performance auftreten) Zur Syncronisation folgende Lösung: Code: [AUSKLAPPEN] time=Millisecs() While looptime#=(Millisecs()-time)/1000.0 time=Millisecs() . . Deine Hauptschleife wend Dieser Bestanteil der Schleife ermittelt die Zeit, die die Schleife für einen Durchlauf gebraucht hat, in sec. Alle Bewegungen, Drehungen, Farbänderungen, Fading etc., einfach alles was einer zeitlichen Änderung unterliegt muss mit der Variable looptime# multipliziert werden. Sinkt die Framerate wird der Wert grösser. Code: [AUSKLAPPEN] MoveEntity cube,0,0,200*looptime# würde den Cube um den Wert 200 pro sekunde vorwärts bewegen, egal welche Framerate du hast. Dieses Prinzip funzt bei mir ganz gut. Verzögerungen würde ich nicht einbauen. Die Netzwerknachrichten unterliegen sowieso einer leichten Verzögerung. Vor allem dann, wenn die Nachrichten beim Host eintreffen, während dort grade die Schleife durch ist und Renderworld() ausgeführt wird. So bleiben sie liegen bis zum nächsten durchlauf. Ich hoffe ich konnte dir weiterhelfen. mfg Shodan |
||
www.selfmadegames.de |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group