Schüsse im Multiplayerspiel (UDP) an alle Rechner übertragen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

theotheoderich

Betreff: Schüsse im Multiplayerspiel (UDP) an alle Rechner übertragen

BeitragFr, Jun 24, 2005 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich bastel gerade für eine Netzwerknacht an einem (seit einem Jahr auf Halde liegendem) Multiplayer-Panzerspiel. Das Fahrmodell basiert auf der driver.bb Demo im Sampleordner.

Alle paar Millisec (ich rechne die Dauer der Schleifendurchläufe aus usw. wie Deltatime halt) übertrage ich die Positionsdaten zwischen den Rechnern.

Wenn jetzt ein Spieler schiesst, übertrage ich nicht ständig die Position aller Schüsse, sondern nur einmal wenn ein Spieler feuert. Alle benötigten Variablen werden an die anderen Spieler übermittelt und die Clients berechnen die Flugbahn und den Einschlagsort dann selbständig.

Nun mein Problem:
Auf kurze Entfernungen klappt das wunderbar, aber sobald die Schüsse weiterfliegen unterscheiden sich die Einschlagsorte leicht.

Ist ziemlich blöd, wenn Spieler 1 den Spieler 2 trifft, aber Spieler 2 davon nichts mitbekommt, weil ihn das Geschoss knapp verfehlt hat.

Wie löst Ihr so etwas?
Wie wird so etwas beispielsweise in Battlefield 1942 gelöst?


Ich bin für jede Anregung dankbar.

Eigentlich hatte ich gedacht, das die Schüsse nach meinem System immer identisch auf beiden Rechnern fliegen, da die Startvariablen ja immer gleich sind. Ist aber leider nicht so Crying or Very sad
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Ornos

BeitragFr, Jun 24, 2005 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
also was du gerade proggst ist fast das gleiche, was ich mache.
haste nicht lust bei uns/mir mitzuproggen ?
aber dein problem kenne ich
du musst sowohl client, alsauch server brechnen lasen
und noch zwischendurch die positionen vergleichen.
das hat mehrere gründe
1. nicht alle datenpakete kommen unbedingt an
2. unterschiedliche frameraten
3. usw
Projekt: Dash Off & DO - Times
Status: a0.6 & b0.7
http://www.dashoff.de.vu

theotheoderich

BeitragFr, Jun 24, 2005 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Ornos,

ich denke nicht, dass ich bei Euch mitmachen kann/werde, da ich leider nicht so viel Zeit zum programmieren habe (Arbeit, Frau, Kind, Freunde, usw.).
Deine Tipps haben mich aber auf eine Idee gebracht, wie ich nun weiterkomme.
Ich frage mich nur, warum ich nicht darauf gekommen bin, die Positionen zwischendurch abzugleichen Very Happy

Zu 1.:
Das die Pakete nicht alle ankommen, wusste ich, daher habe ich ja nur im Moment des Abfeuerns die relevanten Daten übertragen und "gehofft" es würde auf allen Clients identisch berechnet werden.

Zu 2.:
Unterschiedliche Frameraten sind kein Problem, da ich die Zeit messe, die für einen Schleifendurchlauf benötigt wird und dann eine entsprechende Zeitvariable habe. D. h. auf einem schnellen Rechner werden die Daten nach 40 Frames abgeglichen, auf einem langsamen dagegen erst nach 30.

Ich werde es mal problieren, in regelmäßigen Intervallen während der Flugdauer der Geschosse die Daten abzugleichen, wobei der Server die höhere Priorität hat.

P.S.:
Hier mal ein kleiner Screenshot
http://www.familie-wiegel.de/d...4Jun05.jpg

P.P.S.: Die 25 Frames/sek. liegen nur daran, das der Client Testrechner so langsam ist, aber zwei schnelle Rechner kann ich mir leider nicht leisten Wink
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Ornos

BeitragFr, Jun 24, 2005 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
schade ich könnte noch fähige leute gebrauchen Sad
dein screenshot sieht nicht schlecht aus
gefällt mir
ich habe meine multiplayer sache vorerst auf eis gelegt,
weil ich gerade an einer anderen,ähnlichen sache progge
Projekt: Dash Off & DO - Times
Status: a0.6 & b0.7
http://www.dashoff.de.vu

bruZard

BeitragFr, Jun 24, 2005 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast einen Fehler im Ansatz:

Du darfst nicht zur Laufzeit berechnen wie der Schuss fliegt und wo er dann irgendwann trifft, sondern musst die wahrscheinliche Trefferposition schon beim Schuss berechnen. Die Bewegung des Gegners dort mit einzubeziehen nennt sich "Extrapolation" und es gibt wahnsinnig viele und gute Texte zu diesem Thema. Bspw. auf www.gamedev.net
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

c64

BeitragDo, Jun 30, 2005 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
HI ihr
Ich habe schon einige sachen in diese richtung gemacht .
(viele übungen !!)
zb. bsp.: Botfight habe ich mit Netzwerkmodus versehen.

Und auch in meinem neuem project werde ich wenns weiter geht,
Netzwerktauglich programmieren.

zu deinem Problem, ich habe es so gelöst . was allerdings nur mit schnellen waffen geht !!! oder mit einigen modifikationen auch erweitert werden kann.

PSEUDO CODE !!!:

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

for spieler=each spieler ;spieler schleife

Current_SPIELER=spieler\ID

;/// wurde spieler getroffen dann ziehe schaden von leben ab und setzte schaden auf null

if spieler\DAMAGE>0 spieler\LIFE=SPIELER\LIFE-SPIELER\DAMAGE SPIELER\DAMAGE=0

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

;/// wenn spieler schiesst

if spieler\shoot = true

;// controlle ob gepickt wurde Smile

picked_ENEMY=pickentity(spieler\ID,ENTFERNUNG)

;// wenn dies der fall dann setzte auf getroffenen spieler und gebe ihm DAMAGE INFO und punkte

if picked_ENTITY
pointer_TO_PLAYER picked_ENTITY ;// ROUTINE DIE mit HANDLE AUF DEN SPIELER SPRINGT der getroffen wurde !!!

spieler\DAMAGE=spieler\DAMAGE+10


pointer_TO_PLAYER CURRENT_SPIELER ;/// wieder auf den SPIELER ZURÜCKSETZEN der geschossen hat !

endif
endif

next


bin gerade im unterricht falls es ein wenig wirr wirkt ! sory aber hoffe du verstehst den ansatz !!

theotheoderich

BeitragDo, Jun 30, 2005 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo c64,

so wirr ist Dein Geschreibsel garnicht.
Allerdings hilft es mir auch nicht grossartig weiter.
Es ist zwar das Grundgerüst für das Schiessen im Egoshooter, gibt aber leider keine Infos darüber, welcher Rechner wann Daten versendet, bzw. empfängt.

Ich habe es jetzt so gelöst, das sobald ein Spieler einen Schuss abfeuert, sämtliche schussrelevanten Daten an die anderen Rechner gesandt werden.
Jeder Rechner berechnet den Schuss zunächst nun unabhängig von den anderen.
Der Server ist quasi der Masterrechner, der die "Spielwirklichkeit" verwaltet.
Die Koordinaten die der Server für das Geschoss ausrechnet werden in regelmäßigen Zeitintervallen zu den anderen Rechnern gesendet, diese nehmen die neuen Koordinaten dann als Berechnungsgrundlage für den weiteren Flug.

Somit ist es möglich die Abweichungen auf allen Rechnern so gering wie möglich zu halten.

Sollte es trotzdem passieren, das auf Client2 ein Objekt zerstört wird, was auf dem Server knapp verfehlt wurde, ist das nicht tragisch, da der Server auch alle Objekte verwaltet und im nächsten Aktualisierungsschritt dem Client2 sagen würde, das das Objekt verfehlt wurde.
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group