;################################################## 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)