pygame-examples
pygame-examples copied to clipboard
Typewriter example
Description: Class that draws text in a typewriter fashion (letter by letter with some configurable delay in between, also a blinking cursor), newlines included, position sets the center position. Should support any font. Basically an improved version of this:
import functools
import pygame
WIDTH, HEIGHT = 640, 360
FPS = 60
@functools.lru_cache(maxsize=32)
def _load_font(name, size):
return pygame.font.Font(name, size)
class TypeWriter:
def __init__(self, pos, size, text, color="white", font_name=None, delay=200):
self.color = color
self.font = _load_font(font_name, size)
self.text = text
self.letter_index = 0
self.length = len(text)
self.rect = self.font.render(text, True, color).get_rect(center=pos)
self.surface = pygame.Surface((self.rect.width, self.rect.height))
self.delay = delay
self._counter = 0
def update(self, dt):
if self.letter_index > self.length:
return
self._counter += dt
if self._counter >= self.delay:
self._counter -= self.delay
self.surface.blit(
self.font.render(
"".join(self.text[: self.letter_index]), True, self.color
),
(0, 0),
)
self.letter_index += 1
def draw(self, surface):
surface.blit(self.surface, self.rect)
def main():
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
type_writer = TypeWriter((320, 180), 64, "Hello, World!", delay=300)
running = True
while running:
dt = clock.tick(FPS)
screen.fill("black")
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
running = False
type_writer.update(dt)
type_writer.draw(screen)
pygame.display.flip()
if __name__ == "__main__":
main()