Python Forum
Thread Rating:
  • 1 Vote(s) - 2 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Classes Pygame Help
#2
Here another way.
example
import pygame
pygame.init()

class Scene:
    def blit(self, surface): pass
    def event(self, event): pass

class Game:
    fps = 0
    clock = None
    scenes = {}
    surface = None
    running = False
    next_scene = None
    current_scene = None

    @classmethod
    def setup(cls, caption, size):
        cls.clock = pygame.time.Clock()
        pygame.display.set_caption(caption)
        cls.surface = pygame.display.set_mode(size)

    @classmethod
    def loop(cls, intro_scene, fps=30):
        cls.fps = fps
        cls.running = True
        cls.next_scene = intro_scene

        while cls.running:
            if cls.next_scene:
                cls.current_scene = cls.scenes[cls.next_scene]
                cls.next_scene = None

            for event in pygame.event.get():
                cls.current_scene.event(event)

            cls.current_scene.blit(cls.surface)
            pygame.display.flip()
            cls.clock.tick(cls.fps)

class MenuItem:
    default_color = (0, 0 ,200)
    default_hcolor = (0, 200, 0)
    default_font = pygame.font.Font(None, 36)

    def __init__(self, name, callback, pydata=None):
        self.name = name
        self.hover = False
        self.pydata = pydata
        self.callback = callback

    def image(self, color=None, hcolor=None, font=None):
        self.hcolor = [hcolor, MenuItem.default_hcolor][hcolor is None]
        self.color = [color, MenuItem.default_color][color is None]
        self.font = [font, MenuItem.default_font][font is None]

        self.image = self.font.render(self.name, 1, self.color)
        self.hover_image = self.font.render(self.name, 1, self.hcolor)
        self.rect = self.image.get_rect()
        return self

class Menu:
    def __init__(self, rect, spacing=4):
        self.rect = rect
        self.items = []
        self.spacing = spacing
        self.location = 0

    def add(self, item):
        self.items.append(item)

    def blit(self, surface):
        for item in self.items:
            if not item.hover:
                surface.blit(item.image, item.rect)
            else:
                surface.blit(item.hover_image, item.rect)

    def event(self, event):
        if event.type == pygame.MOUSEMOTION:
            for item in self.items:
                if item.rect.collidepoint(event.pos):
                    item.hover = True
                else:
                    item.hover = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            for item in self.items:
                if item.rect.collidepoint(event.pos):
                    item.callback()                    

    # untested
    def align_left(self):
        x = self.rect.x + 1
        down = 1

        for item in self.items:
            item.rect.x = x
            item.rect.y = down
            down += item.font.get_linesize()

    def align_center(self):
        down = self.rect.height / 2 + self.rect.y
        for item in self.items:
            down -= (item.font.get_linesize() / 2 + self.spacing / 2)

        for item in self.items:
            item.rect.x = self.rect.x + self.rect.width / 2 - item.rect.width / 2
            item.rect.y = down
            down += item.font.get_linesize() + self.spacing

class Intro(Scene):
    def __init__(self):
        rect = Game.surface.get_rect()
        self.menu = Menu(rect.inflate(-100, -100))
        self.menu.add(MenuItem('New Game', self.menu_newgame).image())
        self.menu.add(MenuItem('Options', self.menu_options).image())
        self.menu.add(MenuItem('Quit', self.menu_quit).image(color=(150,0,0), hcolor=(250,0,0)))
        self.menu.align_center()

    def blit(self, surface):
        surface.fill((0,0,0))
        self.menu.blit(surface)

    def event(self, event):
        if event.type == pygame.QUIT:
            Game.running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                Game.running = False
        else:
            self.menu.event(event)

    def menu_newgame(self):
        print('Menu New Game')

    def menu_options(self):
        print('Menu Options')

    def menu_quit(self):
        Game.running = False

def main():
    Game.setup('Menu', (800, 600))
    Game.scenes['Intro'] = Intro()
    Game.loop('Intro')
    pygame.quit()

if __name__ == '__main__':
    main()
99 percent of computer problems exists between chair and keyboard.
Reply


Messages In This Thread
Classes Pygame Help - by sam57719 - Jul-09-2018, 09:21 AM
RE: Classes Pygame Help - by Windspar - Jul-09-2018, 05:20 PM
RE: Classes Pygame Help - by metulburr - Jul-10-2018, 03:23 AM

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020