Ein UDP Problem. Gesendet aber nicht Empfangen [ERLEDIGT]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

pablo

Betreff: Ein UDP Problem. Gesendet aber nicht Empfangen [ERLEDIGT]

BeitragDi, Nov 27, 2007 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat sich erledigt, es gab nie ein Problem o.O. Keine Ahnung was da los war Wink

So, ich glaube das hier passt am besten in Beginners Corner, weil ich sicherlich nur einen absolut dummen Fehler gemacht habe, welcher sicher leicht auffindbar ist Confused.
Wie auch immer, ich habe hier den ganzen Code gepostet, um auch sicherzustellen, dass keine wichtigen Teile fehlen, aber der Problemteil (meiner Meinung nach) ist hervorgehoben =). Und jetzt zum wichtigsten Teil: Die Beschreibung meines Problems.
Also, es handelt es sich hier, wie bereits im Titel lesbar um ein Problem mit UDP. Die Daten werden zwar gesendet, kommen aber nicht an. Ich verstehe leider absolut gar nicht warum, Tests über hamachi sind jedenfalls fehlgeschlagen. Daher konnte ich das Problem auch nicht sonderlich weit eingrenzen, aber ich habe den Code doch ein wenig auskommentiert (obwohl das ja sonst selten bei mir der Fall ist *gg*)
Code: [AUSKLAPPEN]

;################################################## Player Type, hier werden die Spieler gespeichert.... :A
Type TPlayers
   Field X#
   Field Y#
   Field Rotation#
   Field Beschleunigung#
   Field Port
   Field IP
End Type
;################################################## Ja, allgemeiner Grafikkram, Auflösung 800x600, 32 bit, Fenstermodus + Tformfilter 0 für die Drehung des Autos
Graphics 800,600,32,2
TFormFilter 0
;################################################## Öffnung des Lokalen UDP Streams
Global Players.TPlayers
Global OwnUDPStream = CreateUDPStream()
;################################################## Erstellung des Autos + Rotation.
AutoImage = CreateImage(100,35)
SetBuffer ImageBuffer(AutoImage)
Color 255,255,255
Rect 0,0,200,200
Dim AutoImages(360)
For Done=0 To 360
   AutoImages(Done) = CopyImage(AutoImage)
   RotateImage AutoImages(Done), Done
   MidHandle AutoImages(Done)
Next
;##################################################  Ein lustig kariertes Hintergrundbild um zu sehen, dass man sich auch bewegt.
Global HintergrundImage = CreateImage(8,8)
SetBuffer ImageBuffer(HintergrundImage)
Color 50,50,50
Line 0,0,8,8
Line 8,0,0,8
;################################################## Selbsterklärend
SetBuffer BackBuffer()
;################################################## Der eigene Spieler wird erstellt, IP = 50 habe ich genommen, damit Blitz erkennt, dass es sich hier um den eigenen Spieler handelt.  50, weil es eine tolle Zahl ist.
Players = New TPlayers
Players\X# = Rand(0,700)
Players\Y# = Rand(0,500)
Players\Rotation = Rand(0,350)
Players\Port = UDPStreamPort(OwnUDPStream)
Players\IP = 50
;################################################## Kamerapositionen
Global CameraX
Global CameraY
;################################################## So, hier kommt die Steuerung, dabei wird zuerst nach dem eigenen Spieler gesucht (der, welcher die IP 50 hat, und dieser ist dann Steuerbar)
Function PlayerControls()
   For Players  = Each TPlayers
      If Players\IP = 50 Then
         Exit
      End If
   Next
   ;##############################################
   Players\X = (Players\X+((Players\Beschleunigung#/2)*Cos(Players\Rotation#)))
   Players\Y = (Players\Y+((Players\Beschleunigung#/2)*Sin(Players\Rotation#)))
   ;##############################################
   CameraX = Players\X
   CameraY = Players\Y
   ;##############################################
   If KeyDown(200) Then
      If Players\Beschleunigung# < -3.0 Then
         Players\Beschleunigung# = Players\Beschleunigung# + 1
      End If
      Players\Beschleunigung# = Players\Beschleunigung# + 0.1
   ElseIf KeyDown(208) Then
      If Players\Beschleunigung# > 3.0 Then
         Players\Beschleunigung# = Players\Beschleunigung# - 1
      End If
      Players\Beschleunigung# = Players\Beschleunigung# - 0.1
   EndIf
   ;##############################################
   RotationsFaktor# = Players\Beschleunigung#/5
   If RotationsFaktor# > 5 Then
      Rotationsfaktor# = 5
   End If
   If KeyDown(205) Then
      Players\Rotation = Players\Rotation#+RotationsFaktor#
   ElseIf KeyDown(203)
      Players\Rotation = Players\Rotation#-RotationsFaktor#
   End If
   ;###############################################
   If Players\Rotation# > 360 Then Players\Rotation# = 0
   If Players\Rotation# < 0  Then Players\Rotation# = 360
   ;##############################################
   If Players\Beschleunigung# > 0 Then
      Players\Beschleunigung# =  Players\Beschleunigung# - 0.01
   ElseIf Players\Beschleunigung# < 0 Then
      Players\Beschleunigung# = Players\Beschleunigung# + 0.01
   End If
   ;##############################################
End Function
;################################################## Hier werden alle Spieler gezeichnet
Function DrawPlayers()
   For Players = Each TPlayers
      DrawImage(AutoImages(Players\Rotation),(Players\X-CameraX)+GraphicsWidth()/2, (Players\Y-CameraY)+GraphicsHeight()/2)
   Next
End Function
;################################################## HIER MEIN VERDACHT. Naja, meine mehr oder weniger tolle Netzwerkfunktion. Die nicht Funktioniert.
Function NetWorkData()
   ;########### Empfangen
   While 1
      RemoteIP = RecvUDPMsg(OwnUDPStream)
      If RemoteIP = 0 Then
         Exit
      Else
         For Players = Each TPlayers
            If Players\IP = RemoteIP Then
               Success = 1 : Exit
            End If
         Next
         If Success = 0 Then
            Players = New TPlayers
         End If
         Players\X# = ReadFloat(OwnUDPStream)
         Players\Y# = ReadFloat(OwnUDPStream)
         Players\Rotation# = ReadFloat(OwnUDPStream)
         Players\IP = RemoteIP
         Players\Port = ReadInt(OwnUDPStream)
      End If
   Wend
   ;############################################## Senden
   For Players = Each TPlayers
      If Players\IP = 50 Then
         TempX# = Players\X#
         TempY# = Players\Y#
         TempRotation# = Players\Rotation#
      End If
   Next
   ;##############################################
   For Players = Each TPlayers
      If Players\IP <> 50 Then
         WriteFloat OwnUDPStream, TempX#
         WriteFloat OwnUDPStream, TempY#
         WriteFloat OwnUDPStream, TempRotation#
         WriteInt OwnUDPStream, UDPStreamPort(OwnUDPStream)
         SendUDPMsg OwnUDPStream, Players\IP, Players\Port
      End If
   Next
   ;##############################################   
End Function
;################################################## Aus Blitzbase geklaut, um eine String IP in eine Integer IP zu verwandeln.
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
;################################################## Otherstuff umfasst die anzeige des Eigenen Ports und ein Joinmenü, wenn man leertaste drückt.

Function OtherStuff()
   Color 255,255,255
   Text 0,0,"Your Port: "+UDPStreamPort(OwnUDPStream)   
   If KeyHit(57) Then
      Cls()
      Players = New TPlayers
      Players\IP = INT_IP(Input$("Remote IP:"))
      Players\Port = Input("Remote Port:")
   End If
End Function
;################################################## Die Hauptschleife
Repeat
   ;##############################################
   NetWorkData()
   TileImage HintergrundImage, -CameraX, -CameraY
   PlayerControls()
   DrawPlayers()
   OtherStuff()
   Flip 1
   Cls()
Until KeyHit(1)


So, das war der Code. Mein Verdacht liegt wie bereits erkennbar in der Funktion NetworkData(). Woran es aber liegt weiß ich nicht. Die Daten werden zwar gesendet, kommen aber einfach nicht an!
  • Zuletzt bearbeitet von pablo am Di, Nov 27, 2007 23:15, insgesamt einmal bearbeitet

Noobody

BeitragDi, Nov 27, 2007 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Verdacht liegt darin, dass du TempX#, TempY# und Temprotation# erst in der For-Schleife deklarierst, was dazu führt, dass sie beim reinschreiben wieder neu definiert werden -> Wert = 0
Einfach vor der Schleife die Variablen lokal definieren und schauen, obs klappt.

Die IP -> Integer-Funktion kannst du übrigens um eniges einfacher haben^^
Code: [AUSKLAPPEN]
   CountHostIPs( dottedipadress$ )
   Return HostIP( 1 )
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

pablo

BeitragDi, Nov 27, 2007 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt, das Problem hat irgendwie nie existiert, scheinbar lag das an Hamachi, dass die Daten nicht angekommen sind. Wurde jetzt aber gelöst, danke trotzdem Wink.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group