;################################################## 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. Global OwnPlayer.TPlayers = New TPlayers OwnPlayer\X# = Rand(0,700) OwnPlayer\Y# = Rand(0,500) OwnPlayer\Rotation = Rand(0,350) OwnPlayer\Port = UDPStreamPort(OwnUDPStream) OwnPlayer\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() ;############################################## OwnPlayer\X = (OwnPlayer\X+((OwnPlayer\Beschleunigung#/2)*Cos(OwnPlayer\Rotation#))) OwnPlayer\Y = (OwnPlayer\Y+((OwnPlayer\Beschleunigung#/2)*Sin(OwnPlayer\Rotation#))) ;############################################## CameraX = OwnPlayer\X CameraY = OwnPlayer\Y ;############################################## If KeyDown(200) Then If OwnPlayer\Beschleunigung# < -3.0 Then OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# + 1 End If OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# + 0.1 ElseIf KeyDown(208) Then If OwnPlayer\Beschleunigung# > 3.0 Then OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# - 1 End If OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# - 0.1 EndIf ;############################################## RotationsFaktor# = OwnPlayer\Beschleunigung#/5 If RotationsFaktor# > 5 Then Rotationsfaktor# = 5 End If If KeyDown(205) Then OwnPlayer\Rotation = OwnPlayer\Rotation#+RotationsFaktor# ElseIf KeyDown(203) OwnPlayer\Rotation = OwnPlayer\Rotation#-RotationsFaktor# End If ;############################################### If OwnPlayer\Rotation# > 360 Then OwnPlayer\Rotation# = 0 If OwnPlayer\Rotation# < 0 Then OwnPlayer\Rotation# = 360 ;############################################## If OwnPlayer\Beschleunigung# > 0 Then OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# - 0.01 ElseIf OwnPlayer\Beschleunigung# < 0 Then OwnPlayer\Beschleunigung# = ownplayer\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# Exit 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)