pybeamshow/effects/crazypolys.py
2023-02-23 02:10:50 +01:00

123 lines
4 KiB
Python

from effects.effect import Effect
from typing import Any
from util.color import Colors, DynamicColor
from util.transform import transform_bounce
import math
import pygame as pg
import random
class CrazyPolys(Effect):
def __init__(
self,
bounds: pg.Rect,
color: DynamicColor,
sizes=(100, 500),
velocity=(0.1, 1),
x_factor=(0.1, 1),
y_factor=(0.1, 1),
segments=100,
*groups: pg.sprite.Group,
) -> None:
self.min_size = sizes[0]
self.max_size = sizes[1]
self.min_velocity = velocity[0]
self.max_velocity = velocity[1]
self.velocity = 0.8 # random.randint(self.min_velocity, self.max_velocity)
self.ticks = 0.0
self.color = color
self.size = self.max_size
# self.size = (math.sin(self.ticks) / 2 + 0.5) * (
# self.max_size - self.min_size
# ) + self.min_size
image = pg.Surface((self.max_size, self.max_size))
image.fill(Colors.Black)
image.set_colorkey(Colors.Black)
self.r = random.randint(1, 50)
self.R = self.r * random.randint(1, 5)
self.a = random.randint(1, self.r)
self.nu = random.choice([-1, 1])
self.R_nu_r = self.R + self.nu * self.r
self.R_nu_r_divr = self.R_nu_r / self.r
# self.R = random.randint(1, 50) / 2
# self.r = random.randint(1, int(self.R + 0.6)) / 2
# self.a = random.randint(1, int(self.r + 0.6))
print(f"R:{self.R} r:{self.r} a:{self.a}")
self.background = pg.Surface((self.max_size, self.max_size))
self.background.fill(Colors.Black)
# self.background.set_alpha(4)
self.background.set_alpha(20)
super().__init__(
image,
pg.Rect(
bounds.centerx - self.size / 2,
bounds.centery - self.size / 2,
self.size,
self.size,
),
*groups,
)
self.bounds = bounds
self.bouncer = transform_bounce(
bounds=bounds, velocity=velocity, x_factor=x_factor, y_factor=y_factor
)
next(self.bouncer)
self.size_f = (self.size * 0.6 - 10) / 2 / (self.R + self.r)
self.cursor = self.calc_pos()
self.update(is_beat=False)
def calc_pos(self):
x = self.max_size / 2 + self.size_f * (
(self.R_nu_r) * math.cos(self.ticks)
- self.a * self.nu * math.cos(self.R_nu_r_divr * self.ticks)
)
y = self.max_size / 2 + self.size_f * (
(self.R_nu_r) * math.sin(self.ticks)
- self.a * math.sin(self.R_nu_r_divr * self.ticks)
)
# x = self.max_size / 2 + self.size_f * (
# (self.R - self.r) * math.cos(self.r / self.R * self.ticks)
# + self.a * math.cos((1 - self.r / self.R) * self.ticks)
# )
# y = self.max_size / 2 + self.size_f * (
# (self.R - self.r) * math.sin(self.r / self.R * self.ticks)
# + self.a * math.sin((1 - self.r / self.R) * self.ticks)
# )
return x, y
def update(self, *args: Any, **kwargs: Any) -> None:
# new_size = (math.sin(self.ticks) / 2 + 0.5) * (
# self.max_size - self.min_size
# ) + self.min_size
# new_scale = new_size - self.rect.width
# self.rect.inflate_ip(new_scale, new_scale)
self.rect.center = self.bouncer.send((self.rect.size, kwargs["is_beat"]))
self.image.blit(self.background, (0, 0))
new_cursor = self.calc_pos()
pg.draw.line(
self.image,
self.color if isinstance(self.color, pg.Color) else next(self.color),
self.cursor,
new_cursor,
width=10,
)
self.cursor = new_cursor
# pg.draw.ellipse(
# self.image,
# self.color if isinstance(self.color, pg.Color) else next(self.color),
# ((0, 0), self.rect.size),
# )
self.ticks += self.velocity
# self.velocity = random.randint(self.min_velocity, self.max_velocity)