From a8814fdfe1ca3133cef3ff75f06ce40949f630f0 Mon Sep 17 00:00:00 2001 From: Brosef Date: Thu, 26 Jun 2025 07:21:41 +0100 Subject: [PATCH] Added basic spin animation --- game.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/game.py b/game.py index a072cb6..d5b340e 100644 --- a/game.py +++ b/game.py @@ -1,21 +1,45 @@ import math as maths import logging -import pygame +import random +import time + import gameUtils import NoPELib import numpy as np +import pygame + +def translate(value, aMin, aMax, bMin, bMax): + """ + Translates `value` to go from `aMin`-`aMax` to `bMin`-`bMax` + Stolen from StackOverflow because we don't have time to do shit + properly here. + """ + + aRange = (aMax - aMin) + bRange = (bMax - bMin) + return (((value - aMin) * bRange) / aRange) + bMin def rotateRad(surface: pygame.Surface, radians: float) -> pygame.Surface: """ - Rotates a surface clockwise in radians. + Rotates a surface clockwise in radians and re-centres it. """ # Calculate the degrees deg = radians*(180/maths.pi) + # Rotate the surface re-centre + return rotateDeg(surface, deg) + +def rotateDeg(surface: pygame.Surface, degrees: float) -> pygame.Surface: + """ + Rotates a surface clockwise in degrees and re-centres it. + """ # Convert to CCW becaus for some reason that's what Pygame uses? - deg *= -1 - # Rotate the surface - return pygame.transform.rotate(surface, deg) + degrees *= -1 + # Rotate surface which will expand it + rotSurface = pygame.transform.rotate(surface, degrees) + # re-centre it to the orinal surface bounding box + rotSurface = gameUtils.centre(rotSurface, surface.size) + return rotSurface class Game(gameUtils.Game): def __init__(self, *args, **kwargs): @@ -32,6 +56,17 @@ class Game(gameUtils.Game): super().__init__(*args, **kwargs) self.wheelSurf = pygame.Surface([min(self.size)]*2) # Don't ask. + self.wheelRotation = 0 + # How long (in seconds) it takes for the wheel to get to full speed + self.WHEEL_SPIN_FADE_IN = 0.25 + # How long (in seconds) it takes for the wheel to go back to stationary + self.WHEEL_SPIN_FADE_OUT = 2.5 + # The minimum and maximum speeds of the wheel + self.WHEEL_SPEED_RANGE = [5, 15] + # Holds the decided speed of the wheel + self.wheelSpinSpeed = 0 + # When the wheel started its spin animation + self.wheelAnimStart = 0 font = pygame.font.SysFont('', 32) @@ -67,7 +102,7 @@ class Game(gameUtils.Game): # Rotate the text surface textSurf = rotateRad(textSurf, rad+gap/2) # Blit the text surface to the wheel surface - self.wheelSurf.blit(gameUtils.centre(textSurf, self.wheelSurf.size), (0, 0)) + self.wheelSurf.blit(textSurf, (0, 0)) def onEvent(self, event): @@ -77,14 +112,27 @@ class Game(gameUtils.Game): Args: event (pygame.Event): The event that was fired. """ - pass + if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: + self.wheelSpinSpeed = random.randint(*self.WHEEL_SPEED_RANGE) + self.wheelAnimStart = time.perf_counter() def update(self): """ Ran once per frame, put your drawing code and any game logic that should be ran once per frame in here. """ - self.surf.blit(gameUtils.centre(self.wheelSurf, self.size), (0, 0)) + self.surf.blit(rotateDeg(gameUtils.centre(self.wheelSurf, self.size), self.wheelRotation), (0, 0)) + + animTime = time.perf_counter() - self.wheelAnimStart + if animTime < self.WHEEL_SPIN_FADE_IN + self.WHEEL_SPIN_FADE_OUT: + if animTime < self.WHEEL_SPIN_FADE_IN: + speed = translate(animTime, 0, self.WHEEL_SPIN_FADE_IN, 0, self.wheelSpinSpeed) + else: + speed = translate(animTime, self.WHEEL_SPIN_FADE_IN, self.WHEEL_SPIN_FADE_IN+self.WHEEL_SPIN_FADE_OUT, self.wheelSpinSpeed, 0) + + self.wheelRotation += speed + self.wheelRotation %= 360 + print(self.wheelRotation) def close(self): """