p5bg:bullet_game
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
p5bg:bullet_game [2024/08/31 02:19] – appledog | p5bg:bullet_game [2024/09/11 06:42] (current) – removed appledog | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | = Bullet Game | ||
- | Bullet Game is our near-end stage pygame 2d game framework example. We've already done at least 6 or 7 other games using pygame. So this will document the patterns we have learned. | ||
- | We began by "just writing" | ||
- | |||
- | * Refactoring | ||
- | ** Encapsulation | ||
- | ** Light Commentary (code commentary) ex. IN and OUT for functions. | ||
- | |||
- | The primary goal is encapsulation. So, we're going to break up the old main into several new classes. | ||
- | |||
- | == main.py | ||
- | 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 ' | ||
- | |||
- | < | ||
- | from Window import Window | ||
- | from Game import Game | ||
- | |||
- | def main(): | ||
- | window = Window() | ||
- | window.setLogo(" | ||
- | window.setCaption(" | ||
- | window.setSize(Screen.WIDTH, | ||
- | window.setFont(" | ||
- | | ||
- | game = Game(window) | ||
- | game.start() | ||
- | |||
- | if __name__ == " | ||
- | main() | ||
- | </ | ||
- | |||
- | == Screen and Window | ||
- | The first thing we always do is have a Screen class and a Window class. The Screen class defines things like WIDTH and HEIGHT, and the Window class holds the pygame screen and other pygame initialization. | ||
- | |||
- | Initially, this code would appear at the start of a main.py. Later we moved it into class Game's __init__. However, to keep things clean we made it into it's own class. | ||
- | |||
- | === class Screen: | ||
- | This contains things like the width and height that will be needed by many different classes. This could also be put into window. | ||
- | |||
- | < | ||
- | |||
- | class Screen: | ||
- | WIDTH = 800 | ||
- | HEIGHT = 600 | ||
- | |||
- | 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? | ||
- | |||
- | === class Window: | ||
- | | def __init__ | This calls pygame.init(). See [[main]] | | ||
- | | setLogo | this sets the little icon in the corner of the screen. It's the icon for the desktop, usually. Normally we don't care about this. | | ||
- | | setCaption | This will set the title of the window. Usually the name of the program or game. | | ||
- | | setFont | This will probably be moved to it's own Font class later. That way we can have multiple fonts if we want and it keeps the code a bit cleaner. | | ||
- | |||
- | ==== full code | ||
- | < | ||
- | import pygame | ||
- | from Screen import * | ||
- | |||
- | class Window: | ||
- | def __init__(self): | ||
- | pygame.init() | ||
- | |||
- | def setLogo(self, | ||
- | self.logo = pygame.image.load(filename) | ||
- | pygame.display.set_icon(self.logo) | ||
- | return self.logo | ||
- | |||
- | def setCaption(self, | ||
- | pygame.display.set_caption(cap) | ||
- | |||
- | def setSize(self, | ||
- | self.width = width | ||
- | self.height = height | ||
- | self.size = (width, height) | ||
- | self.screen = pygame.display.set_mode(self.size) | ||
- | return self.screen | ||
- | |||
- | def setFont(self, | ||
- | pygame.font.init() | ||
- | self.font = pygame.font.Font(filename, | ||
- | |||
- | font_width, font_height = self.font.size(" | ||
- | self.fontwidth = font_width | ||
- | self.fontheight = size | ||
- | |||
- | return self.font</ |
p5bg/bullet_game.1725070751.txt.gz · Last modified: 2024/08/31 02:19 by appledog