User Tools

Site Tools


p5bg:pygame_framework

This is an old revision of the document!


PyGame Framework

This is a lighter version of pygame terminal, without the terminal stuff, mainly used for quickly making a 2d arcade style game. We will quickly go over the main points and then discuss changes and patterns discovered over the past several projects.

main.py

Unchanged from pygame terminal. It is possible to completely minimize main.py into a game = Game(), but that just passes the buck. Main should be the first place someone looks, so let's keep some 'headline information' there– the name of the program, general window information, and so on. We'll pass this information to Game, to keep Game's init as simple as possible.

class Window

Minor changes. drawText was moved to here, since it operates on the window itself and can sometimes be needed by things outside of Game.

    # a member of class Window.
    def drawText(self, at_x, at_y, text, color):
        text_surface = self.font.render(text, False, color)
        x = self.font.fontwidth * at_x
        y = self.font.fontheight * at_y
        self.screen.blit(text_surface, (x + 2, y))

class Font

As seen above we may or may not abstract font out to a different class as well. More complete code will be presented in the future.

class Screen

New addition. One of the things we discovered is the need for a “class Constants” or “Globals” sometimes, and screen related things like FPS are kept here. This is required sometimes by sprites to calculate their updates.


class Screen:

    WIDTH = 800
    HEIGHT = 600
    FPS = 60

    MARGIN = 96
    GAMETOP = MARGIN
    GAMEBOT = HEIGHT - MARGIN

Here, margin and gametop are used as display boundaries for things like sprites so text can be drawn at the top of the screen and things stay within the edges of the screen. The most important parts are WIDTH and HEIGHT. A big question is, should Screen and Window be merged?

game.py

A number of changes. One, instead of display.flip() we use display.update(). Second, instead of time.sleep(1 / 60) to get 60 FPS we use p

import pygame
import time

class Game:
    def __init__(self, window):
        self.window = window
        self.screen = window.screen
        self.logo = window.logo
        self.font = window.font

        # Clear the screen.
        self.screen.fill((0, 0, 0))

        # Set up game variables (see notes)
        self.running = True

    def start(self):

        # Clock for controlling the frame rate
        clock = pygame.time.Clock()

        # Main game loop
        frame_counter = 0
        
        while self.running == True:
            # Manage time for timed events like animations
            time_clock = (time.time() * 1000) - time_start
            frame_counter += 1
            if frame_counter > 60:
                frame_counter = 1
                
            # All event handling
            self.checkEvents()
            
            # Frame generation
            self.screen.fill((0, 0, 0))  # Clear the screen.
            self.drawGame()
            pygame.display.update()  # update the display. Can also use flip()
            
            # Control the frame rate
            clock.tick(60)
            

    def drawGame(self):
        self.window.drawText(0, 2, "it works!", "gray")


    def checkEvents(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
                return

            if event.type == pygame.KEYDOWN:
                # key down event, process keys.

                if event.key == pygame.K_LEFT:
                    pass
                    
                elif event.key == pygame.K_RIGHT:
                    pass

                elif event.key == pygame.K_UP:
                    pass

                elif event.key == pygame.K_DOWN:
                    pass

                else:
                    pass

p5bg/pygame_framework.1725439412.txt.gz · Last modified: 2024/09/04 08:43 by appledog

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki