3D-Udp Problem[Gelöst]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Blackside

Betreff: 3D-Udp Problem[Gelöst]

BeitragDi, Okt 21, 2008 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich bin gerade dabei mich etwas wieder mit Netzwerk-Programmierung einzuarbeiten,
leider habe ich nach einen Crash meines Computers, meine ganzen alten Netzcodes verloren....
Ich wollte eine simple 3D positionsübertragung der x,y,z koordinaten über udp programmieren,
doch leider scheint etwas nicht zu klappen, denn die bewegungen werden erst mit etwa 10 sekunden
verspätung übertragen wenn ich es 2 mal auf meinen rechner starten, übers internet, seh ich jedoch garnichts bewegen....
Die Spieler-Koordinaten, werden alle an den Server gesand, und dieser verteilt sie an alle anderen Spieler:

Client:
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SeedRnd MilliSecs()
SetBuffer BackBuffer()
HidePointer
Local timer = CreateTimer(80)
Local send_milli#,read_milli#
Local readsvr,readav,rbyte
Local svr = CreateUDPStream(Rnd(100,8000))
If svr <> 0 Then
   Print "Server Created..."
Else
   RuntimeError "there was an error creating the server..."
End If
;Ip
Local Ip% = INT_IP(Input("IP: "))

;Send Connect
WriteByte svr,1
SendUDPMsg svr,Ip,8767

;Player/Cam
player = CreateCube()
cam = CreateCamera(player)
MoveEntity cam,0,5,-5
RotateEntity cam,30,0,0
ScaleEntity player,.2,.2,.2
EntityType player,1
EntityRadius player,.33,.33

;light
light = CreateLight()

;Loadworld
map = LoadMesh("maps\map0.b3d")
Global brick = LoadTexture("gfx\brick.bmp")
ScaleEntity map,2,1.5,2
PositionEntity map,0,-1,0
EntityTexture map,brick
EntityType map,2


Collisions 1,2,2,2

Local ey# = EntityY(player),yv#
;HS
While Not KeyDown(1)
   WaitTimer timer
   ;gravity
   yv# = EntityY(player)-ey#
   ey# = EntityY(player)
   
   ;Bewegung
   If KeyDown(17) Then MoveEntity player,0,0,.08
   If KeyDown(31) Then MoveEntity player,0,0,-.05
   If KeyDown(30) Then MoveEntity player,-.05,0,0
   If KeyDown(32) Then MoveEntity player,.05,0,0
   If KeyDown(57) And yv# = 0  Then yv# = .15
   RotateEntity cam,EntityPitch(cam)+MouseYSpeed()/2,0,0
   RotateEntity player,0,EntityYaw(player)-MouseXSpeed()/2,0
   ;MoveMouse 512,384
   ;gravity
   TranslateEntity player,0,yv#-.005,0
   
   ;!Network
   ;read
   If read_milli < MilliSecs() Then
      readsvr = RecvUDPMsg(svr)
      If readsvr <> 0 Then
         readav = ReadAvail(svr)
         If readav <> 0 Then
            rbyte = ReadByte(svr)
            Select rbyte
               Case 1
                  ;con
                  p.Player = New Player
                  p\ip = ReadInt(svr)
                  p\port = ReadInt(svr)
                  p\model = CreateCube()
                  ScaleEntity p\model,.2,.2,.2
               Case 2
                  ;dis
                  rIp = ReadInt(svr)
                  port = ReadInt(svr)
                  For p.Player = Each Player
                     If p\ip = rIp And p\port = port Then
                        FreeEntity p\model
                        Delete p
                     End If
                  Next
               Case 3
                  rIp = ReadInt(svr)
                  port = ReadInt(svr)
                  For p.Player = Each Player
                     If p\ip = rIp And p\port = port Then
                        p\x# = ReadFloat(svr)
                        p\y# = ReadFloat(svr)
                        p\z# = ReadFloat(svr)
                     End If
                  Next
            End Select
            
         End If
      End If
      read_milli = MilliSecs()+32
   End If
   For p.Player = Each Player
      PositionEntity p\model,p\x#,p\y#,p\z#
   Next
   ;Send
   If send_milli < MilliSecs() Then
      WriteByte svr,3
      WriteFloat svr,EntityX(player)
      WriteFloat svr,EntityY(player)
      WriteFloat svr,EntityZ(player)
      
      SendUDPMsg svr,Ip,8767
      send_milli = MilliSecs()+32
   End If
   
   RenderWorld
   UpdateWorld
   
   Flip 0
Wend
WriteByte svr,3
SendUDPMsg svr,Ip,8767
CloseUDPStream svr


Type Player
   Field x#,y#,z#
   Field ip,port%
   Field model
   Field id%
End Type

Function INT_IP(IP$)
   a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a3 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a4 = Int(IP$)
   Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) + a4
End Function


Server:
Code: [AUSKLAPPEN]
Local svr = CreateUDPStream(8767)
Local send_milli#,read_milli#
Local readsvr,readav,rbyte
Local plycount,maxply
Local timer = CreateTimer(80)
If svr <> 0 Then
   Print "Server Created..."
Else
   RuntimeError "there was an error creating the server..."
End If

While Not KeyDown(1)
   WaitTimer timer
   ;read
   If read_milli < MilliSecs() Then
      readsvr = RecvUDPMsg(svr)
      If readsvr <> 0 Then
         readav = ReadAvail(svr)
         If readav <> 0 Then
            port = UDPMsgPort(svr)
            ip = UDPMsgIP(svr)   
            rbyte = ReadByte(svr)
            Select rbyte
               Case 1
                  For p.Player = Each Player
                     WriteByte svr,1
                     WriteInt svr,ip
                     WriteInt svr,port
                     SendUDPMsg svr,p\ip,p\port
                     WriteByte svr,1
                     WriteInt svr,p\ip
                     WriteInt svr,p\port
                     SendUDPMsg svr,ip,port
                  Next
                  p.Player = New Player
                  p\ip$ = ip
                  p\port = port
                  Print "Player Connected...."
               Case 2
                  For p.Player = Each Player
                     If ip = p\ip And port = p\port Then
                        Delete p
                     End If
                  Next
                  For p.Player = Each Player
                     WriteByte svr,2
                     WriteInt svr,ip
                     WriteInt svr,port
                     SendUDPMsg svr,p\ip,p\port
                  Next
                  Print "Player Disconnected..."
               Case 3
                  For p.Player = Each Player
                     If p\port = port And p\ip = ip Then
                        p\x = ReadFloat(svr)
                        p\y = ReadFloat(svr)
                        p\z = ReadFloat(svr)
                     End If
                  Next
            End Select
            
         End If
      End If
      read_milli = MilliSecs()+32
   End If
   
   ;sende an alle
   If send_milli < MilliSecs() Then
      For s.Player = Each Player
         For p.Player = Each Player
            If p\port <> s\port Then
               WriteByte svr,3
               WriteInt svr,s\ip
               WriteInt svr,s\port
               WriteFloat svr,s\x
               WriteFloat svr,s\y
               WriteFloat svr,s\z
               SendUDPMsg svr,p\ip,p\port
            End If
         Next
      Next
      send_milli = MilliSecs()+32
   End If
   
Wend

CloseUDPStream svr



Type Player
   Field x#,y#,z#
   Field ip,port%
End Type

Function INT_IP(IP$)
   a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a3 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
   a4 = Int(IP$)
   Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) + a4
End Function


Sorry wenn der Code evt. etwas unübersichtlich ist, habe schon viel dran rumprobiert, um das Problem zu lösen =(

EDIT: Ich hab das Problem gefunden, ich musste nur die "Zeitbegrenzung" beim lesen rausnehmen... Very Happy
Hier sollte eigentlich eine Signatur stehen!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group