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)