Advertisement
Windspar

Pygame Basic Typewriter Example

Mar 14th, 2023 (edited)
802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.07 KB | None | 0 0
  1. # Example pygame typewriter effect.
  2. import string
  3. import pygame
  4.  
  5. text_example = """Hello !
  6. This is my example writer.
  7. I prerender all letters.
  8. I use pygame Sprite and Group classes.
  9. I use pygame.time.set_timer.
  10. Hit spacebar to reset writer."""
  11.  
  12. class LetterSprite(pygame.sprite.Sprite):
  13.     def __init__(self, letter, position, location):
  14.         super().__init__()
  15.         self.image = letter
  16.         self.rect = letter.get_rect(topleft=position)
  17.         self.location = location
  18.  
  19. class LetterPen:
  20.     def __init__(self, fontname, size, color, bcolor=None):
  21.         self.font = pygame.font.Font(fontname, size)
  22.         self.letters = {}
  23.  
  24.         data = string.ascii_letters + string.digits + string.punctuation
  25.         for letter in data:
  26.             self.letters[letter] = self.font.render(letter, 1, color, bcolor)
  27.  
  28.     def render(self, text, position):
  29.         data = []
  30.         y = position[1]
  31.         lines = text.split('\n')
  32.         linesize = self.font.get_linesize()
  33.  
  34.         for yenum, line in enumerate(lines):
  35.             for xenum, letter in enumerate(line):
  36.                 if letter != ' ':
  37.                     l = self.letters[letter]
  38.                     # Just grabbing the width
  39.                     x = self.font.size(line[:xenum])[0] + position[0]
  40.                     sprite = LetterSprite(l, (x, y), (xenum, yenum))
  41.                     data.append(sprite)
  42.  
  43.             y += linesize
  44.  
  45.         return data
  46.  
  47. class WriterText:
  48.     def __init__(self, letters, interval):
  49.         self.lgroup = pygame.sprite.Group()
  50.         self.interval = interval
  51.         self.letters = letters
  52.         self.length = 0
  53.  
  54.         self.event_id = pygame.event.custom_type()
  55.         pygame.time.set_timer(self.event_id, self.interval)
  56.  
  57.     def draw(self, surface):
  58.         self.lgroup.draw(surface)
  59.  
  60.     def reset(self):
  61.         self.length = 0
  62.         self.lgroup.empty()
  63.         pygame.time.set_timer(self.event_id, self.interval)
  64.  
  65.     def update(self):
  66.         if self.length < len(self.letters):
  67.             self.lgroup.add(self.letters[self.length])
  68.             self.length += 1
  69.         else:
  70.             pygame.time.set_timer(self.event_id, 0)
  71.  
  72. def main():
  73.     pygame.init()
  74.     pygame.display.set_caption("Typing Example")
  75.     surface = pygame.display.set_mode((600, 600))
  76.     clock = pygame.time.Clock()
  77.     rect = surface.get_rect()
  78.     delta = 0
  79.     fps = 0
  80.  
  81.     pen = LetterPen(None, 28, 'skyblue')
  82.     letters = pen.render(text_example, (20, 20))
  83.     # Higher interval for slower
  84.     writer = WriterText(letters, 50)
  85.  
  86.     running = True
  87.     while running:
  88.         for event in pygame.event.get():
  89.             if event.type == writer.event_id:
  90.                 writer.update()
  91.             elif event.type == pygame.KEYDOWN:
  92.                 if event.key == pygame.K_SPACE:
  93.                     writer.reset()
  94.             elif event.type == pygame.QUIT:
  95.                 running = False
  96.  
  97.         surface.fill('black')
  98.         writer.draw(surface)
  99.         pygame.display.flip()
  100.         delta = clock.tick(fps)
  101.  
  102.     pygame.quit()
  103.  
  104. main()
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement