könnten erfahrene Threadspezialisten bitte mal kurz über diesen Code schauen? Ich habe ihn aus der Hilfe zusammengeschustert ^^
Soll für ein Spiel sein, d.h. die Keyboardreleased werden dann zu Spielerbewegungen,... verarbeitet.
Bitte alles, was irgendwie nicht sauber programmiert ist sofort melden; Ich würde gerne wissen, ob das so gut ist oder ob es Probleme geben könnte (Speziell beim Durchlaufzähler im Thread).
Falls ihr den Code auch ausprobieren wollt, speichert ihr ihn einfach im 3D Examples Ordner.
Code: Alles auswählen
EnableExplicit
Structure FPS
zeit.i
zaehler.i
EndStructure
Define.FPS FPS
Define.i frameZeit, Quit
Global Semaphore = CreateSemaphore()
Global Mutex = CreateMutex()
Global NewList Queue.i()
;Fenster
Enumeration
#Window3D_0
EndEnumeration
;Gadgets
Enumeration
#Text3D_0
EndEnumeration
;Kameras
Enumeration
#kamera_0
EndEnumeration
;Events
Enumeration
#Escape_Up
#A_Up
#S_Up
EndEnumeration
Procedure Locker(event.i)
If TryLockMutex(Mutex) ;Wenn nicht erfolgreich, verarbeitet Hauptschleife gerade Eingaben; Ein bisschen Schwund ist Standart :D
LastElement(Queue())
AddElement(Queue())
Queue() = event
UnlockMutex(Mutex)
; Signalisiere, dass es ein neues Queue-Element gibt
SignalSemaphore(Semaphore)
EndIf
EndProcedure
Procedure InputHandler(nr.i)
Protected.FPS FPS
Repeat
FPS\zaehler = FPS\zaehler + 1 ;Zählt die vergangenen Frames
If FPS\zaehler > 200 ;FPS-Grenze bei 200 FPS, die Eingaben dürfen ruhig schneller sein.
Delay(FPS\zaehler - 200)
;Else
;Hier kann man dann einen Verzug an den Server senden.
EndIf
If ElapsedMilliseconds() - FPS\zeit >= 1000 ;Damit werden die Frames pro Sekunde (1000ms) ermittelt
FPS\zeit = ElapsedMilliseconds()
FPS\zaehler = 0
EndIf
ExamineKeyboard()
ExamineMouse()
InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
If KeyboardReleased(#PB_Key_Escape)
Locker(#Escape_Up)
EndIf
If KeyboardReleased(#PB_Key_A)
Locker(#A_Up)
EndIf
If KeyboardReleased(#PB_Key_S)
Locker(#S_Up)
EndIf
ForEver
EndProcedure
Procedure Window3D()
OpenWindow3D(#Window3D_0, 10, 10, 400, 400, "Threadtest")
TextGadget3D(#Text3D_0, 10, 10, 380, 380, "")
EndProcedure
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
OpenScreen(1920, 1080, 32, "Threadtest")
CreateCamera(#kamera_0, 0, 0, 100, 100)
Window3D()
CreateThread(@InputHandler(), -1)
Repeat
FPS\zaehler = FPS\zaehler + 1 ;Zählt die vergangenen Frames
If FPS\zaehler > 100 ;FPS-Grenze bei 100 FPS
Delay(FPS\zaehler - 100)
;Else
;Hier kann man dann einen Verzug an den Server senden.
EndIf
If ElapsedMilliseconds() - FPS\zeit >= 1000 ;Damit werden die Frames pro Sekunde (1000ms) ermittelt
FPS\zeit = ElapsedMilliseconds() ;Zeit, zu der diese
FPS\zaehler = 0
EndIf
While TrySemaphore(Semaphore)
If TryLockMutex(Mutex)
FirstElement(Queue())
Select Queue()
Case #Escape_Up
Quit = #True
Case #S_Up
SetGadgetText3D(#Text3D_0, GetGadgetText3D(#Text3D_0) + "s")
Case #A_Up
SetGadgetText3D(#Text3D_0, GetGadgetText3D(#Text3D_0) + "a")
EndSelect
DeleteElement(Queue())
UnlockMutex(Mutex)
Else
SignalSemaphore(Semaphore)
EndIf
Wend
frameZeit = RenderWorld(frameZeit) ;Die Physik wird mit der Zeit des vorletzten Frames gefüttert, als Ergebnis die Zeit des letzten Frames.
FlipBuffers()
Until Quit
End
Banane