mirror of
https://git.davidovski.xyz/tkinter-space-game.git
synced 2024-08-15 00:43:41 +00:00
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
from sys import stderr
|
|
from time import time
|
|
|
|
|
|
class FrameCounter:
|
|
"""Creates a main loop and ensures that the framerate is static"""
|
|
|
|
def __init__(self, canvas, target_fps):
|
|
"""Initialise the frame counter
|
|
|
|
:param canvas: The canvas which to call after on
|
|
:param target_fps: The fps to aim to achieve
|
|
"""
|
|
self.canvas = canvas
|
|
self.fps = target_fps
|
|
self.frame_time = 1 / target_fps
|
|
self.last_frame = time()
|
|
|
|
self.current_fps = 1
|
|
|
|
def next_frame(self, callback):
|
|
"""Calculate when the next frame should be called
|
|
|
|
:param callback: function to call for the next frame
|
|
"""
|
|
t = time()
|
|
ft = t - self.last_frame
|
|
|
|
delay = 0
|
|
|
|
if ft > self.frame_time:
|
|
if ft - self.frame_time > self.frame_time / 5:
|
|
print(
|
|
f"Help! Running {ft - self.frame_time} seconds behind!",
|
|
file=stderr)
|
|
else:
|
|
delay = self.frame_time - ft
|
|
|
|
self.canvas.after(int(delay*1000), callback)
|
|
self.current_fps = 1 / (delay+ft)
|
|
self.last_frame = t
|