pybeamshow/effects/effect.py
2023-02-18 23:17:03 +01:00

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)