107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
from typing import Any, Generator, Optional, Union
|
|
import pygame as pg
|
|
from effects.effect import MovingEffect
|
|
from util.color import Colors, rainbow_surface
|
|
from util.transform import PositionGenerator
|
|
import math
|
|
|
|
|
|
class MovingWave(MovingEffect):
|
|
def __init__(
|
|
self,
|
|
bounds: pg.Rect,
|
|
color: Union[pg.Color, Generator[pg.Color, None, None]],
|
|
wave_count: float = 2,
|
|
wave_height: int = 0,
|
|
thickness: int = 10,
|
|
hue: int = 0,
|
|
color_inc: int = 1,
|
|
start_phase: int = 0,
|
|
scroll_speed: float = 5,
|
|
mover: Optional[PositionGenerator] = None,
|
|
*groups: pg.sprite.Group
|
|
) -> None:
|
|
image = pg.Surface(bounds.size)
|
|
image.fill(Colors.Black)
|
|
image.set_colorkey(Colors.Black)
|
|
super().__init__(image, bounds, mover, *groups)
|
|
self.subrect = pg.rect.Rect(0, 0, bounds.width, bounds.height)
|
|
|
|
self.wave_height = wave_height or bounds.height
|
|
self.bounds = bounds
|
|
self.scroll_speed = scroll_speed
|
|
|
|
self.rainbow = pg.Surface((bounds.width, self.wave_height))
|
|
rainbow_surface(self.rainbow, "h", hue, color_inc)
|
|
|
|
self.wave_image = pg.Surface(
|
|
(bounds.width * (wave_count + 1) / wave_count, self.wave_height)
|
|
)
|
|
self.wave_image.fill(Colors.Black)
|
|
self.wave_image.set_colorkey(Colors.Black)
|
|
|
|
y_halfheight = self.wave_image.get_height() // 2
|
|
points = [
|
|
(
|
|
x,
|
|
y_halfheight
|
|
+ (y_halfheight - thickness)
|
|
* math.sin(
|
|
math.pi
|
|
* (
|
|
start_phase / 180
|
|
+ x / self.wave_image.get_width() * 2 * (wave_count + 1)
|
|
)
|
|
),
|
|
)
|
|
for x in range(self.wave_image.get_width())
|
|
]
|
|
|
|
pg.draw.lines(self.wave_image, Colors.White, False, points, width=thickness)
|
|
|
|
pg.draw.lines(
|
|
self.wave_image,
|
|
Colors.White,
|
|
False,
|
|
[(x + 2, y) for x, y in points],
|
|
width=thickness,
|
|
)
|
|
|
|
self.update(is_beat=False)
|
|
|
|
def update(self, *args: Any, **kwargs: Any) -> None:
|
|
|
|
self.image.fill(Colors.Black)
|
|
|
|
# rainbow_surface(self.image)
|
|
|
|
pos = self.mover.send(
|
|
((self.bounds.width, self.wave_height), kwargs["is_beat"])
|
|
)
|
|
# pg.draw.rect(self.image, Colors.Black, (0, 0, self.bounds.width, pos[1]))
|
|
# pg.draw.rect(
|
|
# self.image,
|
|
# Colors.Black,
|
|
# (
|
|
# 0,
|
|
# pos[1] + self.wave_height,
|
|
# self.bounds.width,
|
|
# self.bounds.height - pos[1] + self.wave_height,
|
|
# ),
|
|
# )
|
|
|
|
self.image.blit(self.rainbow, pos)
|
|
self.image.blit(self.wave_image, pos, self.subrect, pg.BLEND_MULT)
|
|
|
|
self.subrect.move_ip(self.scroll_speed, 0)
|
|
if self.subrect.right >= self.wave_image.get_rect().right:
|
|
self.subrect.left = 0
|
|
|
|
# pg.draw.ellipse(
|
|
# self.image,
|
|
# next(self.color),
|
|
# ((0, 0), self.rect.size),
|
|
# )
|
|
|
|
# self.ticks += int(self.velocity / 180 * math.pi)
|
|
# self.velocity = random.randint(self.min_velocity, self.max_velocity)
|