def __init__(self, x: int, y: int, img: pygame.SurfaceType, buttons=None): if buttons is None: buttons = [] self.pos = x, y self.rect = pygame.Rect(x, y, *img.get_size()) self.img = img self.buttons = buttons
def blit_rotate(surf: pygame.SurfaceType, image: pygame.SurfaceType, pos: Vector, angle: float, origin_pos: Vector = None, show_rect: bool = False) -> None: """Many thanks to https://stackoverflow.com/a/54714144.""" # calculate the axis aligned bounding box of the rotated image w, h = image.get_size() box = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]] box_rotate = [p.rotate(angle) for p in box] min_box = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1]) max_box = (max(box_rotate, key=lambda p: p[0])[0], max(box_rotate, key=lambda p: p[1])[1]) # calculate the translation of the pivot if origin_pos is None: origin_pos = w / 2, h / 2 pivot = pygame.math.Vector2(origin_pos[0], -origin_pos[1]) pivot_rotate = pivot.rotate(angle) pivot_move = pivot_rotate - pivot # calculate the upper left origin of the rotated image origin = (pos[0] - origin_pos[0] + min_box[0] - pivot_move[0], pos[1] - origin_pos[1] - max_box[1] + pivot_move[1]) # get a rotated image rotated_image = pygame.transform.rotate(image, angle) # rotate and blit the image surf.blit(rotated_image, origin) # draw rectangle around the image if show_rect: pygame.draw.rect(surf, (255, 0, 0), (*origin, *rotated_image.get_size()), 2)
def __init__(self, x: int, y: int, img: pygame.SurfaceType, command=lambda: None, cost: int = 0): self.pos = x, y self.rect = pygame.Rect(x, y, *img.get_size()) self.img = img self.cost = cost self.command = command