Cara tava com uma dificuldade de achar um método agil de colocar um delay no meu jogo em algumas ações e não conseguia pensar em nada,ai lembrei dos decorators quando vi seu post, então dai eu criei decorator que mudou tudo.
Também fiz uma descoberta. Descobri que poosso utilizar uma classe como decorador, que é bem importante para algumas ações, e achei interessante o modo como funciona para utilizar instâncias da classe dentro de um decorador, pois quando utilizamos diretamente na função ele não aceita usarmos a instancia de classe "self", sendo assim a synxtax ficária como a demonstrada abaixo.
import pygame.time
class Timer:
def __init__(self, delay: int):
self.last_update = pygame.time.get_ticks()
self.delay = delay
def __call__(self, func):
def wrapper(*args, **kwargs):
elapsed = pygame.time.get_ticks()
if elapsed - self.last_update > self.delay:
self.last_update = elapsed
return func(*args, **kwargs)
return wrapper
class Player(Entity):
def __init__(self, context, image):
super().__init__(context, image)
....
##########
# TIMERS #
##########
self.move = Timer(delay=self.speed())(self.move)
self.frame_motion = Timer(delay=10 if self.speed() >= 500 else 150 * (1 + (self.speed() / 500)))(
self.frame_motion)
....