Positionsübertragung per LAN

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

count-doku

Betreff: Positionsübertragung per LAN

BeitragDi, Jan 27, 2009 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe ein kleines LAN-Spiel geschrieben:
Code: [AUSKLAPPEN]
Graphics 800, 600
SetBuffer BackBuffer()
Inp_Port = 4000
Out_Port = 4001
ip_count = CountHostIPs(GetEnv("localhost"))

Repeat
   Text 0, 0, "UDP Game"
      Text 0, 10, "LOCAL IP:"
      For i = 1 To ip_count
         Text 0, 20, DottedIP(HostIP(1))
      Next
      Text 0, 30, "Enter Opponent´s IP#: xxx.xxx.xxx.xxx"
      Dest_IP$ = NewInput$(Dest_IP$)
      Text 0, 40, ">" + Dest_IP$ + "|"
      Flip
      Cls
Until KeyDown(28)

IP = INT_IP(Dest_IP$)
udp_rd = CreateUDPStream(Inp_Port)
udp_wr = CreateUDPStream(Out_Port)
FlushKeys()
mred=0
mgreen=0
mblue=255
ored=255
ogreen=0
oblue=0
Repeat
   Text 0,0,"Waiting for opponent..."
   WriteByte(udp_wr, 123)
    SendUDPMsg udp_wr, IP, Inp_Port
   IP_rd = RecvUDPMsg(udp_rd)
    byte1 = ReadByte(udp_rd)
   Flip
   Cls
Until byte1=123
   
Cls:Flip
Cls:Flip
mex=30
mey=50
Repeat
   Text 0,0,"Connected..."
   Text 0,15,"Blue Point > You"
   Text 0,30,"Red Point > Opponent"
   
   If KeyDown(200) Then mey=mey-1
   If KeyDown(208) Then mey=mey+1
   If KeyDown(203) Then mex=mex-1
   If KeyDown(205) Then mex=mex+1
   
   IP_rd = RecvUDPMsg(udp_rd)
        otx = ReadFloat(udp_rd)
   IP_rd = RecvUDPMsg(udp_rd)
        oty = ReadFloat(udp_rd)

   WriteFloat(udp_wr, mex)
        SendUDPMsg udp_wr, IP, Inp_Port
   WriteFloat(udp_wr, mey)
        SendUDPMsg udp_wr, IP, Inp_Port
   
   Color ored,ogreen,oblue
   Oval otx,oty,4,4,1
   Color mred,mgreen,mblue
   Oval mex,mey,4,4,1
   Color 255,255,255
   
      Flip
      Cls
Until KeyDown(1)

CloseUDPStream udp_wr
CloseUDPStream udp_rd
End

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

Function NewInput$(currentText$)
      localChar = GetKey()
      If (localChar > 0) And (localChar <> 8 ) Then
      currentText$ = currentText$ + Chr$(localChar)
      ElseIf localChar = 8 Then
       length = Len(currentText)
       If length > 0 Then
           currentText = Left(currentText, length - 1)
         EndIf
      EndIf
      Return currentText$
End Function


Komischerweise springt der Punkt manchmal einfach so hin und her.
Und startet verzögert.

Woran kann das liegen?

count-doku

Tankbuster

BeitragDi, Jan 27, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ersetzt mal:
Code: [AUSKLAPPEN]

   IP_rd = RecvUDPMsg(udp_rd)
        otx = ReadFloat(udp_rd)
   IP_rd = RecvUDPMsg(udp_rd)
        oty = ReadFloat(udp_rd)


durch:
Code: [AUSKLAPPEN]
IP_rd = RecvUDPMsg(udp_rd)
If IP_rd Then
        otx = ReadFloat(udp_rd)
        oty = ReadFloat(udp_rd)
Endif


Sonst könnte es sein, dass in einem Schleifendurchlauf keine Variable empfangen wird, und deshalb otx oder oty nicht den richtigen Wert hat.

EDIT: Ich möchte noch anmerken, dass das nicht gerade sauber programmiert ist. Pro Schleifendurchlauf wird der Stream nur einmal ausgelesen. Dabei könnte es sein, dass viel mehr Nachrichten empfangen werden, als ausgelesen werden können. Das heißt, dass dein Programm unweigerlich zu einem Datenstau füren wird, wenn Beide Programme nicht über die exakten FPS verfügen Wink
Twitter
Download Jewel Snake!
Windows|Android

count-doku

BeitragDi, Jan 27, 2009 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Very Happy

Es funktioniert sehr gut.

Ich habe es jetzt so:
Code: [AUSKLAPPEN]

IP_rd = RecvUDPMsg(udp_rd)
If IP_rd
    otx = ReadFloat(udp_rd)
    oty = ReadFloat(udp_rd)
EndIf

WriteFloat(udp_wr, mex)
WriteFloat(udp_wr, mey)
SendUDPMsg udp_wr, IP, Inp_Port


count-doku

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group