import json import pygame, sys, os sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../..") from classes.Spritesheet import Spritesheet class Menu: def __init__(self, screen, dashboard, level, sound): self.screen = screen self.sound = sound self.start = False self.inSettings = False self.state = 0 self.level = level self.music = True self.sfx = True self.currSelectedLevel = 1 self.levelNames = [] self.inChoosingLevel = False self.dashboard = dashboard self.levelCount = 0 self.spritesheet = Spritesheet("game/supermario/img/title_screen.png") self.menu_banner = self.spritesheet.image_at( 0, 60, 2, colorkey=[255, 0, 220], ignoreTileSize=True, xTileSize=180, yTileSize=88, ) self.menu_dot = self.spritesheet.image_at( 0, 150, 2, colorkey=[255, 0, 220], ignoreTileSize=True ) self.menu_dot2 = self.spritesheet.image_at( 20, 150, 2, colorkey=[255, 0, 220], ignoreTileSize=True ) self.loadSettings("./settings.json") def update(self): self.checkInput() if self.inChoosingLevel: return self.drawMenuBackground() self.dashboard.update() if not self.inSettings: self.drawMenu() else: self.drawSettings() def drawDot(self): if self.state == 0: self.screen.blit(self.menu_dot, (145, 273)) self.screen.blit(self.menu_dot2, (145, 313)) self.screen.blit(self.menu_dot2, (145, 353)) elif self.state == 1: self.screen.blit(self.menu_dot, (145, 313)) self.screen.blit(self.menu_dot2, (145, 273)) self.screen.blit(self.menu_dot2, (145, 353)) elif self.state == 2: self.screen.blit(self.menu_dot, (145, 353)) self.screen.blit(self.menu_dot2, (145, 273)) self.screen.blit(self.menu_dot2, (145, 313)) def loadSettings(self, url): try: with open(url) as jsonData: data = json.load(jsonData) if data["sound"]: self.music = True self.sound.music_channel.play(self.sound.soundtrack, loops=-1) else: self.music = False if data["sfx"]: self.sfx = True self.sound.allowSFX = True else: self.sound.allowSFX = False self.sfx = False except (IOError, OSError): self.music = False self.sound.allowSFX = False self.sfx = False self.saveSettings("./settings.json") def saveSettings(self, url): data = {"sound": self.music, "sfx": self.sfx} with open(url, "w") as outfile: json.dump(data, outfile) def drawMenu(self): self.drawDot() self.dashboard.drawText("CHOOSE LEVEL", 180, 280, 24) self.dashboard.drawText("SETTINGS", 180, 320, 24) self.dashboard.drawText("EXIT", 180, 360, 24) def drawMenuBackground(self, withBanner=True): for y in range(0, 13): for x in range(0, 20): self.screen.blit( self.level.sprites.spriteCollection.get("sky").image, (x * 32, y * 32), ) for y in range(13, 15): for x in range(0, 20): self.screen.blit( self.level.sprites.spriteCollection.get("ground").image, (x * 32, y * 32), ) if withBanner: self.screen.blit(self.menu_banner, (150, 80)) self.screen.blit( self.level.sprites.spriteCollection.get("mario_idle").image, (2 * 32, 12 * 32), ) self.screen.blit( self.level.sprites.spriteCollection.get("bush_1").image, (14 * 32, 12 * 32) ) self.screen.blit( self.level.sprites.spriteCollection.get("bush_2").image, (15 * 32, 12 * 32) ) self.screen.blit( self.level.sprites.spriteCollection.get("bush_2").image, (16 * 32, 12 * 32) ) self.screen.blit( self.level.sprites.spriteCollection.get("bush_2").image, (17 * 32, 12 * 32) ) self.screen.blit( self.level.sprites.spriteCollection.get("bush_3").image, (18 * 32, 12 * 32) ) self.screen.blit(self.level.sprites.spriteCollection.get("goomba-1").image, (18.5*32, 12*32)) def drawSettings(self): self.drawDot() self.dashboard.drawText("MUSIC", 180, 280, 24) if self.music: self.dashboard.drawText("ON", 340, 280, 24) else: self.dashboard.drawText("OFF", 340, 280, 24) self.dashboard.drawText("SFX", 180, 320, 24) if self.sfx: self.dashboard.drawText("ON", 340, 320, 24) else: self.dashboard.drawText("OFF", 340, 320, 24) self.dashboard.drawText("BACK", 180, 360, 24) def chooseLevel(self): self.drawMenuBackground(False) self.inChoosingLevel = True self.levelNames = self.loadLevelNames() self.drawLevelChooser() def drawBorder(self, x, y, width, height, color, thickness): pygame.draw.rect(self.screen, color, (x, y, width, thickness)) pygame.draw.rect(self.screen, color, (x, y+width, width, thickness)) pygame.draw.rect(self.screen, color, (x, y, thickness, width)) pygame.draw.rect(self.screen, color, (x+width, y, thickness, width+thickness)) def drawLevelChooser(self): j = 0 offset = 75 textOffset = 90 for i, levelName in enumerate(self.loadLevelNames()): if self.currSelectedLevel == i+1: color = (255, 255, 255) else: color = (150, 150, 150) if i < 3: self.dashboard.drawText(levelName, 175*i+textOffset, 100, 12) self.drawBorder(175*i+offset, 55, 125, 75, color, 5) else: self.dashboard.drawText(levelName, 175*j+textOffset, 250, 12) self.drawBorder(175*j+offset, 210, 125, 75, color, 5) j += 1 def loadLevelNames(self): files = [] res = [] for r, d, f in os.walk("game/supermario/levels/"): for file in f: files.append(os.path.join(r, file)) for f in files: res.append(os.path.split(f)[1].split(".")[0]) self.levelCount = len(res) return sorted(res) def checkInput(self): events = pygame.event.get() for event in events: if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: if self.inChoosingLevel or self.inSettings: self.inChoosingLevel = False self.inSettings = False self.__init__(self.screen, self.dashboard, self.level, self.sound) else: pygame.quit() sys.exit() elif event.key == pygame.K_UP or event.key == pygame.K_k: if self.inChoosingLevel: if self.currSelectedLevel > 3: self.currSelectedLevel -= 3 self.drawLevelChooser() if self.state > 0: self.state -= 1 elif event.key == pygame.K_DOWN or event.key == pygame.K_j: if self.inChoosingLevel: if self.currSelectedLevel+3 <= self.levelCount: self.currSelectedLevel += 3 self.drawLevelChooser() if self.state < 2: self.state += 1 elif event.key == pygame.K_LEFT or event.key == pygame.K_h: if self.currSelectedLevel > 1: self.currSelectedLevel -= 1 self.drawLevelChooser() elif event.key == pygame.K_RIGHT or event.key == pygame.K_l: if self.currSelectedLevel < self.levelCount: self.currSelectedLevel += 1 self.drawLevelChooser() elif event.key == pygame.K_RETURN: if self.inChoosingLevel: self.inChoosingLevel = False self.dashboard.state = "start" self.dashboard.time = 0 self.level.loadLevel(self.levelNames[self.currSelectedLevel-1]) self.dashboard.levelName = self.levelNames[self.currSelectedLevel-1].split("Level")[1] self.start = True return if not self.inSettings: if self.state == 0: self.chooseLevel() elif self.state == 1: self.inSettings = True self.state = 0 elif self.state == 2: pygame.quit() sys.exit() else: if self.state == 0: if self.music: self.sound.music_channel.stop() self.music = False else: self.sound.music_channel.play(self.sound.soundtrack, loops=-1) self.music = True self.saveSettings("./settings.json") elif self.state == 1: if self.sfx: self.sound.allowSFX = False self.sfx = False else: self.sound.allowSFX = True self.sfx = True self.saveSettings("./settings.json") elif self.state == 2: self.inSettings = False pygame.display.update()