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

![]() |
theotheoderichBetreff: Schüsse im Multiplayerspiel (UDP) an alle Rechner übertragen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Gruß
TheoTheoderich -- The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer. |
![]() |
Ornos |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() |
||
Gruß
TheoTheoderich -- The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer. |
![]() |
Ornos |
![]() Antworten mit Zitat ![]() |
---|---|---|
schade ich könnte noch fähige leute gebrauchen ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group