from effects.effect import MovingEffect from typing import Any, Optional from util import XYCoord from util.color import Colors, ColorGenerator, color_fade, copy_color import math import pygame as pg from util.transform import PositionGenerator def calc_x(R, T, D): a = 1 + R**2 b = 2 * T * (1 + R) c = T**2 * (1 + R**2) - D**2 return max( (-b + math.sqrt(b**2 - 4 * a * c)) / (2 * a), (-b - math.sqrt(b**2 - 4 * a * c)) / (2 * a), ) class Rectangle(MovingEffect): def __init__( self, bounds: pg.Rect, color: ColorGenerator, size: int, aspect: float = 1.0, rot_speed: float = 0.5, thickness: int = 30, mover: Optional[PositionGenerator] = None, *groups: pg.sprite.Group, ) -> None: self.color_gen = color self.color = copy_color(next(color)) self.fader = color_fade( initial_color=self.color, end_color=next(self.color_gen), duration=10 ) self.angle = 45.0 self.rot_speed = rot_speed self.thickness = thickness x = calc_x(aspect, thickness, size) # print(x) # print(size) self.rsize = (x, (x + 2 * thickness) * aspect - 2 * thickness) # print(self.rsize) self.rect_image = pg.Surface(self.rsize) self.rect_image.fill(Colors.Black) self.rect_image.set_colorkey(Colors.Black) image = pg.Surface((size, size)) image.fill(Colors.Black) image.set_colorkey(Colors.Black) super().__init__( image, pg.Rect( bounds.centerx - size // 2, bounds.centery - size // 2, size, size, ), mover, *groups, ) self.update(is_beat=True) def update(self, *args: Any, **kwargs: Any) -> None: # self.rect.center = self.mover.send((self.rect.size, kwargs["is_beat"])) self.image.fill(Colors.Blue) self.rect_image.fill(Colors.Green) # rc = next(self.fader) # pg.draw.rect( # self.rect_image, # rc, # ((0, 0), self.rsize), # 0, # ) # pg.draw.rect( # self.rect_image, # Colors.Black, # ( # self.thickness // 2, # self.thickness // 2, # self.rsize[0] - self.thickness, # self.rsize[1] - self.thickness, # ), # 0, # ) # if kwargs["is_beat"]: # new_color = next(self.color_gen) # self.fader = color_fade( # initial_color=self.color, end_color=new_color, duration=10 # ) # self.color = copy_color(new_color) # pg.draw.rect( # self.rect_image, # Colors.White, # ( # self.thickness, # self.thickness, # self.rsize[0] - self.thickness * 2, # self.rsize[1] - self.thickness * 2, # ), # 0, # ) r2 = pg.transform.rotate(self.rect_image, self.angle) # print(self.image.get_width()-r2.get_width()) self.image.blit( r2, ( (self.image.get_width() - r2.get_width()) // 2, (self.image.get_height() - r2.get_height()) // 2, ), ) # self.angle = (self.angle + self.rot_speed) % (360)