UDP-Problem Spieler sehen sich nicht!
Übersicht

BadDeathBetreff: UDP-Problem Spieler sehen sich nicht! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Keiner eine Idee? | ||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, also die Spieler sehen jeweils ihren Würfel und den Server-Würfel, auch, wenn er sich bewegt. | ||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Shark |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() mfg Shark |
||
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
An Holzchopf: Danke, das viel mir garnicht auf. ![]() 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. ![]() ----------------------------------- 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du jeden Schleifendurchlauf Daten da reinstopfts ists logisch, dass es langsam läuft. ![]() |
||
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dennoch sehen sich die Spieler nicht ^^ | ||
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mhh, ich bekomme den Code einfach nicht zum laufen... Bin wohl zu blöd ![]() 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 |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank! Ich bin verzweifel nämlich langsam...
Danke dir, bin schon auf das Ergebnis gespannt ![]() |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Geil danke dir viel mals! Ich werde das gleich mal testen - bist echt in Ordnung ![]() PS: Bei 20" sollte der Platz reichen ![]() ---------- Nachtrag: Super! Es funktioniert einwandfrei - danke nochmal, hast mir echt sehr geholfen ^^ Ich schreibs gleich wieder nach 3D um. ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group