Jan-04-2020, 05:22 PM
Here my example.
import os import pygame from types import SimpleNamespace from pygame.sprite import Sprite, Group # Wrap pygame builtin colors into namespace. color = SimpleNamespace(**pygame.color.THECOLORS) # Interface class Scene: def __init__(self, manager): self.manager = manager def on_draw(self, surface): pass def on_event(self, event): pass def on_update(self, delta): pass def on_quit(self): self.manager.quit() # Handles what scene is active class Manager: def __init__(self, caption, width, height, center=True, flags=0): if center: os.environ['SDL_VIDEO_CENTERED'] = '1' # Basic pygame setup pygame.display.set_caption(caption) self.surface = pygame.display.set_mode((width, height), flags) self.rect = self.surface.get_rect() self.clock = pygame.time.Clock() self.running = False self.delta = 0 self.fps = 60 self.scene = Scene(self) def mainloop(self): self.running = True while self.running: for event in pygame.event.get(): if event.type == pygame.QUIT: self.scene.on_quit() else: self.scene.on_event(event) self.scene.on_update(self.delta) self.scene.on_draw(self.surface) pygame.display.flip() self.delta = self.clock.tick(self.fps) def quit(self): self.running = False class Label(Sprite): def __init__(self, text, font, color, position, anchor="topleft"): Sprite.__init__(self) self._text = text self._font = font self._color = color self._anchor = anchor self._position = pygame.Vector2(position) self.render() def render(self): self.image = self._font.render(self._text, 1, self._color) self.rect = self.image.get_rect(**{self._anchor: self._position}) def set_text(self, text): self._text = text self.render() class Timer: def __init__(self, interval, callback, user_data=None): self.tick = pygame.time.get_ticks() + interval self.interval = interval self.callback = callback self.user_data = user_data def expire(self, ticks): if ticks > self.tick: return True return False def update(self, ticks): if ticks > self.tick: self.callback(self) self.tick += self.interval class CountDown: def __init__(self, count, update_callback, callback, interval=1000): self.timer = Timer(interval, self.timer_update) self.count = count self.callback = callback self.update_callback = update_callback def timer_update(self, timer): self.count -= 1 if self.count < 1: self.callback() else: self.update_callback(self) def update(self, ticks): self.timer.update(ticks) class MainScene(Scene): def __init__(self, manager): Scene.__init__(self, manager) position = manager.rect.centerx, 20 self.font = pygame.font.Font(None, 32) self.label = Label("Welcome", self.font, color.dodgerblue, position, "midtop") self.quit_label = None self.quit_countdown = None self.sprites = Group(self.label) def on_draw(self, surface): surface.fill(color.black) self.sprites.draw(surface) def on_quit(self): if self.quit_countdown is None: self.quit_countdown = CountDown(5, self.update_countdown_label, self.manager.quit) self.update_countdown_label(self.quit_countdown) def on_update(self, delta): ticks = pygame.time.get_ticks() if self.quit_countdown: self.quit_countdown.update(ticks) def update_countdown_label(self, countdown): text = "Closing in ... {}" if self.quit_label: self.quit_label.set_text(text.format(countdown.count)) else: self.quit_label = Label(text.format(countdown.count), self.font, color.firebrick, self.manager.rect.center, "center") self.quit_label.add(self.sprites) if __name__ == "__main__": pygame.init() manager = Manager("Countdown Example", 800, 600) manager.scene = MainScene(manager) manager.mainloop()
99 percent of computer problems exists between chair and keyboard.