All pastes #800459 Raw Edit

Jemand

public text v1 · immutable
#800459 ·published 2007-11-28 13:43 UTC
rendered paste body
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()
   ;##############################################
	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# = 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_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)
				For Players = Each TPlayers
					If NewIP = Players\IP Then
						Success = 1 : Exit
					End If
				Next
			Wend
			If Success = 0 Then
				Players = New TPlayers
				Players\PlayerImage = Players\PlayerImage = HUD_CreateImage(Tank_Layer, 0,0,0,0,64,64) 
				HUD_SetObjectOrigin(Players\PlayerImage, 0,0)
				Players\IP = NewIP
				Players\Port = NewPort
			End If
		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)