UDP-Problem Spieler sehen sich nicht!

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

BadDeath

Betreff: UDP-Problem Spieler sehen sich nicht!

BeitragMo, Jun 02, 2008 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo! Ich versuche mich an einem Mehrspielerspiel über das Internet mit Hilfe von UDP. Eigentlich funktioniert das auch recht gut, nur hat es einen entscheidenden Fehler: Die anderen Spieler sehen einander nicht, nur sich und dern Server. Ich denke mal, dass ich nen simplen Denkfehler habe, aber ich komm nicht drauf, welcher das ist. Rolling Eyes

Der Stan der Dinge:

Code: [AUSKLAPPEN]
Global LastPing, PingTime, Modus, Stream, ServerIP

Const NewPlayer  = 1
Const MovePlayer = 2
Const Msg        = 3
Const Ping       = 4
Const PingAnswer = 5

Type Player
   Field IP
   Field Mesh
End Type

Graphics3D 640,480,32,2

n = CountHostIPs("")
MeineIP = HostIP(1)

modus=Input("0 = Server  |  1 = Client : ")

If Modus Then
   ServerIP=Int_IP(Input("IP des Anderen? "))
   If ServerIP < 10 Then ServerIP = Int_IP("89.247.55.186")
   stream=CreateUDPStream(6000+modus)
   WriteByte stream, NewPlayer
   SendUDPMsg stream, ServerIP, 6001-modus
   AppTitle "Client"
Else
   stream=CreateUDPStream(6000+modus)
   AppTitle "Server"
End If

SetBuffer BackBuffer()

light=CreateLight()
RotateEntity light,90,0,0

cube=CreateCube()
PositionEntity cube,0,1,10
EntityColor cube,0,0,255

Boden = CreatePlane()
tex=LoadTexture( "Rasen.bmp" )
EntityTexture boden,tex

camera=CreateCamera()
PositionEntity camera, 0,5,0
TurnEntity camera,20,0,0
EntityParent camera, cube

Timer = CreateTimer(60)
LastPing = MilliSecs()

While Not KeyDown (1)
   Cls

   Pos# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
      If KeyDown(200)=True Then MoveEntity cube,0,0,0.2
      If KeyDown(208)=True Then MoveEntity cube,0,0,-0.2
      If KeyDown(205)=True Then TurnEntity cube,0,-3,0
      If KeyDown(203)=True Then TurnEntity cube,0,3,0
   Pos2# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
      
   UpdateWorld
   RenderWorld
      
   If KeyHit(57) Then
      Text 0,20, "send"
      If Modus Then
         WriteByte Stream, Msg
         WriteInt(stream,Rand(0,44))
         SendUDPMsg(stream,ServerIP,6001-modus)
      Else
         For P.Player = Each Player
            WriteByte Stream, Msg
            WriteInt(stream,Rand(0,44))
            SendUDPMsg(stream,P\IP,6001-modus)
         Next
      End If   
   EndIf
   
   Ping()
   
   recv=RecvUDPMsg(stream)
   If(recv<>0)
      While(ReadAvail(Stream)>0)
         In = 0
         In = ReadByte(stream)
         InIP = UDPMsgIP(stream)
                  
         Select In
            Case NewPlayer
               P.Player = New Player
               InIP = UDPMsgIP(stream)
               P\IP = InIp
               P\Mesh = CreateCube()
               EntityColor P\Mesh, 255,0,0
               
               If Modus = 0 Then
                  For P.Player = Each Player
                     WriteByte stream, NewPlayer
                     SendUDPMsg stream, InIp, 6001-modus
                  Next
               End If
               
            Case MovePlayer
               X# = ReadFloat(stream)
               Y# = ReadFloat(stream)
               Z# = ReadFloat(stream)
               Turn = ReadInt(stream)
                  
               If Modus = 0 Then
                  For P.Player = Each player
                     If InIP <> P\IP Then
                        WriteByte stream, MovePlayer
                        WriteInt stream, X
                        WriteInt stream, Y
                        WriteInt stream, Z
                        SendUDPMsg stream, P\IP, 6001-modus
                     End If
                        
                     If InIP = P\IP Then
                        PositionEntity P\Mesh,X#,Y#,Z#
                        RotateEntity P\Mesh, 0, Turn, 0, 1
                     End If
                  Next
               Else
                  For P.Player = Each Player
                     If InIP = P\IP Then
                        PositionEntity P\Mesh,X#,Y#,Z#
                        RotateEntity P\Mesh, 0, Turn, 0, 1
                     End If
                  Next
               End If
               
            Case Msg
               Text 0,20, "Incoming: "+ReadInt(stream)
               
            Case Ping
               WriteByte stream, PingAnswer
               SendUDPMsg stream, InIP, 6001-modus
               
            Case PingAnswer
               PingTime = MilliSecs() - PingTime
               
         End Select
      Wend
      recv=RecvUDPMsg(stream)
   End If
   
   If Pos# <> Pos2# Then
      If Modus Then
         WriteByte stream, MovePlayer
         WriteFloat stream, EntityX#(Cube)
         WriteFloat stream, EntityY#(Cube)
         WriteFloat stream, EntityZ#(Cube)
         WriteInt stream, EntityYaw(cube)
         SendUDPMsg stream, ServerIP, 6001-modus
      Else
         For P.Player = Each Player
            WriteByte stream, MovePlayer
            WriteFloat stream, EntityX#(Cube)
            WriteFloat stream, EntityY#(Cube)
            WriteFloat stream, EntityZ#(Cube)
            WriteInt stream, EntityYaw(cube)
            SendUDPMsg stream, P\IP, 6001-modus
         Next
      End If   
   End If

   Text 0,100, EntityX(cube)
   Text 0,130, EntityZ(cube)
   
   Text 0,180, EntityYaw(cube)
   
   If Modus Then Text 0,5, "Ping: " + PingTime
   
   WaitTimer Timer
   Flip 0
Wend
End
CloseUDPStream stream




Function Ping()
   If Modus And (MilliSecs() - LastPing > 1000) Then
      WriteByte Stream, Ping
      SendUDPMsg(stream,ServerIP,6001-modus)
      PingTime = MilliSecs()
      LastPing = PingTime
   End If
End Function


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function
 

BadDeath

BeitragDi, Jun 03, 2008 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Keiner eine Idee?

ToeB

BeitragDi, Jun 03, 2008 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du denn sehen ob die Spieler überhaubt eine Verbindung zum Server haben ? Wenn nicht, könnte es daran leiegn, dass du mehrer Nachrichten schickst in einer Schleife ...

ka ^^

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

BadDeath

BeitragDi, Jun 03, 2008 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, also die Spieler sehen jeweils ihren Würfel und den Server-Würfel, auch, wenn er sich bewegt.

Holzchopf

Meisterpacker

BeitragDi, Jun 03, 2008 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin jetzt nur kurz drübergeflogen...

AAAAAABER: Wenn mich nicht alles täuscht, liegt es an folgendem:
Der Server schickt, sobald er von einem Client neue Positionen bekommt, diese sofort weiter (was im Prinzip ja auch gut ist) - jedoch ohne ID des Spielers, der bewegt werden sollte =) Also wenn ich das richtig sehe, dann wählt der Client den betreffenden Spieler anhand der absender-IP aus, welche aber (dank Server-Client-Netzwerk) immer die Server-IP sein wird.
Wähle hier eine eindeutige ID, die vom Server verwaltet und an den Client vergeben wird. Mit dieser identifizieren sich dann alle Spieler auf allen im Netz verbundenen Rechnern.
Ausserdem schickst du beim Beitritt eines neuen Spielers nur dem neuen die Infos der bestehenden Spieler, da musst du natürlich auch den bestehenden die Info schicken, dass ein neuer da ist.

Das ist alles, was ich so auf die Schnelle erkennen konnte.

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Shark

BeitragDi, Jun 03, 2008 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde mal sagen, der Fehler ist es, dass die anderen Clients nicht mitbekommen, dass es ein neu zugang gibt!

Code: [AUSKLAPPEN]
                        Select In
            Case NewPlayer
               P.Player = New Player
               InIP = UDPMsgIP(stream)
               P\IP = InIp
               P\Mesh = CreateCube()
               EntityColor P\Mesh, 255,0,0
               
               If Modus = 0 Then
                  For P.Player = Each Player
                     WriteByte stream, NewPlayer
                     SendUDPMsg stream, InIp, 6001-modus
                  Next
               End If 

Da der Server zu den anderen Clients das senden muss, müsste es doch heißen.... If Modus = 1 then ....

Ich hoffe, dass es dein Fehler ist Wink

mfg Shark
 

BadDeath

BeitragDi, Jun 03, 2008 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
An Holzchopf: Danke, das viel mir garnicht auf. Embarassed Danke, werde es mal testen und hier das Ergebnis posten.

An Shark: Eigentlich nicht, denn der Client hat Modus = 1, und der Sever = 0. Und der Server verwaltet die Spieler, oder sollte es zumindest

PS: Danke an alle Drei für die schnelle Antwort nach meiner Drängelei. Very Happy


-----------------------------------

EDIT:

also ich habe nun probiert und probiert... aber es will immernoch nicht gehen. und wenn nun 2 spieler auf dem server sind, hat der nicht mal mehr 10 fps und der belegte ram nimmt stetig zu ^^

Code: [AUSKLAPPEN]
Global LastPing, PingTime, Modus, Stream, ServerIP, MeineID

Global Counter = 0

Const NewPlayer  = 1
Const NewPlayer2 = 2
Const MovePlayer = 3
Const Msg        = 4
Const Ping       = 5
Const PingAnswer = 6
Const AskForID   = 7
Const IDAnswer   = 8

Type Player
   Field IP
   Field Mesh
   Field ID
End Type

Graphics3D 640,480,32,2

n = CountHostIPs("")
MeineIP = HostIP(1)

modus=Input("0 = Server  |  1 = Client : ")

If Modus Then
   ServerIP=Int_IP(Input("IP des Anderen? "))
   If ServerIP < 10 Then ServerIP = Int_IP("62.117.13.233")
   stream=CreateUDPStream(6000+modus)
   WriteByte stream, NewPlayer2
   SendUDPMsg stream, ServerIP, 6001-modus
   AppTitle "Client"
Else
   stream=CreateUDPStream(6000+modus)
   AppTitle "Server"
End If

SetBuffer BackBuffer()

light=CreateLight()
RotateEntity light,90,0,0

cube=CreateCube()
PositionEntity cube,0,1,10
EntityColor cube,0,0,255

Boden = CreatePlane()
tex=LoadTexture( "Rasen.bmp" )
EntityTexture boden,tex

camera=CreateCamera()
PositionEntity camera, 0,5,0
TurnEntity camera,20,0,0
EntityParent camera, cube

Timer = CreateTimer(60)
LastPing = MilliSecs()

While Not KeyDown (1)
   Cls
   
   If MeineID = 0 And Modus = 1 Then
      WriteByte stream, AskForID
      SendUDPMsg stream, ServerIP, 6001-modus
   End If
   
   Pos# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
      If KeyDown(200)=True Then MoveEntity cube,0,0,0.2
      If KeyDown(208)=True Then MoveEntity cube,0,0,-0.2
      If KeyDown(205)=True Then TurnEntity cube,0,-3,0
      If KeyDown(203)=True Then TurnEntity cube,0,3,0
   Pos2# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
      
   UpdateWorld
   RenderWorld
      
   If KeyHit(57) Then
      Text 0,20, "send"
      If Modus Then
         WriteByte Stream, Msg
         WriteInt(stream,Rand(0,44))
         SendUDPMsg(stream,ServerIP,6001-modus)
      Else
         For P.Player = Each Player
            WriteByte Stream, Msg
            WriteInt(stream,Rand(0,44))
            SendUDPMsg(stream,P\IP,6001-modus)
         Next
      End If   
   EndIf
   
   Ping()
   
   recv=RecvUDPMsg(stream)
   If(recv<>0)
      While(ReadAvail(Stream)>0)
         In = 0
         In = ReadByte(stream)
         InIP = UDPMsgIP(stream)
                  
         Select In
            Case NewPlayer ;#################################
               P.Player = New Player
               P\ID = ReadInt(Stream)
               P\IP = InIp
               P\Mesh = CreateCube()
               EntityColor P\Mesh, 255,0,0
            
            Case NewPlayer2 ;#################################
               Counter = Counter + 1
               
               P.Player = New Player
               P\ID = GetID(In) ;ReadInt(Stream)
               P\IP = InIp
               P\Mesh = CreateCube()
               EntityColor P\Mesh, 255,0,0
               
               For P.Player = Each Player
                  WriteByte stream, NewPlayer
                  WriteInt stream, Counter
                  SendUDPMsg stream, P\Ip, 6001-modus
                  
                  WriteByte stream, NewPlayer
                  WriteInt stream, P\ID
                  SendUDPMsg stream, InIp, 6001-modus
               Next
               
            Case MovePlayer ;#################################
               X# = ReadFloat(stream)
               Y# = ReadFloat(stream)
               Z# = ReadFloat(stream)
               Turn = ReadInt(stream)
                  
               If Modus = 0 Then
                  AktuelleID = GetID(InIP)
                  For P.Player = Each player
                     If InIP <> P\IP Then
                        WriteByte stream, MovePlayer
                        WriteInt stream, X
                        WriteInt stream, Y
                        WriteInt stream, Z
                        WriteInt stream, AktuelleID
                        SendUDPMsg stream, P\IP, 6001-modus
                     End If
                        
                     If InIP = P\IP Then
                        PositionEntity P\Mesh,X#,Y#,Z#
                        RotateEntity P\Mesh, 0, Turn, 0, 1
                     End If
                  Next
               Else
                  For P.Player = Each Player
                     If InIP = P\IP Then
                        PositionEntity P\Mesh,X#,Y#,Z#
                        RotateEntity P\Mesh, 0, Turn, 0, 1
                     End If
                  Next
               End If
               
            Case Msg ;#################################
               Text 0,20, "Incoming: "+ReadInt(stream)
               
            Case Ping ;#################################
               WriteByte stream, PingAnswer
               SendUDPMsg stream, InIP, 6001-modus
               
            Case PingAnswer ;#################################
               PingTime = MilliSecs() - PingTime
               
            Case AskForID
               WriteByte stream, IDAnswer
               WriteByte stream, GetID(InIP)
               SendUDPMsg stream, InIP, 6001-modus   
            
            Case IDAnswer
               MeineID = ReadInt(Stream)
               
         End Select
      Wend
      recv=RecvUDPMsg(stream)
   End If
   
   If Pos# <> Pos2# Then
      If Modus = 1 Then
         WriteByte stream, MovePlayer
         WriteFloat stream, EntityX#(Cube)
         WriteFloat stream, EntityY#(Cube)
         WriteFloat stream, EntityZ#(Cube)
         WriteInt stream, EntityYaw(cube)
         WriteInt stream, MeineID
         SendUDPMsg stream, ServerIP, 6001-modus
      Else
         For P.Player = Each Player
            WriteByte stream, MovePlayer
            WriteFloat stream, EntityX#(Cube)
            WriteFloat stream, EntityY#(Cube)
            WriteFloat stream, EntityZ#(Cube)
            WriteInt stream, EntityYaw(cube)
            WriteInt stream, MeineID
            SendUDPMsg stream, P\IP, 6001-modus
         Next
      End If   
   End If

   Text 0,100, EntityX(cube)
   Text 0,130, EntityZ(cube)
   Text 0,160, EntityYaw(cube)
   
   Text 0,200, "Meine ID: " + MeineID
   
   If Modus Then Text 0,5, "Ping: " + PingTime
   
   WaitTimer Timer
   Flip 0
Wend
End
CloseUDPStream stream




Function GetID(IP)
   For p.Player = Each player
      If P\IP = IP Then
         Return P\ID
      Else
         Return Counter
      End If
   Next
End Function



Function Ping()
   If (LastPing - MilliSecs() ) > 30000 And Modus > 0 Then RuntimeError "Zeitüberschreitung!"
   If Modus And (MilliSecs() - LastPing > 999) Then
      WriteByte Stream, Ping
      SendUDPMsg(stream,ServerIP,6001-modus)
      PingTime = MilliSecs()
      LastPing = PingTime
   End If
End Function


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function

The_Nici

BeitragMi, Jun 04, 2008 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du jeden Schleifendurchlauf Daten da reinstopfts ists logisch, dass es langsam läuft. Wink
 

BadDeath

BeitragMi, Jun 04, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Dennoch sehen sich die Spieler nicht ^^
 

BadDeath

BeitragFr, Jun 06, 2008 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh, ich bekomme den Code einfach nicht zum laufen... Bin wohl zu blöd Embarassed
Kann ihn sich trotzdem noch mal jemand angucken, BITTE?

Danke schonmal!

Hier die "aktuellste" Version:

Code: [AUSKLAPPEN]
Global LastPing, PingTime, Modus, Stream, ServerIP, MeineID

Global Counter = 0

Const NewPlayer  = 1
Const NewPlayer2 = 2
Const MovePlayer = 3
Const Msg        = 4
Const Ping       = 5
Const PingAnswer = 6
Const AskForID   = 7
Const IDAnswer   = 8

Type Player
   Field IP
   Field Mesh
   Field ID
End Type

Graphics3D 640,480,32,2

n = CountHostIPs("")
MeineIP = HostIP(1)

modus=Input("0 = Server  |  1 = Client : ")

If Modus Then
   ServerIP=Int_IP(Input("IP des Anderen? "))
   If ServerIP < 10 Then ServerIP = Int_IP("127.0.0.1")
   stream=CreateUDPStream(6000+modus)
   WriteByte stream, NewPlayer2
   SendUDPMsg stream, ServerIP, 6001-modus
   AppTitle "Client"
Else
   stream=CreateUDPStream(6000+modus)
   AppTitle "Server"
End If

SetBuffer BackBuffer()

light=CreateLight()
RotateEntity light,90,0,0

cube=CreateCube()
PositionEntity cube,0,1,10
EntityColor cube,0,0,255

Boden = CreatePlane()
tex=LoadTexture("Rasen.bmp")
EntityTexture boden,tex

camera=CreateCamera()
PositionEntity camera, 0,5,0
TurnEntity camera,20,0,0
EntityParent camera, cube

Timer = CreateTimer(60)
LastPing = MilliSecs()

While Not KeyDown (1)
   Cls
   
   Zahl = Zahl + 1
   If Zahl = 5 Then Zahl = 1
   
   UpdateWorld
   RenderWorld
      
   
   If Zahl Then
   
      Pos# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
         If KeyDown(200)=True Then MoveEntity cube,0,0,0.2
         If KeyDown(208)=True Then MoveEntity cube,0,0,-0.2
         If KeyDown(205)=True Then TurnEntity cube,0,-3,0
         If KeyDown(203)=True Then TurnEntity cube,0,3,0
      Pos2# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
      
      Ping()
      
      recv=RecvUDPMsg(stream)
      If(recv<>0)
         While(ReadAvail(Stream)>0)
            In = 0
            In = ReadByte(stream)
            InIP = UDPMsgIP(stream)
                     
            Select In
               Case NewPlayer ;#################################
                  P.Player = New Player
                  P\ID = ReadInt(Stream)
                  P\IP = InIp
                  P\Mesh = CreateCube()
                  EntityColor P\Mesh, 255,0,0
               
               Case NewPlayer2 ;#################################
                  Counter = Counter + 1
                  
                  P.Player = New Player
                  P\ID = Counter ;ReadInt(Stream)
                  P\IP = InIp
                  P\Mesh = CreateCube()
                  EntityColor P\Mesh, 255,0,0
                  
                  WriteByte stream, IDAnswer
                  WriteInt stream, Counter
                  SendUDPMsg stream, InIP, 6001-modus
                  
                  For P.Player = Each Player
                     WriteByte stream, NewPlayer
                     WriteInt stream, Counter
                     SendUDPMsg stream, P\Ip, 6001-modus
                  Next
                  
                  For P.Player = Each Player   
                     WriteByte stream, NewPlayer
                     WriteInt stream, P\ID
                     SendUDPMsg stream, InIp, 6001-modus
                  Next
                                    
               Case MovePlayer ;#################################
                  X# = ReadFloat(stream)
                  Y# = ReadFloat(stream)
                  Z# = ReadFloat(stream)
                  Turn = ReadInt(stream)
                  AktuelleID = GetID(InIP)
                     
                  If Modus = 0 Then
                     For P.Player = Each player
                        If InIP <> P\IP Then
                           WriteByte stream, MovePlayer
                           WriteFloat stream, X#
                           WriteFloat stream, Y#
                           WriteFloat stream, Z#
                           WriteInt stream, AktuelleID
                           SendUDPMsg stream, P\IP, 6001-modus
                        End If
                           
                        If InIP = P\IP Then
                           PositionEntity P\Mesh,X#,Y#,Z#
                           RotateEntity P\Mesh, 0, Turn, 0, 1
                           Exit
                        End If
                     Next
                  Else
                     For P.Player = Each Player
                        If P\ID = AktuelleID Then
                           PositionEntity P\Mesh,X#,Y#,Z#
                           RotateEntity P\Mesh, 0, Turn, 0, 1
                           Exit
                        End If
                     Next
                  End If
                  
               Case Msg ;#################################
                  Text 0,20, "Incoming: "+ReadInt(stream)
                  
               Case Ping ;#################################
                  WriteByte stream, PingAnswer
                  SendUDPMsg stream, InIP, 6001-modus
                  
               Case PingAnswer ;#################################
                  PingTime = MilliSecs() - PingTime
                  
               ;Case AskForID ;#################################
               ;   WriteByte stream, IDAnswer
               ;   WriteByte stream, GetID(InIP)
               ;   SendUDPMsg stream, InIP, 6001-modus   
               
               Case IDAnswer ;#################################
                  MeineID = ReadInt(Stream)
                  
            End Select
         Wend
         recv=RecvUDPMsg(stream)
      End If
      
      If Pos# <> Pos2# Then
         If Modus = 1 Then
            WriteByte stream, MovePlayer
            WriteFloat stream, EntityX#(Cube)
            WriteFloat stream, EntityY#(Cube)
            WriteFloat stream, EntityZ#(Cube)
            WriteInt stream, EntityYaw(cube)
            WriteInt stream, MeineID
            SendUDPMsg stream, ServerIP, 6001-modus
         Else
            For P.Player = Each Player
               WriteByte stream, MovePlayer
               WriteFloat stream, EntityX#(Cube)
               WriteFloat stream, EntityY#(Cube)
               WriteFloat stream, EntityZ#(Cube)
               WriteInt stream, EntityYaw(cube)
               WriteInt stream, P\ID
               SendUDPMsg stream, P\IP, 6001-modus
            Next
         End If   
      End If
   EndIf
   
   Text 0,100, EntityX(cube)
   Text 0,130, EntityZ(cube)
   Text 0,160, EntityYaw(cube)
   
   Text 0,200, "Meine ID: " + MeineID
   If modus = 0 Then Text 0,250, "Spieler: " + Counter
   If Modus Then Text 0,5, "Ping: " + PingTime
   
   WaitTimer Timer
   Flip 0
Wend

End
CloseUDPStream stream




Function GetID(IP)
   For p.Player = Each player
      If P\IP = IP Then Return P\ID
   Next
End Function


Function Ping()
   If (LastPing - MilliSecs() ) > 30000 And Modus > 0 Then RuntimeError "Zeitüberschreitung!"
   If Modus And (MilliSecs() - LastPing > 999) Then
      WriteByte Stream, Ping
      SendUDPMsg(stream,ServerIP,6001-modus)
      PingTime = MilliSecs()
      LastPing = PingTime
   End If
End Function


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function

Holzchopf

Meisterpacker

BeitragFr, Jun 06, 2008 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich werde in mir mal angucken, könnte aber ein Weilchen dauern =)

Übrigens:
Ich werde da jetzt einfach ziemlich viele DebugLogs einbauen und dann anhand der Debugausgaben das Problem analysieren. Sollte ich dir nachher tatsächlich einen laufenden Code hinreichen können, müsstest du wohl mit der selben Taktik dahinter, um den Fehler nachvollziehen zu können.

bis gleich...
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

BadDeath

BeitragFr, Jun 06, 2008 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank! Ich bin verzweifel nämlich langsam...

Danke dir, bin schon auf das Ergebnis gespannt Very Happy

Holzchopf

Meisterpacker

BeitragFr, Jun 06, 2008 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
So, habs =)

Warst gar nicht mal weit daneben!
Was du vielleicht noch wissen solltest: Du musst dem Client keinen festen Port zuweisen, du musst ja schliesslich anfangs nur den vom Host wissen. Der Server kann dann, sobald er eine Nachricht bekommt, mittels UdpMsgPort rausfinden, wohin er es zurückschicken muss (funktioniert so aber nur, wenn man für Senden und Empfangen den selben Stream benutzt).

Hab das Programm ins 2-Dimensionale konvertiert, rein spaßeshalber Wink
Code: [AUSKLAPPEN]

Global LastPing, PingTime, Modus, Stream, ServerIP, MeineID

Global Counter = 0

Global ServerPort = 50000

Const NewPlayer  = 1
Const NewPlayer2 = 2
Const MovePlayer = 3
Const Msg        = 4
Const Ping       = 5
Const PingAnswer = 6
Const AskForID   = 7
Const IDAnswer   = 8

Type Player
   Field IP, Port
   Field Mesh
   Field ID
   
   Field x, y, z, yaw
End Type

;Graphics3D 640,480,32,2
Graphics 400,300,0,2

n = CountHostIPs("")
MeineIP = HostIP(1)

Modus=Input("0 = Server  |  1 = Client : ")

If Modus Then
;   ServerIP=INT_IP(Input("IP des Anderen? "))
;   If ServerIP < 10 Then ServerIP = INT_IP("127.0.0.1")
   ServerIP = INT_IP("127.0.0.1")
   Stream=CreateUDPStream()
   WriteByte Stream, NewPlayer2
   SendUDPMsg Stream, ServerIP, ServerPort
   AppTitle "Client"
DebugLog "Client"
Else
   Stream=CreateUDPStream(ServerPort)
   AppTitle "Server"
DebugLog "Server"
End If

SetBuffer BackBuffer()

;light=CreateLight()
;RotateEntity light,90,0,0

;cube=CreateCube()
;PositionEntity cube,0,1,10
;EntityColor cube,0,0,255

;Boden = CreatePlane()
;tex=LoadTexture("Rasen.bmp")
;EntityTexture boden,tex

;camera=CreateCamera()
;PositionEntity camera, 0,5,0
;TurnEntity camera,20,0,0
;EntityParent camera, cube

Timer = CreateTimer(60)
LastPing = MilliSecs()

Local PlayerLocal.Player = New Player
PlayerLocal\x = 200
PlayerLocal\y = 150

While Not KeyDown (1)
   Cls
   
   Zahl = Zahl + 1
   If Zahl = 5 Then Zahl = 1
   
   ;UpdateWorld
   ;RenderWorld
     
   
   If True Then
   
;      Pos# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
;         If KeyDown(200)=True Then MoveEntity cube,0,0,0.2
;         If KeyDown(208)=True Then MoveEntity cube,0,0,-0.2
;         If KeyDown(205)=True Then TurnEntity cube,0,-3,0
;         If KeyDown(203)=True Then TurnEntity cube,0,3,0
;      Pos2# = EntityX#(Cube) + EntityY#(Cube) + EntityZ#(Cube) + EntityYaw#(cube)
      Pos# = PlayerLocal\x +PlayerLocal\y
      PlayerLocal\x = PlayerLocal\x +KeyDown(205) -KeyDown(203)
      PlayerLocal\y = PlayerLocal\y +KeyDown(208) -KeyDown(200)
      Pos2# = PlayerLocal\x +PlayerLocal\y
     
      ;Ping()
     
      recv=RecvUDPMsg(Stream)
      While(recv<>0)
DebugLog "Got Message from " +DottedIP(recv)
         While(ReadAvail(Stream)>0)
            In = 0
            In = ReadByte(Stream)
            InIP = UDPMsgIP(Stream)
         InPort = UDPMsgPort(stream)
DebugLog "IP: " +inIP +"  Port: " +inPort
                     
            Select In
               Case NewPlayer ;#################################
DebugLog "NewPlayer"
                  P.Player = New Player
                  P\ID = ReadInt(Stream)
                  P\IP = InIp
                  ;P\Mesh = CreateCube()
                  ;EntityColor P\Mesh, 255,0,0
DebugLog "ID: " +P\ID
               
               Case NewPlayer2 ;#################################
DebugLog "NewPlayer2"
                  Counter = Counter + 1
                 
                  P.Player = New Player
                  P\ID = Counter ;ReadInt(Stream)
                  P\IP = InIp
               P\Port = InPort
                  ;P\Mesh = CreateCube()
                  ;EntityColor P\Mesh, 255,0,0
                 
                  WriteByte Stream, IDAnswer
                  WriteInt Stream, Counter
                  SendUDPMsg Stream, InIP, InPort
                 
              ; Allen Spielern mitteilen, dass ein neuer da ist
                  For P.Player = Each Player
               If p <> playerlocal And p\id <> counter
                        WriteByte Stream, NewPlayer
                        WriteInt Stream, Counter
                        SendUDPMsg Stream, P\Ip, P\Port
               EndIf
                  Next
                 
              ; Dem neuen Spieler alle bestehenden übergeben
                  For P.Player = Each Player
               If p\id <> counter
                     WriteByte Stream, NewPlayer
                     WriteInt Stream, P\ID
                     SendUDPMsg Stream, InIp, InPort
               EndIf
                  Next
                                   
               Case MovePlayer ;#################################
DebugLog "Move Player"
                  X# = ReadFloat(Stream)
                  Y# = ReadFloat(Stream)
                  Z# = ReadFloat(Stream)
                  Turn = ReadInt(Stream)
                  ;AktuelleID = GetID(InIP)
              AktuelleID = ReadInt(Stream)
DebugLog "ID: " +aktuelleID
             
              ;Server
                  If Modus = 0 Then
                     For P.Player = Each Player
                        If AktuelleID <> P\ID And p<>playerlocal Then
                           WriteByte Stream, MovePlayer
                           WriteFloat Stream, X#
                           WriteFloat Stream, Y#
                           WriteFloat Stream, Z#
                     WriteInt Stream, Turn
                           WriteInt Stream, AktuelleID
                           SendUDPMsg Stream, P\IP, P\Port
                        End If
                           
                        If AktuelleID = P\ID Then
                           ;PositionEntity P\Mesh,X#,Y#,Z#
                           ;RotateEntity P\Mesh, 0, Turn, 0, 1
                     P\x = x
                     P\y = y
                     P\z = z
                     P\yaw = turn
                           ;Exit
                        End If
                     Next
                  Else
                     For P.Player = Each Player
                        If P\ID = AktuelleID Then
                           ;PositionEntity P\Mesh,X#,Y#,Z#
                           ;RotateEntity P\Mesh, 0, Turn, 0, 1
                     P\x = x
                     P\y = y
                     P\z = z
                     P\yaw = turn
                           Exit
                        End If
                     Next
                  End If
                 
               Case Msg ;#################################
                  Text 0,20, "Incoming: "+ReadInt(Stream)
                 
               Case Ping ;#################################
                  WriteByte Stream, PingAnswer
                  SendUDPMsg Stream, InIP, InPort
                 
               Case PingAnswer ;#################################
                  PingTime = MilliSecs() - PingTime
                 
               ;Case AskForID ;#################################
               ;   WriteByte stream, IDAnswer
               ;   WriteByte stream, GetID(InIP)
               ;   SendUDPMsg stream, InIP, 6001-modus   
               
               Case IDAnswer ;#################################
DebugLog "ID Answer"
                  MeineID = ReadInt(Stream)
              playerlocal\id = meineID
                 
            End Select
         Wend
         recv=RecvUDPMsg(Stream)
      Wend
     
      If Pos# <> Pos2# Then
         If Modus = 1 Then
            WriteByte Stream, MovePlayer
            ;WriteFloat Stream, EntityX#(Cube)
            ;WriteFloat Stream, EntityY#(Cube)
            ;WriteFloat Stream, EntityZ#(Cube)
            ;WriteInt Stream, EntityYaw(cube)
         WriteFloat Stream, PlayerLocal\x
         WriteFloat Stream, PlayerLocal\y
         WriteFloat Stream, PlayerLocal\z
         WriteInt Stream, 0
            WriteInt Stream, MeineID
            SendUDPMsg Stream, ServerIP, ServerPort
         Else
            For P.Player = Each Player
            If p<>playerlocal
               WriteByte Stream, MovePlayer
               ;WriteFloat Stream, EntityX#(Cube)
               ;WriteFloat Stream, EntityY#(Cube)
               ;WriteFloat Stream, EntityZ#(Cube)
               ;WriteInt Stream, EntityYaw(cube)
            WriteFloat Stream, PlayerLocal\x
            WriteFloat Stream, PlayerLocal\y
            WriteFloat Stream, PlayerLocal\z
            WriteInt Stream, 0
               WriteInt Stream, meineID
               SendUDPMsg Stream, P\IP, P\Port
            EndIf
            Next
         End If   
      End If
   EndIf
   
   ;Text 0,100, EntityX(cube)
   ;Text 0,130, EntityZ(cube)
   ;Text 0,160, EntityYaw(cube)
   
   For p.player = Each Player
      Oval p\x -3, p\y -3, 7,7, 0
   Next
   
   Text 0,200, "Meine ID: " + MeineID
   If Modus = 0 Then Text 0,250, "Spieler: " + Counter
   If Modus Then Text 0,5, "Ping: " + PingTime
   
   WaitTimer Timer
   Flip 0
Wend

End
CloseUDPStream Stream




Function GetID(IP)
   For p.Player = Each Player
      If P\IP = IP Then Return P\ID
   Next
End Function


Function Ping()
   If (LastPing - MilliSecs() ) > 30000 And Modus > 0 Then RuntimeError "Zeitüberschreitung!"
   If Modus And (MilliSecs() - LastPing > 999) Then
      WriteByte Stream, Ping
      SendUDPMsg(Stream,ServerIP,6001-Modus)
      PingTime = MilliSecs()
      LastPing = PingTime
   End If
End Function


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function


Arrow
Zuerst hab ich mal gemacht, dass der Server auch eine Instanz des Typs Player ist, damit auch dessen Infos verschickt werden, wenn an einen neuen Spieler Daten von allen Spielern geschickt werden sollen.
Dann muss natürlich verhindert werden, dass der Server dem neu dazugekommenen Client mitteilt, dass dieser soeben neu dazugekommen ist - weiss er ja schliesslich selber. Ausserdem muss man verhindern, dass der Server versucht, sich selbst Nachrichten zu Schicken. Und der Server muss dem Client natürlich nicht selber zurückschicken, an welcher Position er sich befindet - weiss er auch selber.
Ausserdem hattest du die Erkennung der Spieler immer noch auf IP - du hast zwar den Spielern eine ID zugewiesen und überträgst die auch in den Nachrichten, aber du bestimmst dann die "AktuelleID" mit ner Funktion über die Absender-Adresse. Was natürlich dazu führen würde, dass bei jedem Client alle anderen Spieler immer dieselbe Position teilen würden.

So, jetzt Starte das Programm 2 oder gar 3 mal parallel und richte es so ein (ich hoffe, dein Bildschirm ist gross genug), dass du alle Programm- und Debugfenster siehst. Dann beweg dich ein wenig rum und du wirst sofort erkennen, was du noch ändern kannst, um das "GamePlay" zu verbessern.

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

BadDeath

BeitragFr, Jun 06, 2008 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Geil danke dir viel mals! Ich werde das gleich mal testen - bist echt in Ordnung Laughing

PS: Bei 20" sollte der Platz reichen Cool

----------

Nachtrag: Super! Es funktioniert einwandfrei - danke nochmal, hast mir echt sehr geholfen ^^
Ich schreibs gleich wieder nach 3D um. Smile

MfG, BadDeath

--------------

Nachtrag 2: Der Code in 3D, falls den noch jemand benötigt:

Code: [AUSKLAPPEN]
Global LastPing, PingTime, Modus, Stream, ServerIP, MeineID

Global Counter = 0

Global ServerPort = 56000

Const NewPlayer  = 1
Const NewPlayer2 = 2
Const MovePlayer = 3
Const Msg        = 4
Const Ping       = 5
Const PingAnswer = 6
Const AskForID   = 7
Const IDAnswer   = 8

Type Player
   Field IP, Port
   Field Mesh
   Field ID
   Field x#, y#, z#, yaw
End Type

Graphics3D 640,480,32,2

n = CountHostIPs("")
MeineIP = HostIP(1)

Modus = 1 ;Input("0 = Server  |  1 = Client : ")

If Modus Then
;   ServerIP=INT_IP(Input("IP des Anderen? "))
;   If ServerIP < 10 Then ServerIP = INT_IP("127.0.0.1")
   ServerIP = INT_IP("89.247.23.89")
   Stream=CreateUDPStream()
   WriteByte Stream, NewPlayer2
   SendUDPMsg Stream, ServerIP, ServerPort
   AppTitle "Client"
DebugLog "Client"
Else
   Stream=CreateUDPStream(ServerPort)
   AppTitle "Server"
DebugLog "Server"
End If

SetBuffer BackBuffer()

light=CreateLight()
RotateEntity light,90,0,0

Boden = CreatePlane()
tex=LoadTexture("Rasen.bmp")
EntityTexture boden,tex

Timer = CreateTimer(60)
LastPing = MilliSecs()

Local PlayerLocal.Player = New Player
PlayerLocal\x# = 0
PlayerLocal\x# = 1
PlayerLocal\z# = 10
PlayerLocal\mesh=CreateCube()
PositionEntity PlayerLocal\mesh,0,1,0
EntityColor PlayerLocal\mesh,0,0,255

camera=CreateCamera(PlayerLocal\Mesh)
PositionEntity camera, 0,5,-8
TurnEntity camera,20,0,0

While Not KeyDown (1)
   Cls
   
   Zahl = Zahl + 1
   If Zahl = 5 Then Zahl = 1
   
   UpdateWorld
   RenderWorld
     
   
   If True Then
   
      Pos# = PlayerLocal\x# + PlayerLocal\z# + PlayerLocal\Yaw
         If KeyDown(200)=True Then MoveEntity PlayerLocal\mesh,0,0,0.2
         If KeyDown(208)=True Then MoveEntity PlayerLocal\mesh,0,0,-0.2
         If KeyDown(205)=True Then TurnEntity PlayerLocal\mesh,0,-3,0
         If KeyDown(203)=True Then TurnEntity PlayerLocal\mesh,0,3,0

         PlayerLocal\x#  = EntityX#(PlayerLocal\Mesh)
         PlayerLocal\y#  = EntityY#(PlayerLocal\Mesh)
           PlayerLocal\z# = EntityZ#(PlayerLocal\Mesh)
           PlayerLocal\Yaw = EntityYaw(PlayerLocal\Mesh)
      Pos2# = PlayerLocal\x# + PlayerLocal\z# + PlayerLocal\Yaw
     
      Ping()
     
      recv=RecvUDPMsg(Stream)
      While(recv<>0)
      While(ReadAvail(Stream)>0)
            In = 0
            In = ReadByte(Stream)
            InIP = UDPMsgIP(Stream)
            InPort = UDPMsgPort(stream)
                     
            Select In
            Case NewPlayer ;#################################
               P.Player = New Player
               P\ID = ReadInt(Stream)
               P\IP = InIp
               P\Mesh = CreateCube()
               EntityColor P\Mesh, 255,0,0
               
               Case NewPlayer2 ;#################################
               Counter = Counter + 1
                 
               P.Player = New Player
               P\ID = Counter ;ReadInt(Stream)
               P\IP = InIp
               P\Port = InPort
               P\Mesh = CreateCube()
               EntityColor P\Mesh, 255,0,0
                 
               WriteByte Stream, IDAnswer
               WriteInt Stream, Counter
               SendUDPMsg Stream, InIP, InPort
                 
              ; Allen Spielern mitteilen, dass ein neuer da ist
               For P.Player = Each Player
                  If p <> playerlocal And p\id <> counter
                     WriteByte Stream, NewPlayer
                     WriteInt Stream, Counter
                     SendUDPMsg Stream, P\Ip, P\Port
                  EndIf
               Next
                 
              ; Dem neuen Spieler alle bestehenden übergeben
               For P.Player = Each Player
                  If p\id <> counter
                     WriteByte Stream, NewPlayer
                     WriteInt Stream, P\ID
                     SendUDPMsg Stream, InIp, InPort
                  EndIf
               Next
                                   
               Case MovePlayer ;#################################
               X# = ReadFloat(Stream)
               Y# = ReadFloat(Stream)
               Z# = ReadFloat(Stream)
               Turn = ReadInt(Stream)
               AktuelleID = ReadInt(Stream)
             
               If Modus = 0 Then
                  For P.Player = Each Player
                           If AktuelleID <> P\ID And p<>playerlocal Then
                        WriteByte Stream, MovePlayer
                        WriteFloat Stream, X#
                        WriteFloat Stream, Y#
                        WriteFloat Stream, Z#
                        WriteInt Stream, Turn
                        WriteInt Stream, AktuelleID
                        SendUDPMsg Stream, P\IP, P\Port
                     End If
                           
                     If AktuelleID = P\ID Then
                              P\x# = x#
                             P\y# = y#
                             P\z# = z#
                              P\yaw = turn
                        Exit
                           End If
                        Next
               Else
                  For P.Player = Each Player
                        If P\ID = AktuelleID Then
                           P\x# = x#
                           P\y# = y#
                           P\z# = z#
                           P\yaw = turn
                     Exit
                        End If
               Next
            End If
                 
            Case Msg ;#################################
               Text 0,20, "Incoming: "+ReadInt(Stream)
                 
            Case Ping ;#################################
               WriteByte Stream, PingAnswer
               SendUDPMsg Stream, InIP, InPort
                 
            Case PingAnswer ;#################################
               PingTime = MilliSecs() - PingTime
                 
               ;Case AskForID ;#################################
               ;   WriteByte stream, IDAnswer
               ;   WriteByte stream, GetID(InIP)
               ;   SendUDPMsg stream, InIP, 6001-modus   
               
            Case IDAnswer ;#################################
               MeineID = ReadInt(Stream)
                    playerlocal\id = meineID
                 
            End Select
         Wend
         recv=RecvUDPMsg(Stream)
      Wend
     
      If Pos# <> Pos2# Then
         If Modus = 1 Then
            WriteByte Stream, MovePlayer
           WriteFloat Stream, PlayerLocal\x#
           WriteFloat Stream, PlayerLocal\y#
           WriteFloat Stream, PlayerLocal\z#
           WriteInt Stream, PlayerLocal\yaw
         WriteInt Stream, MeineID
            SendUDPMsg Stream, ServerIP, ServerPort
         Else
            For P.Player = Each Player
               If p<>playerlocal
               WriteByte Stream, MovePlayer
                  WriteFloat Stream, PlayerLocal\x#
                  WriteFloat Stream, PlayerLocal\y#
                  WriteFloat Stream, PlayerLocal\z#
               WriteInt Stream, PlayerLocal\yaw
               WriteInt Stream, meineID
               SendUDPMsg Stream, P\IP, P\Port
            EndIf
            Next
         End If   
      End If
   EndIf
   
   Text 0,100, EntityX(PlayerLocal\mesh);   + "  " + PlayerLocal\x#
   Text 0,130, EntityZ(PlayerLocal\mesh);   + "  " + PlayerLocal\z#
   Text 0,160, EntityYaw(PlayerLocal\mesh);  + "  " + PlayerLocal\Yaw
   
   For p.player = Each Player
      PositionEntity P\Mesh, P\X#, P\Y#, P\Z#
      RotateEntity P\Mesh, 0, P\Yaw, 0
   Next
   
   If Modus = 0 Then Text 0,250, "Spieler: " + Counter
   If Modus Then Text 0,200, "Meine ID: " + MeineID
   If Modus Then Text 0,5, "Ping: " + PingTime
   
   WaitTimer Timer
   Flip 0
Wend

End
CloseUDPStream Stream




Function GetID(IP)
   For p.Player = Each Player
      If P\IP = IP Then Return P\ID
   Next
End Function


Function Ping()
   If (LastPing - MilliSecs() ) > 30000 And Modus > 0 Then RuntimeError "Zeitüberschreitung!"
   If Modus And (MilliSecs() - LastPing > 999) Then
      WriteByte Stream, Ping
      SendUDPMsg(Stream,ServerIP,ServerPort)
      PingTime = MilliSecs()
      LastPing = PingTime
   End If
End Function


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group