Include "sprite candy.bb"
;################################################## Player Type, hier werden die Spieler gespeichert.... :A
Type TPlayers
Field X#
Field Y#
Field Rotation#
Field Beschleunigung#
Field Port
Field IP
Field PlayerImage
Field LastSend
End Type
;################################################## Ja, allgemeiner Grafikkram, Auflösung 800x600, 32 bit, Fenstermodus + Tformfilter 0 für die Drehung des Autos
Graphics3D 800,600,32,2
TFormFilter 0
;##################################################
Global HauptKamera = CreateCamera()
CameraClsMode HauptKamera,0,1
Global Main_HUD = HUD_Create(HauptKamera)
Global Tank_Texture = HUD_LoadImageResource("panzer.bmp", 4,255,0,255)
Global Tank_Layer = HUD_CreateLayer(Main_HUD, Tank_Texture, 1)
Global Backgroundimage = LoadImage("hintergrund.bmp")
;################################################## Öffnung des Lokalen UDP Streams
Global Players.TPlayers
Global OwnUDPStream = CreateUDPStream()
;################################################## 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
OwnPlayer\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
HUD_SetObjectOrigin(OwnPlayer\PlayerImage, 0,0)
;################################################## 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
Players\X = (Players\X+((Players\Beschleunigung#/2)*Cos(Players\Rotation#)))
Players\Y = (Players\Y+((Players\Beschleunigung#/2)*Sin(Players\Rotation#)))
Next
;##############################################
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# = 1+OwnPlayer\Beschleunigung/5
If KeyDown(203) Then
OwnPlayer\Rotation# = OwnPlayer\Rotation#-RotationsFaktor#
ElseIf KeyDown(205) Then
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
If OwnPlayer\Beschleunigung# > 10 Then OwnPlayer\Beschleunigung# = 10
If OwnPlayer\Beschleunigung# < -10 Then OwnPlayer\Beschleunigung# = -10
;##############################################
End Function
;################################################## Hier werden alle Spieler gezeichnet
Function DrawPlayers()
For Players = Each TPlayers
If Players\PlayerImage <> 0 Then
HUD_SetObjectOrigin(Players\PlayerImage, 0,0)
HUD_PositionObject(Players\PlayerImage, -(Players\X#-CameraX)+GraphicsWidth()/2, -(Players\Y#-CameraY)+GraphicsHeight()/2)
HUD_SetObjectRotation(Players\PlayerImage, Players\Rotation#)
End If
Next
End Function
;################################################## Naja, meine mehr oder weniger tolle Netzwerkfunktion.
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
Players\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
HUD_SetObjectOrigin(Players\PlayerImage, 0,0)
End If
Success = 0
Players\X# = ReadFloat(OwnUDPStream)
Players\Y# = ReadFloat(OwnUDPStream)
Players\Rotation# = ReadFloat(OwnUDPStream)
Players\IP = RemoteIP
Players\Port = ReadInt(OwnUDPStream)
While ReadAvail(OwnUDPStream) > 0
NewIP = ReadInt(OwnUDPStream)
NewPort = ReadInt(OwnUDPStream)
Success = 0
For Players = Each TPlayers
If NewIP = Players\IP Then
Success = 1 : Exit
End If
Next
If Success = 0 Then
Players = New TPlayers
Players\PlayerImage = Players\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
Players\IP = NewIP
Players\Port = NewPort
End If
Wend
End If
Wend
;##############################################
If MilliSecs()- OwnPlayer\LastSend > 50 Then
For Players = Each TPlayers
If Players\IP <> 50 Then
WriteFloat OwnUDPStream, OwnPlayer\X#
WriteFloat OwnUDPStream, OwnPlayer\Y#
WriteFloat OwnUDPStream, OwnPlayer\Rotation#
WriteInt OwnUDPStream, UDPStreamPort(OwnUDPStream)
For IPStuff.TPlayers = Each TPlayers
If IPStuff\IP <> 50 And IPStuff\IP <> Players\IP Then
WriteInt OwnUDPStream, IPStuff\IP
WriteInt OwnUDPStream, IPStuff\Port
End If
Next
SendUDPMsg OwnUDPStream, Players\IP, Players\Port
End If
OwnPlayer\LastSend = MilliSecs()
Next
End If
;##############################################
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:")
Players\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
HUD_SetObjectOrigin(Players\PlayerImage, 0,0)
Players\X = 1
Players\Y = 1
Players\Rotation = 1
End If
End Function
;################################################## Die Hauptschleife
Global FPSTimer = CreateTimer(30)
;##################################################
Repeat
WaitTimer FPSTimer
TileBlock Backgroundimage, CameraX, CameraY
;##############################################
OtherStuff()
NetWorkData()
PlayerControls()
DrawPlayers()
HUD_Update() : RenderWorld()
Flip 1
Cls()
Until KeyHit(1)