from dataclasses import dataclass from enum import Enum import math import random from typing import Tuple import pygame as pg from abc import abstractmethod @dataclass(frozen=True, slots=True) class Colors: Black = pg.Color(0, 0, 0) White = pg.Color(255, 255, 255) Red = pg.Color(255, 0, 0) Green = pg.Color(0, 255, 0) Blue = pg.Color(0, 0, 255) Cyan = pg.Color(0, 255, 255) Yellow = pg.Color(255, 255, 0) Magenta = pg.Color(255, 0, 255) def color_wheel(hue=0, increase=1) -> pg.Color: color = Colors.Red h, s, l, a = color.hsla color.hsla = hue, s, l, a while True: yield color h, s, l, a = color.hsla h = (h + increase) % 360 color.hsla = h, s, l, a def color_randomize() -> pg.Color: color = Colors.Red h, s, l, a = color.hsla color.hsla = random.randint(0, 359), s, l, a while True: yield color color.hsla = random.randint(0, 359), s, l, a def transform_bounce( bounds: pg.Rect, velocity: Tuple[int, int], x_factor: Tuple[int, int], y_factor: Tuple[int, int], ): min_velocity = velocity[0] max_velocity = velocity[1] velocity = random.randint(min_velocity, max_velocity) ticks = random.randint(0, 360) x_factor = random.uniform(x_factor[0], x_factor[1]) y_factor = random.uniform(y_factor[0], y_factor[1]) size_x, size_y = yield (bounds.centerx, bounds.centery) while True: pos_x = ( math.cos(x_factor * ticks) * (bounds.width - 2 * size_x) // 2 + bounds.centerx ) pos_y = ( math.sin(y_factor * ticks) * (bounds.height - 2 * size_y) // 2 + bounds.centery ) ticks += velocity / 180 * math.pi velocity = random.randint(min_velocity, max_velocity) size_x, size_y = yield (pos_x, pos_y) class Effect(pg.sprite.Sprite): def __init__( self, image: pg.Surface, rect: pg.Rect, *groups: pg.sprite.Group ) -> None: super().__init__(*groups) self.rect = rect self.image = image def draw(self, surface: pg.Surface): surface.blit(self.image, self.rect)