Multiplayer

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

MiKot

Betreff: Multiplayer

BeitragMo, Jun 20, 2005 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 21, 2005 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Netzwerkspiel. Wieso kein anderes Question Du kannst es dann doch ins Netz stellen Exclamation Die Forensuche könnte aber auch ganz nützlich sein Exclamation
 

MiKot

Betreff: Re:

BeitragDi, Jun 21, 2005 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 21, 2005 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 21, 2005 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 21, 2005 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
...und es kann nicht gecheatet werden Wink
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

diGGa

GruppenKaspar

BeitragDi, Jun 21, 2005 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 21, 2005 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 22, 2005 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei dogfight hab ich es so gemacht:
Bis auf das ermitteln von laufenden Netzwerkspielen im Joinmenü ist alles mit DirectPlay gemacht. Ohne Probleme Wink .

-Generell fragt jeder Teilnehmer, auch der Host, pro Schleifendurchlauf max. 10 Netzwerknachrichten ab. ( Wegen der Performance. Hab ewig daran getestet Wink )

-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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group