85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
from dataclasses import dataclass
|
|
from enum import Enum
|
|
import math
|
|
import random
|
|
from typing import Generator, Tuple
|
|
import pygame as pg
|
|
from abc import abstractmethod
|
|
|
|
|
|
def copy_color(source: pg.Color) -> pg.Color:
|
|
return pg.Color(source.r, source.g, source.b, source.a)
|
|
|
|
|
|
@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) -> Generator[pg.Color, None, None]:
|
|
color = copy_color(Colors.Red)
|
|
h, s, l, a = color.hsla
|
|
h = hue
|
|
|
|
while True:
|
|
color.hsla = h, s, l, a
|
|
yield color
|
|
h = (h + increase) % 360
|
|
|
|
|
|
def color_randomize() -> Generator[pg.Color, None, None]:
|
|
color = copy_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],
|
|
) -> Generator[Tuple[int, int], Tuple[int, int], None]:
|
|
min_velocity = velocity[0]
|
|
max_velocity = velocity[1]
|
|
current_velocity = random.randint(min_velocity, max_velocity)
|
|
ticks = random.randint(0, 360)
|
|
current_x_factor = random.uniform(x_factor[0], x_factor[1])
|
|
current_y_factor = random.uniform(y_factor[0], y_factor[1])
|
|
|
|
size_x, size_y = yield (bounds.centerx, bounds.centery)
|
|
while True:
|
|
pos_x = int(
|
|
math.cos(current_x_factor * ticks) * (bounds.width - size_x) // 2
|
|
+ bounds.centerx
|
|
)
|
|
pos_y = int(
|
|
math.sin(current_y_factor * ticks) * (bounds.height - size_y) // 2
|
|
+ bounds.centery
|
|
)
|
|
|
|
ticks += int(current_velocity / 180 * math.pi)
|
|
current_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)
|