pygame-examples icon indicating copy to clipboard operation
pygame-examples copied to clipboard

Typewriter example

Open Matiiss opened this issue 3 years ago • 0 comments

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()

Matiiss avatar Jul 01 '22 02:07 Matiiss