113 lines
No EOL
2.3 KiB
Python
Executable file
113 lines
No EOL
2.3 KiB
Python
Executable file
import pygame
|
|
import collections
|
|
|
|
class GameTimer(object):
|
|
def __init__(self):
|
|
self.update_fps_count = None
|
|
|
|
def start_loop(self):
|
|
self.elapsed = 0
|
|
self.elapsed_sec = 0.0
|
|
self.timer = pygame.time.get_ticks()
|
|
self.reset_fps_count()
|
|
|
|
def next_frame(self, skipping=False):
|
|
|
|
newticks = pygame.time.get_ticks()
|
|
#if skipping:
|
|
# # reset self.timer to it's value from the previous frame
|
|
# self.timer -= self.elapsed
|
|
self.elapsed = newticks - self.timer
|
|
self.timer = newticks
|
|
self.elapsed_sec = float(self.elapsed) / 1000.0
|
|
|
|
if self.elapsed != 0:
|
|
self.update_fps_count(self.elapsed)
|
|
|
|
|
|
def reset_fps_count(self):
|
|
self.framelist = collections.deque()
|
|
self.update_fps_count = self.update_fps_count_empty
|
|
|
|
def update_fps_count_empty(self, elapsed):
|
|
self.framelist.append(elapsed)
|
|
if len(self.framelist) >= 25:
|
|
self.update_fps_count = self.update_fps_count_full
|
|
|
|
def update_fps_count_full(self, elapsed):
|
|
self.framelist.popleft()
|
|
self.framelist.append(elapsed)
|
|
|
|
|
|
def elapsed(self):
|
|
"""
|
|
get the amount of time in milliseconds passed since the last frame was displayed
|
|
"""
|
|
return self.elapsed
|
|
|
|
def elapsed_sec(self):
|
|
"""
|
|
get the amount of time in seconds passed since the last frame was displayed
|
|
"""
|
|
return self.elapsed_sec
|
|
|
|
def num_frames(self, delay, offset=0):
|
|
"""
|
|
if you want something to occur every "delay" milliseconds,
|
|
this will return the number of times you should make it happen
|
|
in this particular frame (can be 0)
|
|
"""
|
|
return int((self.timer - offset) / delay) - int((self.timer - self.elapsed - offset) / delay)
|
|
|
|
def loop_frames(self, delay, offset=0):
|
|
return range(num_frames(delay, offset))
|
|
|
|
def get_timer(self):
|
|
return self.timer
|
|
|
|
def average(self, d):
|
|
#spf = (float(sum(self.framelist)) / (len(self.framelist) * 1000.0))
|
|
if len(d) == 0:
|
|
return 0.0
|
|
|
|
smooth = 0.85
|
|
#v2 = float(d[-1])
|
|
#for i in xrange(len(d) - 2, 0, -1):
|
|
# pass
|
|
|
|
v2 = float(d[0])
|
|
for i in range(1, len(d)):
|
|
v1 = float(d[i])
|
|
v2 = (smooth * v2) + ((1.0 - smooth) * v1)
|
|
|
|
return v2
|
|
|
|
|
|
def get_fps(self):
|
|
#return ",".join([str(x) for x in sorted(self.framelist)])
|
|
if len(self.framelist) == 0.0:
|
|
return 0.0
|
|
spf = self.average(self.framelist) / 1000.0
|
|
if spf == 0.0:
|
|
return 0.0
|
|
#print "%s < %s" % (1.0 / spf, self.framelist)
|
|
return 1.0 / spf
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|