Quick start

A minimal "Hello World" example that illustrates

  • Using a Game subclass to declare parameters like screen size, and encapsulate the main game loop
  • Leveraging Entity's built-in Finite State Machine powers to create interactive objects with relatively little code
# quickstart.py

import pygame
from pygame import Surface, Rect, Color

from robingame.input import EventQueue
from robingame.objects import Game, Group, Entity
from robingame.text import fonts


class Follower(Entity):
    rect: Rect

    def __init__(self, x: int, y: int):
        super().__init__()
        self.rect = Rect(x, y, 200, 50)
        self.state = self.state_idle  # set initial state

    def draw(self, surface: Surface, debug: bool = False):
        super().draw(surface, debug)
        # draw a filled white rectangle
        pygame.draw.rect(surface, Color("white"), self.rect)

        # draw some text
        fonts.cellphone_black.render(surface, "Drag me!", *self.rect.topleft, scale=3)

        # if debug is enabled (press F1 to toggle) draw a red outline and also the center of
        # self.rect
        if debug:
            pygame.draw.rect(surface, Color("red"), self.rect, width=2)
            pygame.draw.circle(surface, Color("red"), self.rect.center, radius=2)

    def state_idle(self):
        """
        Do nothing.
        If the left mouse button is pressed, switch to state_follow.
        """
        if EventQueue.get(type=pygame.MOUSEBUTTONDOWN, button=1):
            self.state = self.state_follow

    def state_follow(self):
        """
        Follow the mouse around the screen.
        If the left mouse button is released, switch to state_idle.
        """
        self.rect.center = pygame.mouse.get_pos()  # follow the mouse

        if EventQueue.get(type=pygame.MOUSEBUTTONUP, button=1):
            self.state = self.state_idle


class HelloWorld(Game):
    window_caption = "Hello, world!"
    window_width = 500
    window_height = 500

    def __init__(self):
        super().__init__()

        # create a Group to store sub-objects
        self.children = Group()

        # register the group with `self.child_groups` so that Game.update also calls the
        # `.update()` method of `self.children`
        self.child_groups = [self.children]

        # Add an object to the children group
        self.children.add(Follower(x=10, y=10))


if __name__ == "__main__":
    HelloWorld().main()