Python Forum
Thread Rating:
  • 1 Vote(s) - 2 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Classes Pygame Help
#1
Hello,
I found a piece of code on the internet which creates an interactive menu. I modified it to use classes to make it more modular. It works, but the way it works isn't very Pythonic.
import pygame as pg

class Control():
    def __init__(self, size=(480,320),caption=""):
        pg.init()
        self.size = size
        self.caption = caption
        self.screen = pg.display.set_mode(self.size)
        pg.display.set_caption(self.caption)
        self.clicked = False
        self.main_menu = Menu(self,["NEW GAME", "LOAD GAME", "OPTIONS"])
        self.main()

    def main(self):
        while True:
            pg.event.pump()
            self.screen.fill((0,0,0))
            self.clicked = False
            for event in pg.event.get():
                if event.type == pg.MOUSEBUTTONUP:
                    self.clicked = True
                elif event.type == pg.QUIT:
                    pg.quit
                    sys.exit()
            self.main_menu.update()
            pg.display.update()
            

class Menu(Control):
    def __init__(self,window,labels,font=None):
        self.font = pg.font.Font(font,40)
        self.options = []
        self.window = window
        self.screen = window.screen
        self.labels = labels
        self.startypos = self.window.size[1]//(len(labels)+1)
        self.middle = self.window.size[0]//2
        count = self.startypos
        for label in labels:
            self.options.append(Option(self,label,(self.middle,count)))
            count += self.startypos

    def update(self):
        for option in self.options:
            if option.rect.collidepoint(pg.mouse.get_pos()):
                option.hovered = True
                if self.window.clicked:
                    option.clicked()
            else:
                option.hovered = False
            option.draw()

class Option(Menu):
    def __init__(self,menu,text,pos):
        self.hovered = False
        self.menu = menu
        self.font = self.menu.font
        self.screen = self.menu.screen
        self.text = text
        self.pos = pos
        self.set_rect()
        self.draw()

    def draw(self):
        self.set_rend()
        self.screen.blit(self.rend,self.rect)

    def set_rend(self):
        self.rend = self.font.render(self.text,True,self.get_colour())

    def get_colour(self):
        if self.hovered:
            return (255,255,255)
        else:
            return (100,100,100)

    def set_rect(self):
        self.set_rend()
        self.rect = self.rend.get_rect()
        self.rect.center = self.pos

    def clicked(self):
        print(self.text)


app = Control()
I have searched for a way to write this where I don't have to pass the instances through as parameters, but I haven't found a way.

Thanks!
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