Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import string
- from pygame import Rect
- from pygame.sprite import Sprite, Group
- from pygame.font import Font
- def color_wash(image, color):
- if not isinstance(color, pygame.Color):
- color = pygame.Color(color)
- width, height = image.get_size()
- for x in range(width):
- for y in range(height):
- pcolor = image.get_at((x, y))
- color.a = pcolor.a
- image.set_at((x, y), color)
- PRINTABLE = string.ascii_letters + string.punctuation + string.digits
- class Character(Sprite):
- def __init__(self, image):
- super().__init__()
- self.image = image
- self.rect = image.get_rect()
- class Pen:
- @classmethod
- def font(cls, fontname, size, color, printable=PRINTABLE):
- font = Font(fontname, size)
- return cls(font, color, printable)
- def __init__(self, font, color, printable=PRINTABLE):
- self.printable = printable
- self.characters = {}
- self.advance = {}
- self.font = font
- self._character_build(color)
- def _character_build(self, color):
- for char in self.printable:
- self.characters[char] = self.font.render(char, 1, color)
- printable_space = self.printable + " "
- for char in printable_space:
- result = {}
- for key in printable_space:
- text = char + key
- adv = self.font.size(text)[0]
- base = self.font.size(key)[0]
- result[key] = adv - base
- self.advance[char] = result
- def _line(self, text, position, padding, anchor, yline=0):
- line = []
- previous_char = None
- width, height = self.font.size(text)
- rect = Rect(0, 0, width + padding * len(text) - padding, height)
- setattr(rect, anchor, position)
- xpos, ypos = rect.topleft
- for enumx, char in enumerate(text):
- if char in self.printable:
- if previous_char:
- xpos += self.advance[previous_char][char] + padding
- images = self.characters[char]
- sprite = Character(images)
- sprite.rect.topleft = xpos, ypos
- line.append(sprite)
- previous_char = char
- elif char == " ":
- if previous_char:
- xpos += self.advance[previous_char][char] + padding
- previous_char = char
- return line
- def render(self, text, position, padding=(0, 0), anchor='topleft'):
- lines = self.write(text, position, padding, anchor)
- result = Group()
- for line in lines:
- result.add(line)
- return result
- def set_color(self, color):
- for image in self.characters.values():
- color_wash(image, color)
- def write(self, text, position, padding=(0, 0), anchor='topleft'):
- if text.count('\n') > 0:
- lines = []
- xpos, ypos = position
- text_lines = text.split('\n')
- linesize = self.font.get_linesize() + padding[1]
- for yline, text_line in enumerate(text_lines):
- pos = xpos, ypos
- line = self._line(text_line, pos, padding[0], anchor, yline)
- lines.append(line)
- ypos += linesize
- return lines
- else:
- return [self._line(text, position, padding[0], anchor, 0)]
Advertisement
Add Comment
Please, Sign In to add comment