Include "sprite candy.bb"
Include "sprite candy gui.bb"
;################################################## Player Type, hier werden die Spieler gespeichert.... :A
Type TPlayers
Field X#
Field Y#
Field Rotation#
Field Beschleunigung#
Field Port
Field IP
Field SchussKraft#
Field MaxSchussKraft#
Field PfeilObjekt
Field LastAufladen#
Field PlayerImage
Field Farbe
End Type
;##################################################
Type TSchuss
Field X#
Field Y#
Field Rotation#
Field Speed#
Field LastMove
Field Farbe
Field SchussObjekt
Field SpielerIP
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 OwnUDPStream = CreateUDPStream()
;##################################################
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, 2)
Global Backgroundimage = LoadImage("hintergrund.bmp")
Global Main_GUI = GUI_Create(Main_HUD, "gui/sd.png", "gui/font_title.png", "gui/font.png", "gui/icons.png")
Global GUI_InformationWindow = GUI_CreateWindow("Schüsse", 5, 570, 780, 24, 0, "LEFT+5")
Global GUI_InformationSchusskraft = GUI_AddProgBar(GUI_InformationWindow, 10,5,760, 1.0)
HUD_SetObjectAlpha(GUI_InformationWindow, 0.8)
Global GUI_FarbWindow = GUI_CreateWindow("Farbe", 720,0, 150,100, 0,"", "TOP")
Global GUI_FarbPicker = GUI_AddColorPicker(GUI_FarbWindow,0,0,150,100)
HUD_SetObjectAlpha(GUI_FarbWindow, 0.8)
GUI_SetColorPickerCoords(GUI_FarbPicker, 0,0,0)
Global GUI_JoinWindow = GUI_CreateWindow("Netzwerk", 105,51,200, 75, 0)
Global GUI_PortLabel = GUI_AddLabel(GUI_JoinWindow, 5,5,190, 17, "Eigener Port: " + UDPStreamPort(OwnUDPStream), "CENTER", 1)
Global GUI_JoinIP = GUI_AddTextField(GUI_JoinWindow, 5,25,190, 200, "1234567890.","IP")
Global GUI_JoinPort = GUI_AddTextField(GUI_JoinWindow, 5,50,50, 200, "1234567890","PORT")
Global GUI_JoinButton = GUI_AddButton(GUI_JoinWindow, 60,50,100,"Beitreten")
Global Schuss_Texture = HUD_LoadImageResource("schuss.bmp", 4, 0,0,0)
Global Schuss_Layer = HUD_CreateLayer(Main_HUD, Schuss_Texture, 1)
HUD_SetObjectAlpha(GUI_JoinWindow, 0.8)
Global Radar_Texture = HUD_LoadImageResource("radar.bmp", 4, 0,0,0)
Global Radar_Layer = HUD_CreateLayer(Main_HUD, Radar_Texture, 3)
;Global GUI_ChatWindow = GUI_CreateWindow("Chat", 0,0,300,150, 0+1, "CENTER", "CENTER")
;################################################## Öffnung des Lokalen UDP Streams
Global Players.TPlayers
Global Schuss.TSchuss
;##################################################
Global PanzerSchussSound = LoadSound("sound\tank_01.wav")
;################################################## 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\SchussKraft# = 1.0
OwnPlayer\MaxSchussKraft# = 5.0
OwnPlayer\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
HUD_SetObjectOrigin(OwnPlayer\PlayerImage, 0,0)
;################################################## Kamerapositionen
Global LastPositionSend, LastIPListSend, LastColorSend
;##################################################
Global CameraX
Global CameraY
;##################################################
Function Angle2D#( x1#,y1#,x2#,y2# )
Return 180-ATan2(x2-x1,y2-y1)
End Function
;################################################## 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
;##############################################
GUI_SetGadgetValue(GUI_InformationSchusskraft,OwnPlayer\SchussKraft#/OwnPlayer\MaxSchussKraft#)
;##############################################
If KeyDown(200) Then
If OwnPlayer\Beschleunigung# < -3.0 Then
OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# + 1
End If
OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# + 0.3
ElseIf KeyDown(208) Then
If OwnPlayer\Beschleunigung# > 3.0 Then
OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# - 1
End If
OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# - 0.3
EndIf
;##############################################
If OwnPlayer\Beschleunigung# > 0.0
OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# - 0.1
ElseIf OwnPlayer\Beschleunigung# < 0.0
OwnPlayer\Beschleunigung# = OwnPlayer\Beschleunigung# + 0.1
End If
;##############################################
If MilliSecs() - OwnPlayer\LastAufladen# > 300 Then
OwnPlayer\LastAufladen# = MilliSecs()
If OwnPlayer\Beschleunigung < 0.0 Then
OwnPlayer\SchussKraft# = OwnPlayer\SchussKraft# + (0.2+(OwnPlayer\Beschleunigung#/100))
Else
OwnPlayer\SchussKraft# = OwnPlayer\SchussKraft# + (0.2-(OwnPlayer\Beschleunigung#/100))
End If
End If
If OwnPlayer\SchussKraft# > OwnPlayer\MaxSchussKraft# Then
OwnPlayer\SchussKraft# = OwnPlayer\MaxSchussKraft#
End If
If KeyHit(57) And OwnPlayer\SchussKraft# >= 1.0 Then
PlaySound(PanzerSchussSound)
OwnPlayer\SchussKraft# = OwnPlayer\SchussKraft#-1
Schuss = New TSchuss
Schuss\X# = OwnPlayer\X#
Schuss\Y# = OwnPlayer\Y#
Schuss\Speed# = 20.0
Schuss\Rotation = OwnPlayer\Rotation
Schuss\SpielerIP = 50
Schuss\Farbe = GUI_GetGadgetValue(GUI_FarbPicker)
Schuss\SchussObjekt = HUD_CreateImage(Schuss_Layer, Schuss\X#, Schuss\Y#, 0,0,16,16)
HUD_SetObjectColor(Schuss\SchussObjekt, (GUI_GetGadgetValue(GUI_FarbPicker) And $FF0000)/$10000 , (GUI_GetGadgetValue(GUI_FarbPicker) And $FF00)/$100,GUI_GetGadgetValue(GUI_FarbPicker) And $FF)
SoundVolume PanzerSchussSound, 1.0
PlaySound PanzerSchussSound
For Players = Each TPlayers
If Players\IP <> 50 Then
WriteInt OwnUDPStream, 4
WriteFloat OwnUDPStream, Schuss\X#
WriteFloat OwnUDPStream, Schuss\Y#
WriteFloat OwnUDPStream, Schuss\Speed#
WriteInt OwnUDPStream, Schuss\Rotation
WriteInt OwnUDPStream, Schuss\Farbe
SendUDPMsg(OwnUDPStream, Players\IP, Players\Port)
End If
Next
End If
;##############################################
RotationsFaktor# = 5+OwnPlayer\Beschleunigung/10
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#)
If Players\PfeilObjekt <> 0 Then
HUD_SetObjectOrigin(Players\PfeilObjekt, 0,0)
HUD_PositionObject(Players\PfeilObjekt, -(OwnPlayer\X#-CameraX)+GraphicsWidth()/2, -(OwnPlayer\Y#-CameraY)+GraphicsHeight()/2)
HUD_SetObjectRotation(Players\PfeilObjekt, Angle2D(-(OwnPlayer\X#-CameraX)+GraphicsWidth()/2, -(OwnPlayer\Y#-CameraY)+GraphicsHeight()/2,-(Players\X#-CameraX)+GraphicsWidth()/2, -(Players\Y#-CameraY)+GraphicsHeight()/2)-90)
End If
End If
Next
For Schuss = Each TSchuss
HUD_PositionObject(Schuss\SchussObjekt, -(Schuss\X#-CameraX)+GraphicsWidth()/2, -(Schuss\Y#-CameraY)+GraphicsHeight()/2)
If MilliSecs()-Schuss\LastMove > 20 Then
Schuss\X# = (Schuss\X#+((Schuss\Speed#)*Cos(Schuss\Rotation#)))
Schuss\Y# = (Schuss\Y#+((Schuss\Speed#)*Sin(Schuss\Rotation#)))
Schuss\Speed# = Schuss\Speed# - 0.1
End If
If HUD_ObjectHitsObject(Schuss\SchussObjekt, OwnPlayer\PlayerImage) And Schuss\SpielerIP <> 50 Then
OwnPlayer\X# = 0
OwnPlayer\Y# = 0
OwnPlayer\Rotation = 0
End If
If Schuss\Speed# <= 5.0 Then
HUD_RemoveObject Schuss\SchussObjekt
Delete Schuss
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\PfeilObjekt = HUD_CreateImage(Radar_Layer, 0,0,0,0,32,32)
Players\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
HUD_SetObjectOrigin(Players\PlayerImage, 0,0)
End If
Success = 0
Command = ReadInt(OwnUDPStream)
If Command = 1 Then
Players\X# = ReadFloat(OwnUDPStream)
Players\Y# = ReadFloat(OwnUDPStream)
Players\Rotation# = ReadFloat(OwnUDPStream)
Players\IP = RemoteIP
Players\Port = ReadInt(OwnUDPStream)
ElseIf Command = 2 Then
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\PfeilObjekt = HUD_CreateImage(Radar_Layer, 0,0,0,0,32,32)
Players\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64)
Players\IP = NewIP
Players\Port = NewPort
End If
Wend
ElseIf Command = 3 Then
For Players = Each TPlayers
If Players\IP = RemoteIP Then
rgb = ReadInt(OwnUDPStream)
HUD_SetObjectColor(Players\PlayerImage, (rgb And $FF0000)/$10000 , (rgb And $FF00)/$100,rgb And $FF)
HUD_SetObjectColor(Players\PfeilObjekt, (rgb And $FF0000)/$10000 , (rgb And $FF00)/$100,rgb And $FF)
Exit
End If
Next
ElseIf Command = 4 Then
Schuss = New TSchuss
Schuss\X# = ReadFloat(OwnUDPStream)
Schuss\Y# = ReadFloat(OwnUDPStream)
Schuss\Speed# = ReadFloat(OwnUDPStream)
Schuss\Rotation = ReadInt(OwnUDPStream)
Schuss\Farbe = ReadInt(OwnUDPStream)
Schuss\SpielerIP = RemoteIP
Schuss\SchussObjekt = HUD_CreateImage(Schuss_Layer, Schuss\X#, Schuss\Y#, 0,0,16,16)
rgb = Schuss\Farbe
bla# = HUD_GetDistance(OwnPlayer\X, OwnPlayer\Y, Schuss\X#, Schuss\Y#)
merkvolume# = 1.0-(bla#/1000.0)
If merkvolume# > 0.0 Then
SoundVolume(PanzerSchussSound, merkvolume#)
PlaySound PanzerSchussSound
SoundVolume(PanzerSchussSound, 1.0)
End If
HUD_SetObjectColor(Schuss\SchussObjekt, (rgb And $FF0000)/$10000 , (rgb And $FF00)/$100,rgb And $FF)
End If
End If
Wend
;############################################## Senden
If MilliSecs()-LastPositionSend > 30 Then
For Players = Each TPlayers
If Players\IP <> 50 Then
WriteInt OwnUDPStream, 1
WriteFloat OwnUDPStream, OwnPlayer\X#
WriteFloat OwnUDPStream, OwnPlayer\Y#
WriteFloat OwnUDPStream, OwnPlayer\Rotation#
WriteInt OwnUDPStream, UDPStreamPort(OwnUDPStream)
SendUDPMsg OwnUDPStream, Players\IP, Players\Port
End If
LastPositionSend = MilliSecs()
Next
End If
;##############################################
If MilliSecs()-LastIPListSend > 500 Then
For SendThrough.TPlayers = Each TPlayers
If SendThrough\IP <> 50 Then
WriteInt OwnUDPStream, 2
For Players = Each TPlayers
If SendThrough\IP <> Players\IP And Players\IP <> 50 Then
WriteInt OwnUDPStream, Players\IP
WriteInt OwnUDPStream, Players\Port
End If
Next
SendUDPMsg OwnUDPStream, SendThrough\IP, SendThrough\Port
End If
Next
LastIPListSend = MilliSecs()
End If
;##############################################
If MilliSecs()-LastColorSend > 300 Then
LastColorSend = MilliSecs()
For Players = Each TPlayers
If Players\IP <> 50 Then
WriteInt OwnUDPStream, 3
WriteInt OwnUDPStream, GUI_GetGadgetValue(GUI_FarbPicker)
SendUDPMsg(OwnUDPStream, Players\IP, Players\Port)
End If
Next
End If
;##############################################
If OwnPlayer\Farbe <> GUI_GetGadgetValue(GUI_FarbPicker) Then
OwnPlayer\Farbe = GUI_GetGadgetValue(GUI_FarbPicker)
HUD_SetObjectColor(OwnPlayer\PlayerImage, (GUI_GetGadgetValue(GUI_FarbPicker) And $FF0000)/$10000 , (GUI_GetGadgetValue(GUI_FarbPicker) And $FF00)/$100,GUI_GetGadgetValue(GUI_FarbPicker) And $FF)
For Players = Each TPlayers
If Players\IP <> 50 Then
WriteInt OwnUDPStream, 3
WriteInt OwnUDPStream, GUI_GetGadgetValue(GUI_FarbPicker)
SendUDPMsg(OwnUDPStream, Players\IP, Players\Port)
End If
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()
End Function
;##################################################
Function CheckGUI()
ButtonClicked = GUI_GetClickedGadget()
Select ButtonClicked
Case GUI_JoinButton
If GUI_GetGadgetText(GUI_JoinIP) = "IP" Or GUI_GetGadgetText(GUI_JoinPort) = "PORT" Then
Return
End If
Players = New TPlayers
Players\PfeilObjekt = HUD_CreateImage(Radar_Layer, 0,0,0,0,32,32)
Players\IP = INT_IP(GUI_GetGadgetText(GUI_JoinIP))
Players\Port = GUI_GetGadgetText(GUI_JoinPort)
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
GUI_SetGadgetText(GUI_JoinIP, "IP")
GUI_SetGadgetText(GUI_JoinPort, "PORT")
End Select
End Function
;################################################## Die Hauptschleife
Global FPSTimer = CreateTimer(30)
;##################################################
Repeat
WaitTimer FPSTimer
TileBlock Backgroundimage, CameraX, CameraY
;##############################################
OtherStuff()
NetWorkData()
CheckGUI()
PlayerControls()
DrawPlayers()
HUD_Update() : GUI_Update() : RenderWorld()
Flip 1
Cls()
Until KeyHit(1)