'netzwerkcode' funktioniert nicht

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

fringo

Betreff: 'netzwerkcode' funktioniert nicht

BeitragDi, Okt 04, 2005 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo leute, wer kann mir bei meinem netzwerk-code helfen (total newbie)?
ich versuche per udp x,y,z (position) und xrot,yrot,zrot (rotation) der spielfiguren zu übertragen. leider ist das ergebnis ziemlicher mist (die daten kommen nicht richtig an); was stimmt nicht?

die daten meines spielers werden ermittelt...
xs=TOKRB_GetX(Rbspieler(meinenr))
ys=TOKRB_GetY(Rbspieler(meinenr))
zs=TOKRB_GetZ(Rbspieler(meinenr))
xrots=TOKRB_GetPitch(RbSpieler(meinenr))
yrots=TOKRB_GetYaw(RbSpieler(meinenr))
zrots=TOKRB_GetRoll(RbSpieler(meinenr))

..dann gesendet
WriteByte stream, 1 ;-------------byte zum identifizieren
WriteByte stream, xs
WriteByte stream, 2
WriteByte stream, ys
WriteByte stream, 3
WriteByte stream, zs
WriteByte stream, 4
WriteByte stream, xrots
WriteByte stream, 5
WriteByte stream, yrots
WriteByte stream, 6
WriteByte stream, zrots
SendUDPMsg stream,ip,sendeport

..und empfangen
If RecvUDPMsg(stream)<>0
PosRot=ReadByte(stream)
Select PosRot
Case 1 xe=ReadByte(stream)
Case 2 ye=ReadByte(stream)
Case 3 ze=ReadByte(stream)
Case 4 xrote=ReadByte(stream)
Case 5 yrote=ReadByte(stream)
Case 6 zrote=ReadByte(stream)
End Select
End If

das was ankommt stimmt irgendwie nicht.. Question
 

Shaggy82

BeitragMi, Okt 05, 2005 1:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, fringo

der teil deines codes müsste so aussehen. :

Code: [AUSKLAPPEN]


; zum besseren lesen des netzwerk codes
Const Position_update = 1


.
.
.
.
.
.




xs#=TOKRB_GetX(Rbspieler(meinenr))
ys#=TOKRB_GetY(Rbspieler(meinenr))
zs#=TOKRB_GetZ(Rbspieler(meinenr))
xrots#=TOKRB_GetPitch(RbSpieler(meinenr))
yrots#=TOKRB_GetYaw(RbSpieler(meinenr))
zrots#=TOKRB_GetRoll(RbSpieler(meinenr))

..dann gesendet
WriteInt stream, Position_update ;-------------byte zum identifizieren
WriteFloat stream_out, xs
WriteFloat stream_out, ys
WriteFloat stream_out, zs
WriteFloat stream_out, xrots
WriteFloat stream_out, yrots
WriteFloat stream_out, zrots
SendUDPMsg stream_out,ip,sendeport






..und empfangen
If RecvUDPMsg(stream_in) Then
      Command = ReadInt(stream_in)
      IP      = UDPMsgIP(stream_in)
      Port    = UDPMsgPort(stream_in)

Select Command


Select Position_update ;-------------byte zum identifizieren
xe=ReadFloat(stream_in)
ye=ReadFloat(stream_in)
ze=ReadFloat(stream_in)
xrote=ReadFloat(stream_in)
yrote=ReadFloat(stream_in)
zrote=ReadFloat(stream_in)


End Select

End If



noch nen paar tips:
-sende die positions updates nur wenn sich deine position oder einer deiner winkel sich verändert hat.

-lege jeweils einen udp stream für den ein- und ausgang an.
 

fringo

Betreff: ::

BeitragMi, Okt 05, 2005 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die tipps, Shaggy (bis auf den case-fehler :]). Problem: das zeug laggt schon im lan gewaltig - fast 1 sek Surprised
 

Klaas

BeitragDo, Okt 06, 2005 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie oft sendest du das update der Position etc.?

Wenn man zu häufig die neuen Koordianten sendet kommt es zu einem Netzwerkstau der immer stärker anschwillt und zu gigantischen Latenzen führt.
Man sollte max. 10 - 20 mal pro Sekunde (besser weniger) Pakete senden.

Die Pakete sollten auch möglichst klein sein. Ein Byte oder ein Short sollten für die Winkelangaben reichen. Bei Positionsangaben kann man, jeh nachdem wie das Spiel aufgebaut ist auch auf einen Short zurück greifen.

Was ist das denn für eine Spiel? Z.B. braucht man für einen Ego-Shooter fast nie den "Roll" des Spielers! Personen rotieren ja für gewöhnlich nicht um ihre Längstachse!
 

fringo

Betreff: :.

BeitragFr, Okt 07, 2005 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die tipps. "Personen rotieren ja für gewöhnlich nicht um ihre Längsachse" - naja, wenn sie ordentlich prügel bekommen schon ;]. nein, also es ist einfach ein kleines versuchprogrammerl mit tokamak - wollte sehen ob ich das ohne vorerfahrung im netzwerk hinbekomme.
die daten sende ich eigentliche immer. wenn ich dich richtig verstehe is das programm eigentlich zu schnell (stau). wie würdest du das auf 10-20x/sek limitieren? einfach mitzählern und dann stoppen?

BtbN

BeitragSa, Okt 08, 2005 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
If MilliSecs()-lastsend >= (1000/25) Then ;(1000/25) -> er sendet 25 mal in der sekunde
;Dein gezeugs senden
lastsend = MilliSecs()
EndIf


So geht das xD

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group