all colors are Generator
This commit is contained in:
parent
a9c9582180
commit
92730bee9a
17 changed files with 257 additions and 96 deletions
|
@ -1,6 +1,6 @@
|
||||||
from effects.effect import MovingEffect
|
from effects.effect import MovingEffect
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
from util.color import Colors, DynamicColor
|
from util.color import Colors, ColorGenerator
|
||||||
import math
|
import math
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
import random
|
import random
|
||||||
|
@ -12,10 +12,11 @@ class BouncingSpot(MovingEffect):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
sizes=(10, 100),
|
sizes=(10, 100),
|
||||||
velocity=(1, 10),
|
velocity=(1, 10),
|
||||||
mover: Optional[PositionGenerator] = None,
|
mover: Optional[PositionGenerator] = None,
|
||||||
|
on_beat_color: bool = False,
|
||||||
*groups: pg.sprite.Group
|
*groups: pg.sprite.Group
|
||||||
) -> None:
|
) -> None:
|
||||||
self.min_size = sizes[0]
|
self.min_size = sizes[0]
|
||||||
|
@ -26,6 +27,8 @@ class BouncingSpot(MovingEffect):
|
||||||
self.velocity = random.randint(self.min_velocity, self.max_velocity)
|
self.velocity = random.randint(self.min_velocity, self.max_velocity)
|
||||||
self.ticks = random.randint(0, 360)
|
self.ticks = random.randint(0, 360)
|
||||||
self.color = color
|
self.color = color
|
||||||
|
self.spot_color = next(color)
|
||||||
|
self.on_beat_color = on_beat_color
|
||||||
size = (math.sin(self.ticks) / 2 + 0.5) * (
|
size = (math.sin(self.ticks) / 2 + 0.5) * (
|
||||||
self.max_size - self.min_size
|
self.max_size - self.min_size
|
||||||
) + self.min_size
|
) + self.min_size
|
||||||
|
@ -58,10 +61,13 @@ class BouncingSpot(MovingEffect):
|
||||||
|
|
||||||
self.rect.center = self.mover.send((self.rect.size, kwargs["is_beat"]))
|
self.rect.center = self.mover.send((self.rect.size, kwargs["is_beat"]))
|
||||||
|
|
||||||
|
if (not self.on_beat_color) or kwargs["is_beat"]:
|
||||||
|
self.spot_color = next(self.color)
|
||||||
|
|
||||||
self.image.fill(Colors.Black)
|
self.image.fill(Colors.Black)
|
||||||
pg.draw.ellipse(
|
pg.draw.ellipse(
|
||||||
self.image,
|
self.image,
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color),
|
self.spot_color,
|
||||||
((0, 0), self.rect.size),
|
((0, 0), self.rect.size),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from effects.effect import Effect
|
from effects.effect import Effect
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from util.color import Colors, DynamicColor
|
from util.color import Colors, ColorGenerator
|
||||||
from util.transform import transform_bounce
|
from util.transform import transform_bounce
|
||||||
import math
|
import math
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
|
@ -11,7 +11,7 @@ class CrazyPolys(Effect):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
sizes=(100, 500),
|
sizes=(100, 500),
|
||||||
velocity=(0.1, 1),
|
velocity=(0.1, 1),
|
||||||
x_factor=(0.1, 1),
|
x_factor=(0.1, 1),
|
||||||
|
@ -106,7 +106,7 @@ class CrazyPolys(Effect):
|
||||||
new_cursor = self.calc_pos()
|
new_cursor = self.calc_pos()
|
||||||
pg.draw.line(
|
pg.draw.line(
|
||||||
self.image,
|
self.image,
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color),
|
next(self.color),
|
||||||
self.cursor,
|
self.cursor,
|
||||||
new_cursor,
|
new_cursor,
|
||||||
width=30,
|
width=30,
|
||||||
|
@ -115,7 +115,7 @@ class CrazyPolys(Effect):
|
||||||
|
|
||||||
# pg.draw.ellipse(
|
# pg.draw.ellipse(
|
||||||
# self.image,
|
# self.image,
|
||||||
# self.color if isinstance(self.color, pg.Color) else next(self.color),
|
# next(self.color),
|
||||||
# ((0, 0), self.rect.size),
|
# ((0, 0), self.rect.size),
|
||||||
# )
|
# )
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
from typing import Any, List, Tuple
|
from typing import Any, List, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import Effect
|
from effects.effect import Effect
|
||||||
from util.color import Colors, DynamicColor
|
from util import XYCoord
|
||||||
|
from util.color import Colors, ColorGenerator
|
||||||
import random
|
import random
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
|
||||||
|
@ -22,7 +23,7 @@ class Spot(pg.sprite.Sprite):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
color: pg.Color,
|
color: pg.Color,
|
||||||
position: Tuple[int, int],
|
position: XYCoord,
|
||||||
radius: int,
|
radius: int,
|
||||||
fade_in: int,
|
fade_in: int,
|
||||||
hold: int,
|
hold: int,
|
||||||
|
@ -57,7 +58,7 @@ class DoubleSpot(Effect):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
radius: int = 200,
|
radius: int = 200,
|
||||||
hold: int = 60 * 1,
|
hold: int = 60 * 1,
|
||||||
fade_out: bool = False,
|
fade_out: bool = False,
|
||||||
|
@ -127,13 +128,13 @@ class DoubleSpot(Effect):
|
||||||
and len(self.spots) == 2
|
and len(self.spots) == 2
|
||||||
):
|
):
|
||||||
spot_color = (
|
spot_color = (
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color)
|
next(self.color),
|
||||||
)
|
)
|
||||||
self.add_spot(spot_color)
|
self.add_spot(spot_color)
|
||||||
self.add_spot(spot_color)
|
self.add_spot(spot_color)
|
||||||
elif kwargs["is_beat"]:
|
elif kwargs["is_beat"]:
|
||||||
spot_color = (
|
spot_color = (
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color)
|
next(self.color),
|
||||||
)
|
)
|
||||||
self.add_spot(spot_color)
|
self.add_spot(spot_color)
|
||||||
self.add_spot(spot_color)
|
self.add_spot(spot_color)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import Any, List, Tuple
|
from typing import Any, List, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import Effect
|
from effects.effect import Effect
|
||||||
from util.color import Colors, color_fade, DynamicColor
|
from util.color import Colors, color_fade, ColorGenerator
|
||||||
from util.transform import transform_falling
|
from util.transform import transform_falling
|
||||||
import random
|
import random
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
@ -11,7 +11,7 @@ class Drop(pg.sprite.Sprite):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.rect.Rect,
|
bounds: pg.rect.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
acceleration=1.0,
|
acceleration=1.0,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ class Drop(pg.sprite.Sprite):
|
||||||
self.color = color
|
self.color = color
|
||||||
pg.draw.ellipse(
|
pg.draw.ellipse(
|
||||||
self.image,
|
self.image,
|
||||||
next(self.color) if isinstance(self.color, Generator) else self.color,
|
next(self.color),
|
||||||
((0, 0), self.rect.size),
|
((0, 0), self.rect.size),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -65,8 +65,8 @@ class Drops(Effect):
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
colors: Tuple[
|
colors: Tuple[
|
||||||
DynamicColor,
|
ColorGenerator,
|
||||||
DynamicColor,
|
ColorGenerator,
|
||||||
],
|
],
|
||||||
sizes=(10, 100),
|
sizes=(10, 100),
|
||||||
drop_rate=0.2,
|
drop_rate=0.2,
|
||||||
|
|
|
@ -27,3 +27,28 @@ class MovingEffect(Effect):
|
||||||
super().__init__(image, rect, *groups)
|
super().__init__(image, rect, *groups)
|
||||||
self.mover = mover or transform_static(rect.center)
|
self.mover = mover or transform_static(rect.center)
|
||||||
next(self.mover)
|
next(self.mover)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
ring chase two colors
|
||||||
|
|
||||||
|
square
|
||||||
|
|
||||||
|
square two color
|
||||||
|
|
||||||
|
line falling
|
||||||
|
|
||||||
|
line scan vh
|
||||||
|
|
||||||
|
starfield spawn chance
|
||||||
|
|
||||||
|
rainbow circle rotate
|
||||||
|
|
||||||
|
spot row
|
||||||
|
|
||||||
|
alles größer
|
||||||
|
|
||||||
|
fix double spot 4 spots
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
45
effects/line.py
Normal file
45
effects/line.py
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
from effects.effect import MovingEffect
|
||||||
|
from typing import Any, Iterable, Optional, Tuple
|
||||||
|
from util import XYCoord
|
||||||
|
from util.color import Colors, ColorGenerator
|
||||||
|
from util.transform import PositionGenerator
|
||||||
|
import pygame as pg
|
||||||
|
|
||||||
|
|
||||||
|
class Lines(MovingEffect):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
bounds: pg.Rect,
|
||||||
|
vectors: Iterable[Tuple[XYCoord, XYCoord, ColorGenerator]],
|
||||||
|
thickness: int,
|
||||||
|
mover: Optional[PositionGenerator],
|
||||||
|
*groups: pg.sprite.Group,
|
||||||
|
) -> None:
|
||||||
|
self.vectors = vectors
|
||||||
|
self.thickness = thickness
|
||||||
|
|
||||||
|
image = pg.Surface(bounds.size)
|
||||||
|
image.fill(Colors.Black)
|
||||||
|
image.set_colorkey(Colors.Black)
|
||||||
|
|
||||||
|
super().__init__(
|
||||||
|
image,
|
||||||
|
pg.Rect(bounds),
|
||||||
|
mover,
|
||||||
|
*groups,
|
||||||
|
)
|
||||||
|
self.bounds = bounds
|
||||||
|
self.update(is_beat=False)
|
||||||
|
|
||||||
|
def update(self, *args: Any, **kwargs: Any) -> None:
|
||||||
|
self.rect.topleft = self.mover.send((self.rect.size, kwargs["is_beat"]))
|
||||||
|
self.image.fill(Colors.Black)
|
||||||
|
|
||||||
|
for line in self.vectors:
|
||||||
|
pg.draw.line(
|
||||||
|
self.image,
|
||||||
|
next(line[2]),
|
||||||
|
line[0],
|
||||||
|
line[1],
|
||||||
|
width=self.thickness,
|
||||||
|
)
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import Any, Optional, Tuple
|
from typing import Any, Optional, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import MovingEffect
|
from effects.effect import MovingEffect
|
||||||
from util.color import Colors, DynamicColor
|
from util.color import Colors, ColorGenerator
|
||||||
import math
|
import math
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
|
||||||
|
@ -19,8 +19,8 @@ class Moonflower(MovingEffect):
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
colors: Tuple[
|
colors: Tuple[
|
||||||
DynamicColor,
|
ColorGenerator,
|
||||||
DynamicColor,
|
ColorGenerator,
|
||||||
],
|
],
|
||||||
mover: Optional[PositionGenerator] = None,
|
mover: Optional[PositionGenerator] = None,
|
||||||
beat_color: bool = False,
|
beat_color: bool = False,
|
||||||
|
|
|
@ -99,7 +99,7 @@ class MovingWave(MovingEffect):
|
||||||
|
|
||||||
# pg.draw.ellipse(
|
# pg.draw.ellipse(
|
||||||
# self.image,
|
# self.image,
|
||||||
# self.color if isinstance(self.color, pg.Color) else next(self.color),
|
# next(self.color),
|
||||||
# ((0, 0), self.rect.size),
|
# ((0, 0), self.rect.size),
|
||||||
# )
|
# )
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,14 @@ from random import choice, randint, randrange
|
||||||
|
|
||||||
from effects.effect import Effect
|
from effects.effect import Effect
|
||||||
from effects.line import Lines
|
from effects.line import Lines
|
||||||
from util.color import color_darken, color_randomize, color_strobe, color_wheel, Colors
|
from util.color import (
|
||||||
|
color_darken,
|
||||||
|
color_randomize,
|
||||||
|
color_static,
|
||||||
|
color_strobe,
|
||||||
|
color_wheel,
|
||||||
|
Colors,
|
||||||
|
)
|
||||||
|
|
||||||
# from effects.crazypolys import CrazyPolys
|
# from effects.crazypolys import CrazyPolys
|
||||||
from effects.drops import Drops
|
from effects.drops import Drops
|
||||||
|
@ -33,7 +40,7 @@ class Presets:
|
||||||
self.beat_reactive = beat_reactive
|
self.beat_reactive = beat_reactive
|
||||||
|
|
||||||
def default(self) -> List[Effect]:
|
def default(self) -> List[Effect]:
|
||||||
return self.FallingLine()
|
return self.SpotRow()
|
||||||
|
|
||||||
def __getitem__(self, idx: str) -> List[Effect]:
|
def __getitem__(self, idx: str) -> List[Effect]:
|
||||||
return getattr(self, idx)()
|
return getattr(self, idx)()
|
||||||
|
@ -158,7 +165,7 @@ class Presets:
|
||||||
return [
|
return [
|
||||||
BouncingSpot(
|
BouncingSpot(
|
||||||
bounds=self.bounds,
|
bounds=self.bounds,
|
||||||
color=Colors.White,
|
color=color_static(Colors.White),
|
||||||
sizes=(self.bounds.height / 3, self.bounds.height / 3),
|
sizes=(self.bounds.height / 3, self.bounds.height / 3),
|
||||||
velocity=(1, 1),
|
velocity=(1, 1),
|
||||||
mover=transform_bounce(
|
mover=transform_bounce(
|
||||||
|
@ -179,10 +186,13 @@ class Presets:
|
||||||
beat_color=self.beat_reactive,
|
beat_color=self.beat_reactive,
|
||||||
size=int(self.bounds.height * 0.8),
|
size=int(self.bounds.height * 0.8),
|
||||||
outer=randint(3, 8),
|
outer=randint(3, 8),
|
||||||
velocity=(0.5, 0.5),
|
|
||||||
rot_speed=1,
|
rot_speed=1,
|
||||||
|
mover=transform_bounce(
|
||||||
|
bounds=self.bounds,
|
||||||
|
velocity=(0.5, 0.5),
|
||||||
x_factor=(0.5, 1.5),
|
x_factor=(0.5, 1.5),
|
||||||
y_factor=(0.5, 3),
|
y_factor=(0.5, 3),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -301,7 +311,7 @@ class Presets:
|
||||||
return [
|
return [
|
||||||
Starfield(
|
Starfield(
|
||||||
bounds=self.bounds,
|
bounds=self.bounds,
|
||||||
color=Colors.White,
|
color=color_static(Colors.White),
|
||||||
# color=color_randomize(),
|
# color=color_randomize(),
|
||||||
fade_in=True,
|
fade_in=True,
|
||||||
fade_out=True,
|
fade_out=True,
|
||||||
|
@ -330,7 +340,10 @@ class Presets:
|
||||||
return [
|
return [
|
||||||
Drops(
|
Drops(
|
||||||
bounds=self.bounds,
|
bounds=self.bounds,
|
||||||
colors=(Colors.Green, color_darken(Colors.Blue, 0.2)),
|
colors=(
|
||||||
|
color_static(Colors.Green),
|
||||||
|
color_static(color_darken(Colors.Blue, 0.2)),
|
||||||
|
),
|
||||||
sizes=(self.bounds.width // 40, self.bounds.width // 35),
|
sizes=(self.bounds.width // 40, self.bounds.width // 35),
|
||||||
drop_rate=0.1,
|
drop_rate=0.1,
|
||||||
drop_acceleration=0.3,
|
drop_acceleration=0.3,
|
||||||
|
@ -341,7 +354,7 @@ class Presets:
|
||||||
return [
|
return [
|
||||||
ScanReticle(
|
ScanReticle(
|
||||||
self.bounds,
|
self.bounds,
|
||||||
(Colors.Red, Colors.White),
|
(color_static(Colors.Red), color_static(Colors.White)),
|
||||||
mover=transform_bounce(
|
mover=transform_bounce(
|
||||||
bounds=self.bounds,
|
bounds=self.bounds,
|
||||||
velocity=(0.5, 1),
|
velocity=(0.5, 1),
|
||||||
|
@ -351,29 +364,89 @@ class Presets:
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
def Spiro(self) -> List[Effect]:
|
def FallingLine(self) -> List[Effect]:
|
||||||
|
bounds = pg.rect.Rect(0, 0, self.bounds.width, 30)
|
||||||
return [
|
return [
|
||||||
Spiro(
|
Lines(
|
||||||
bounds=self.bounds,
|
bounds=bounds,
|
||||||
color=color_wheel(increase=2),
|
vectors=(((0, 15), (self.bounds.width, 15), color_wheel()),),
|
||||||
sizes=(self.bounds.height, self.bounds.height),
|
thickness=30,
|
||||||
velocity=(0.1, 0.4),
|
mover=transform_falling(
|
||||||
mover=transform_bounce(
|
bounds,
|
||||||
self.bounds,
|
acceleration=0.8,
|
||||||
velocity=(0.1, 0.4),
|
initial_pos=(0, 0),
|
||||||
x_factor=(1, 1),
|
initial_velocity=0.01,
|
||||||
y_factor=(0.5, 1.5),
|
on_beat_reset=True,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
def CrazyPolys(self) -> List[Effect]:
|
def StrobeLine(self) -> List[Effect]:
|
||||||
|
bounds = pg.rect.Rect(0, 0, self.bounds.width, 30)
|
||||||
return [
|
return [
|
||||||
CrazyPolys(
|
Lines(
|
||||||
bounds=self.bounds,
|
bounds=bounds,
|
||||||
color=color_wheel(increase=2),
|
vectors=(
|
||||||
sizes=(self.bounds.height, self.bounds.height),
|
(
|
||||||
velocity=(0.1, 0.4),
|
(0, 15),
|
||||||
y_factor=(0.5, 1.5),
|
(self.bounds.width, 15),
|
||||||
|
color_strobe(color=color_wheel(), rate=(2, 8)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
thickness=30,
|
||||||
|
mover=transform_falling(
|
||||||
|
bounds,
|
||||||
|
acceleration=0.8,
|
||||||
|
initial_pos=(0, 0),
|
||||||
|
initial_velocity=0.01,
|
||||||
|
on_beat_reset=True,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# def Spiro(self) -> List[Effect]:
|
||||||
|
# return [
|
||||||
|
# Spiro(
|
||||||
|
# bounds=self.bounds,
|
||||||
|
# color=color_wheel(increase=2),
|
||||||
|
# sizes=(self.bounds.height, self.bounds.height),
|
||||||
|
# velocity=(0.1, 0.4),
|
||||||
|
# mover=transform_bounce(
|
||||||
|
# self.bounds,
|
||||||
|
# velocity=(0.1, 0.4),
|
||||||
|
# x_factor=(1, 1),
|
||||||
|
# y_factor=(0.5, 1.5),
|
||||||
|
# ),
|
||||||
|
# ),
|
||||||
|
# ]
|
||||||
|
|
||||||
|
# def CrazyPolys(self) -> List[Effect]:
|
||||||
|
# return [
|
||||||
|
# CrazyPolys(
|
||||||
|
# bounds=self.bounds,
|
||||||
|
# color=color_wheel(increase=2),
|
||||||
|
# sizes=(self.bounds.height, self.bounds.height),
|
||||||
|
# velocity=(0.1, 0.4),
|
||||||
|
# y_factor=(0.5, 1.5),
|
||||||
|
# ),
|
||||||
|
# ]
|
||||||
|
|
||||||
|
def SpotRow(self) -> List[Effect]:
|
||||||
|
count = 8
|
||||||
|
size = self.bounds.width // (count * 2)
|
||||||
|
return [
|
||||||
|
BouncingSpot(
|
||||||
|
bounds=self.bounds,
|
||||||
|
color=color_wheel(hue=3 * 360 // count * i, increase=60),
|
||||||
|
sizes=(size, size),
|
||||||
|
velocity=(1, 1),
|
||||||
|
on_beat_color=True,
|
||||||
|
mover=transform_static(
|
||||||
|
(
|
||||||
|
size + size * 2 * i,
|
||||||
|
size,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
for i in range(count)
|
||||||
|
]
|
||||||
|
|
|
@ -98,7 +98,7 @@ class RainbowWave(MovingEffect):
|
||||||
|
|
||||||
# pg.draw.ellipse(
|
# pg.draw.ellipse(
|
||||||
# self.image,
|
# self.image,
|
||||||
# self.color if isinstance(self.color, pg.Color) else next(self.color),
|
# next(self.color),
|
||||||
# ((0, 0), self.rect.size),
|
# ((0, 0), self.rect.size),
|
||||||
# )
|
# )
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
from typing import Any, Tuple
|
from typing import Any, Optional, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import Effect
|
from effects.effect import MovingEffect
|
||||||
from util.color import Colors, DynamicColor
|
from util.color import Colors, ColorGenerator
|
||||||
from util.transform import transform_bounce
|
from util.transform import PositionGenerator, transform_bounce
|
||||||
import math
|
import math
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
|
||||||
|
@ -13,27 +13,22 @@ def calc_radii(size, f):
|
||||||
return r_c, r_a
|
return r_c, r_a
|
||||||
|
|
||||||
|
|
||||||
class RotatingPoly(Effect):
|
class RotatingPoly(MovingEffect):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
beat_color: bool = False,
|
beat_color: bool = False,
|
||||||
size: int = 100,
|
size: int = 100,
|
||||||
velocity: Tuple[float, float] = (1, 10),
|
|
||||||
rot_speed: float = 5,
|
rot_speed: float = 5,
|
||||||
outer: int = 5,
|
outer: int = 5,
|
||||||
spot_factor: float = 0.5,
|
spot_factor: float = 0.5,
|
||||||
x_factor: Tuple[float, float] = (0.1, 1),
|
mover: Optional[PositionGenerator] = None,
|
||||||
y_factor: Tuple[float, float] = (0.1, 1),
|
|
||||||
*groups: pg.sprite.Group
|
*groups: pg.sprite.Group
|
||||||
) -> None:
|
) -> None:
|
||||||
# self.min_velocity = velocity[0]
|
|
||||||
# self.max_velocity = velocity[1]
|
|
||||||
|
|
||||||
self.rot_speed = rot_speed
|
self.rot_speed = rot_speed
|
||||||
self.rotation = 0.0
|
self.rotation = 0.0
|
||||||
# self.velocity = random.uniform(self.min_velocity, self.max_velocity)
|
|
||||||
self.color = color
|
self.color = color
|
||||||
self.beat_color = beat_color
|
self.beat_color = beat_color
|
||||||
self.o_count = outer
|
self.o_count = outer
|
||||||
|
@ -42,7 +37,6 @@ class RotatingPoly(Effect):
|
||||||
self.o_f = 1 / math.sin(math.pi / self.o_count)
|
self.o_f = 1 / math.sin(math.pi / self.o_count)
|
||||||
|
|
||||||
self.spot_radius, self.o_radius = calc_radii(size, self.o_f)
|
self.spot_radius, self.o_radius = calc_radii(size, self.o_f)
|
||||||
# self.i_radius = (self.o_radius - self.spot_radius) * 0.5
|
|
||||||
|
|
||||||
image = pg.Surface((size, size))
|
image = pg.Surface((size, size))
|
||||||
image.fill(Colors.Black)
|
image.fill(Colors.Black)
|
||||||
|
@ -55,20 +49,15 @@ class RotatingPoly(Effect):
|
||||||
size,
|
size,
|
||||||
size,
|
size,
|
||||||
),
|
),
|
||||||
|
mover,
|
||||||
*groups
|
*groups
|
||||||
)
|
)
|
||||||
self.bounds = bounds
|
self.bounds = bounds
|
||||||
self.bouncer = transform_bounce(
|
self.o_color = next(self.color)
|
||||||
bounds=bounds, velocity=velocity, x_factor=x_factor, y_factor=y_factor
|
|
||||||
)
|
|
||||||
next(self.bouncer)
|
|
||||||
self.o_color = (
|
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color)
|
|
||||||
)
|
|
||||||
self.update(is_beat=False)
|
self.update(is_beat=False)
|
||||||
|
|
||||||
def update(self, *args: Any, **kwargs: Any) -> None:
|
def update(self, *args: Any, **kwargs: Any) -> None:
|
||||||
self.rect.center = self.bouncer.send((self.rect.size, kwargs["is_beat"]))
|
self.rect.center = self.mover.send((self.rect.size, kwargs["is_beat"]))
|
||||||
|
|
||||||
self.image.fill(Colors.Black)
|
self.image.fill(Colors.Black)
|
||||||
|
|
||||||
|
@ -96,5 +85,3 @@ class RotatingPoly(Effect):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.rotation += self.rot_speed
|
self.rotation += self.rot_speed
|
||||||
# self.ticks += int(self.velocity / 180 * math.pi)
|
|
||||||
# self.velocity = random.uniform(self.min_velocity, self.max_velocity)
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import Any, Optional, Tuple
|
from typing import Any, Optional, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import MovingEffect
|
from effects.effect import MovingEffect
|
||||||
from util.color import Colors, DynamicColor
|
from util.color import Colors, ColorGenerator
|
||||||
from util.transform import PositionGenerator
|
from util.transform import PositionGenerator
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@ class ScanReticle(MovingEffect):
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
colors: Tuple[
|
colors: Tuple[
|
||||||
DynamicColor,
|
ColorGenerator,
|
||||||
DynamicColor,
|
ColorGenerator,
|
||||||
],
|
],
|
||||||
mover: Optional[PositionGenerator] = None,
|
mover: Optional[PositionGenerator] = None,
|
||||||
*groups: pg.sprite.Group
|
*groups: pg.sprite.Group
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import MovingEffect
|
from effects.effect import MovingEffect
|
||||||
from util.color import Colors, DynamicColor
|
from util.color import Colors, ColorGenerator
|
||||||
from util.transform import PositionGenerator
|
from util.transform import PositionGenerator
|
||||||
import random
|
import random
|
||||||
import math
|
import math
|
||||||
|
@ -11,7 +11,7 @@ class Spiro(MovingEffect):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
sizes=(100, 500),
|
sizes=(100, 500),
|
||||||
velocity=(0.1, 1),
|
velocity=(0.1, 1),
|
||||||
segments=100,
|
segments=100,
|
||||||
|
@ -84,7 +84,7 @@ class Spiro(MovingEffect):
|
||||||
new_cursor = self.calc_pos()
|
new_cursor = self.calc_pos()
|
||||||
pg.draw.line(
|
pg.draw.line(
|
||||||
self.image,
|
self.image,
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color),
|
next(self.color),
|
||||||
self.cursor,
|
self.cursor,
|
||||||
new_cursor,
|
new_cursor,
|
||||||
width=15,
|
width=15,
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
from typing import Any, List, Tuple
|
from typing import Any, List, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
from effects.effect import Effect
|
from effects.effect import Effect
|
||||||
from util.color import Colors, DynamicColor
|
from util import XYCoord
|
||||||
|
from util.color import Colors, ColorGenerator
|
||||||
import random
|
import random
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
|
||||||
|
@ -22,7 +23,7 @@ class Spot(pg.sprite.Sprite):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
color: pg.Color,
|
color: pg.Color,
|
||||||
position: Tuple[int, int],
|
position: XYCoord,
|
||||||
radius: int,
|
radius: int,
|
||||||
fade_in: int,
|
fade_in: int,
|
||||||
hold: int,
|
hold: int,
|
||||||
|
@ -57,7 +58,7 @@ class Starfield(Effect):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
color: DynamicColor,
|
color: ColorGenerator,
|
||||||
radius: int = 20,
|
radius: int = 20,
|
||||||
star_factor: float = 0.2,
|
star_factor: float = 0.2,
|
||||||
hold: int = 60 * 3,
|
hold: int = 60 * 3,
|
||||||
|
@ -138,7 +139,7 @@ class Starfield(Effect):
|
||||||
missing_stars = self.num_stars - len(self.stars)
|
missing_stars = self.num_stars - len(self.stars)
|
||||||
for _ in range(random.randint(missing_stars // 3, missing_stars // 2)):
|
for _ in range(random.randint(missing_stars // 3, missing_stars // 2)):
|
||||||
star_color = (
|
star_color = (
|
||||||
self.color if isinstance(self.color, pg.Color) else next(self.color)
|
next(self.color),
|
||||||
)
|
)
|
||||||
self.add_star(star_color)
|
self.add_star(star_color)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
XYCoord = Tuple[int, int]
|
|
@ -1,11 +1,10 @@
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import random
|
import random
|
||||||
from typing import Generator, Literal, Sequence, Union
|
from typing import Generator, Literal, Sequence, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
|
|
||||||
|
|
||||||
ColorGenerator = Generator[pg.Color, None, None]
|
ColorGenerator = Generator[pg.Color, None, None]
|
||||||
DynamicColor = Union[pg.Color, ColorGenerator]
|
|
||||||
|
|
||||||
|
|
||||||
def copy_color(source: pg.Color) -> pg.Color:
|
def copy_color(source: pg.Color) -> pg.Color:
|
||||||
|
@ -24,13 +23,19 @@ class Colors:
|
||||||
Magenta = pg.Color(255, 0, 255)
|
Magenta = pg.Color(255, 0, 255)
|
||||||
|
|
||||||
|
|
||||||
def color_wheel(hue=0, increase=1) -> ColorGenerator:
|
def color_static(color: pg.Color) -> ColorGenerator:
|
||||||
|
while True:
|
||||||
|
yield color
|
||||||
|
|
||||||
|
|
||||||
|
def color_wheel(hue: int = 0, increase: int = 1, repeat: int = 1) -> ColorGenerator:
|
||||||
color = copy_color(Colors.Red)
|
color = copy_color(Colors.Red)
|
||||||
h, s, l, a = color.hsla
|
h, s, l, a = color.hsla
|
||||||
h = hue % 360
|
h = hue % 360
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
color.hsla = h, s, l, a
|
color.hsla = h, s, l, a
|
||||||
|
for _ in range(repeat):
|
||||||
yield color
|
yield color
|
||||||
h = (h + increase) % 360
|
h = (h + increase) % 360
|
||||||
|
|
||||||
|
@ -104,6 +109,21 @@ def color_darken(color: pg.Color, factor: float) -> pg.Color:
|
||||||
return new_color
|
return new_color
|
||||||
|
|
||||||
|
|
||||||
|
def color_strobe(
|
||||||
|
color: ColorGenerator,
|
||||||
|
rate: Tuple[int, int],
|
||||||
|
phase: int = 0,
|
||||||
|
flash_color: ColorGenerator = color_static(Colors.Black),
|
||||||
|
) -> ColorGenerator:
|
||||||
|
counter = phase
|
||||||
|
while True:
|
||||||
|
if counter < rate[0]:
|
||||||
|
yield from flash_color
|
||||||
|
else:
|
||||||
|
yield from color
|
||||||
|
counter = (counter + 1) % rate[1]
|
||||||
|
|
||||||
|
|
||||||
def rainbow_surface(
|
def rainbow_surface(
|
||||||
image: pg.Surface,
|
image: pg.Surface,
|
||||||
orientation: Literal["h", "v"] = "h",
|
orientation: Literal["h", "v"] = "h",
|
||||||
|
@ -113,9 +133,9 @@ def rainbow_surface(
|
||||||
wheel = color_wheel(hue, increase)
|
wheel = color_wheel(hue, increase)
|
||||||
if orientation == "h":
|
if orientation == "h":
|
||||||
h = image.get_height()
|
h = image.get_height()
|
||||||
for x in range(image.get_width()):
|
for x in range(image.get_width() // 5):
|
||||||
pg.draw.line(image, next(wheel), (x, 0), (x, h))
|
pg.draw.line(image, next(wheel), (x * 5, 0), (x * 5, h), width=5)
|
||||||
elif orientation == "v":
|
elif orientation == "v":
|
||||||
w = image.get_width()
|
w = image.get_width()
|
||||||
for y in range(image.get_height()):
|
for y in range(image.get_height() // 5):
|
||||||
pg.draw.line(image, next(wheel), (0, y), (w, y))
|
pg.draw.line(image, next(wheel), (0, y * 5), (w, y * 5), width=5)
|
||||||
|
|
|
@ -3,12 +3,12 @@ import random
|
||||||
from typing import Generator, Optional, Tuple
|
from typing import Generator, Optional, Tuple
|
||||||
import pygame as pg
|
import pygame as pg
|
||||||
|
|
||||||
PositionGenerator = Generator[
|
from util import XYCoord
|
||||||
Tuple[int, int], Tuple[Tuple[int, int], Optional[bool]], None
|
|
||||||
]
|
PositionGenerator = Generator[XYCoord, Tuple[XYCoord, Optional[bool]], None]
|
||||||
|
|
||||||
|
|
||||||
def transform_static(position: Tuple[int, int]) -> PositionGenerator:
|
def transform_static(position: XYCoord) -> PositionGenerator:
|
||||||
while True:
|
while True:
|
||||||
_ = yield (position)
|
_ = yield (position)
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ def transform_bounce(
|
||||||
def transform_oscillate(
|
def transform_oscillate(
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
period: int,
|
period: int,
|
||||||
initial_pos: Tuple[int, int] = (-1, -1),
|
initial_pos: XYCoord = (-1, -1),
|
||||||
) -> PositionGenerator:
|
) -> PositionGenerator:
|
||||||
pos_x = float(initial_pos[0] if initial_pos[0] > 0 else bounds.left)
|
pos_x = float(initial_pos[0] if initial_pos[0] > 0 else bounds.left)
|
||||||
pos_y = float(initial_pos[1] if initial_pos[1] > 0 else bounds.top)
|
pos_y = float(initial_pos[1] if initial_pos[1] > 0 else bounds.top)
|
||||||
|
@ -85,7 +85,7 @@ def transform_oscillate(
|
||||||
def transform_falling(
|
def transform_falling(
|
||||||
bounds: pg.Rect,
|
bounds: pg.Rect,
|
||||||
acceleration: float,
|
acceleration: float,
|
||||||
initial_pos: Tuple[int, int],
|
initial_pos: XYCoord,
|
||||||
initial_velocity: float = 1.0,
|
initial_velocity: float = 1.0,
|
||||||
on_beat_reset: bool = False,
|
on_beat_reset: bool = False,
|
||||||
) -> PositionGenerator:
|
) -> PositionGenerator:
|
||||||
|
|
Loading…
Reference in a new issue