Skip to content

Instantly share code, notes, and snippets.

@f0ursqu4r3
Created October 20, 2021 02:10
Show Gist options
  • Save f0ursqu4r3/1d52404ab2e542ca98a43ad20ee8257b to your computer and use it in GitHub Desktop.
Save f0ursqu4r3/1d52404ab2e542ca98a43ad20ee8257b to your computer and use it in GitHub Desktop.
Bar class useful for progress or health bars
import pygame
from pygame import Vector2
from pygame import Vector3
from typing import Tuple
class Bar:
def __init__(self,
pos: Tuple[int, int],
size: Tuple[int, int],
color: Tuple[int, int, int],
bg_color: Tuple[int, int, int]=(0,0,0,30),
border_color: Tuple[int, int, int]=(0,0,0),
anchor: str='center',
vertical: bool=False) -> None:
self.pos = Vector2(pos)
self.size = Vector2(size)
self.color = color
self.bg_color = bg_color
self.border_color = border_color
self.anchor = anchor
self.vertical = vertical
self._progress = 0
self.progress = 0
self.surf = None
def draw(self, surface: pygame.Surface) -> None:
if not self.surf or self._progress != self.progress:
surf = pygame.Surface(self.size, pygame.SRCALPHA)
size = self.size - Vector2(2)
if self.vertical:
size.y = max(0, min(size.y * self.progress, size.y))
else:
size.x = max(0, min(size.x * self.progress, size.x))
pygame.draw.rect(surf, self.bg_color, (Vector2(), self.size), border_radius=4)
y_pos = 1
if self.vertical:
y_pos = self.size.y - size.y
pygame.draw.rect(surf, self.color, (Vector2(1, y_pos), size), border_radius=1)
pygame.draw.rect(surf, self.border_color, (Vector2(), self.size), 1, border_radius=4)
self.surf = surf
self._progress = self.progress
pos = self.pos - self.get_anchor_offset()
surface.blit(self.surf, pos)
def get_anchor_offset(self) -> None:
if self.anchor == 'top_left':
return Vector2()
elif self.anchor == 'top_center':
return Vector2(self.size.x/2, 0)
elif self.anchor == 'top_right':
return Vector2(self.size.x, 0)
elif self.anchor == 'middle_left':
return Vector2(0, self.size.y/2)
elif self.anchor == 'center':
return Vector2(self.size.x/2, self.size.y/2)
elif self.anchor == 'middle_right':
return Vector2(self.size.x, self.size.y/2)
elif self.anchor == 'bottom_left':
return Vector2(0, self.size.y)
elif self.anchor == 'bottom_center':
return Vector2(self.size.x/2, self.size.y)
elif self.anchor == 'bottom_right':
return size
return Vector2()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment