Spaces:
Sleeping
Sleeping
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() | |