def menu(self): pygame.mixer.music.load('images/idée-menu-non-mixée.ogg') pygame.mixer.music.set_volume(0.1) pygame.mixer.music.play(-1) self.level_selector.propose_levels() while True: self.mode.blit(self.bg, [0, 0]) self.mode.blit(self.title, [30, 20]) self.level_selector.selected_level = None self.play.platforms = [] play = Button("Jouer", 450, 70, (430, 300), self) rules = Button("Règles", 450, 70, (430, 400), self) leave = Button("Quitter", 450, 70, (430, 500), self) highlight = "None" click = False for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit(0) if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: click = True clic.play() if play.collides(): highlight = play.title if click: back = True while not self.level_selector.has_selected_level() and back: back = self.level_selector.process() elif rules.collides(): highlight = rules.title if click: self.option_menu.loop() elif leave.collides(): highlight = leave.title if click: pygame.quit() sys.exit(0) play.render(highlight) rules.render(highlight) leave.render(highlight) pygame.display.update() self.clock.tick(60)
class LevelEditor: def __init__(self, level, game_handler, mode, level_selector): self.level = level self.game_handler = game_handler self.level_selector = level_selector self.mode = mode self.bg = None self.p_type = 1 self.p1_button = None self.p2_button = None self.p3_button = None self.banderole = pygame.image.load("images/banderole plateforme.png") self.decalage = 0 self.left_click = pygame.image.load("images/left_click.png") self.right_click = pygame.image.load("images/right_click.png") self.delete = pygame.image.load("images/delete.png").convert_alpha() self.exit_button = None """ :desc - Processing """ def process(self): print("Editing levels") count = 0 # Pour le décalage du background pro = True # Condition d'arrêt de la boucle self.game_handler.register_platform_by_file( self.level.location ) # Chargement des plateformes à partir du fichier du niveau self.render_background() # Affiche le background click = False # Si le joueur clique sur sa souris while pro: self.bg.draw(self.mode) if self.p_type == 1: self.p1_button = Button("Type 1", 160, 36, (50, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 1 yellow.png", (160, 36)) self.p2_button = Button("Type 2", 250, 36, (230, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 2 white.png", (250, 36)) self.p3_button = Button("Type 3", 500, 36, (500, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 3 white.png", (500, 36)) elif self.p_type == 2: self.p1_button = Button("Type 1", 160, 36, (50, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 1 white.png", (160, 36)) self.p2_button = Button("Type 2", 250, 36, (230, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 2 yellow.png", (250, 36)) self.p3_button = Button("Type 3", 500, 36, (500, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 3 white.png", (500, 36)) elif self.p_type == 3: self.p1_button = Button("Type 1", 160, 36, (50, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 1 white.png", (160, 36)) self.p2_button = Button("Type 2", 250, 36, (230, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 2 white.png", (250, 36)) self.p3_button = Button("Type 3", 500, 36, (500, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 3 yellow.png", (500, 36)) self.exit_button = Button("Quitter", 10, 10, (10, 10), self.game_handler.ggf).custom_image( "images/getback.png", (75, 75)) place = True # Si on peut placer une plateforme highlight = "None" plat_del = None # La plateforme à supprimer i = 0 # Compteur index = 0 # Index de la plateforme à supprimer if self.p1_button.collides(): place = False self.p1_button = Button("Type 1", 160, 36, (50, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 1 white.png", (160, 36)) if click: self.p_type = 1 elif self.p2_button.collides(): place = False self.p2_button = Button("Type 2", 250, 36, (230, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 2 white.png", (250, 36)) if click: self.p_type = 2 elif self.p3_button.collides(): place = False self.p3_button = Button("Type 3", 500, 36, (500, 655 + self.decalage), self.game_handler.ggf).custom_image( "images/plateforme 3 white.png", (500, 36)) if click: self.p_type = 3 elif self.exit_button.collides(): highlight = self.exit_button.title place = False if click: pro = False click = False for plat in self.game_handler.platforms: # Intéractions avec les plateformes if plat.is_mobile(): plat.move() if plat.collides(): plat_del = plat index = i print(index) i += 1 plat.draw(self.mode) for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: mouse_pos = pygame.mouse.get_pos() if event.button == 1: click = True if place and mouse_pos[1] < 630: level_hs = open( "high scores/" + self.level.name + ".txt", "w+") for i in range(0, 3): level_hs.write("999.99\n") level_hs.close() self.game_handler.register_platform( "levels/" + self.level.name + ".txt", mouse_pos, False, self.bg.decalage, self.p_type) elif event.button == 3: click = True if place: self.game_handler.register_platform( "levels/" + self.level.name + ".txt", mouse_pos, True, self.bg.decalage, self.p_type) if event.type == pygame.QUIT: pro = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_BACKSPACE: if plat_del is not None: self.game_handler.rewrite_file( self.level, plat_del) self.game_handler.platforms.pop(index) if event.key == pygame.K_UP: count += 1 self.bg.defil("up") if self.bg.count < self.bg.n_screen: for plat in self.game_handler.platforms: plat.move_y(self.bg.delta_y) if event.key == pygame.K_DOWN and count > 0: count -= 1 self.bg.defil("down") if self.bg.count < self.bg.n_screen: for plat in self.game_handler.platforms: plat.move_y(-self.bg.delta_y) self.mode.blit(self.banderole, (0, 600 + self.decalage)) self.mode.blit(self.left_click, (1030, 645 + self.decalage)) self.mode.blit(self.right_click, (1100, 645 + self.decalage)) self.mode.blit(self.delete, (1170, 670 + self.decalage)) self.p1_button.render("") self.p2_button.render("") self.p3_button.render("") if pygame.mouse.get_pos()[1] >= 620 + self.decalage / 2: if self.decalage > 0: self.decalage -= 20 else: if self.decalage < 100: self.decalage += 10 self.exit_button.render(highlight) pygame.display.update() self.level_selector.selected_level = None self.game_handler.level = None self.game_handler.platforms = [] """ :desc - Créé un background qui bouge """ def render_background(self): self.bg = Background() self.bg.surface = self.mode
class OptionMenu(Gui): def __init__(self, ggf): self.title = "Options" self.ggf = ggf self.back = None self.le_help = None self.game_help = None def loop(self): running = True while running: self.ggf.mode.blit(self.ggf.bg, [0, 0]) self.draw_text("Options", self.ggf.font, (255, 255, 255), self.ggf.mode, 530, 10) self.back = Button("Retour", 450, 100, (450, 200), self.ggf) self.le_help = Button("Aide - Level Editor", 450, 100, (450, 300), self.ggf) self.game_help = Button("Aide - Jeu", 450, 100, (450, 400), self.ggf) lhelp = False ghelp = False click = False highlight = "None" for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(0) if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: click = True clic.play() if self.back.collides(): highlight = "Retour" if click: running = False if self.le_help.collides(): lhelp = True self.le_help.custom_image("images/leveleditorhelp.png", (700, 700)) self.le_help.move_to((300, 95)) if self.game_help.collides(): ghelp = True self.game_help.custom_image("images/gamehelp.png", (700, 700)) self.game_help.move_to((300, 150)) self.back.render(highlight) if not ghelp and not lhelp: self.le_help.render(highlight) self.game_help.render(highlight) elif ghelp: self.game_help.render(highlight) elif lhelp: self.le_help.render(highlight) pygame.display.update()
class FinalScreen: def __init__(self, ggf): self.ggf = ggf self.activated = False self.menu = None self.leave = None self.retry = None self.game = False self.state = "None" self.time_font = pygame.font.Font("images/Fipps-Regular.otf", 30) self.times = [] def is_activated(self): return self.activated """ Lit les scores retenus dans les fichier txt """ def read_scores(self, level_name): file = open("high scores/" + level_name + ".txt", "r") lines = file.readlines() self.times = [] for i in range(0, len(lines)): self.times.append(lines[i]) if '\n' in self.times[i]: self.times[i] = self.times[i].replace('\n', '') file.close() """ Met a jour les scores et les enregistre dans le level txt Si un score est meilleur qu'un autre, il le remplace """ def update_scores(self, new_score): for i in range(0, 3): self.times[i] = self.times[i].replace('\n', '') if float(new_score) <= float(self.times[i]): if i == 0: tmp = self.times[0] self.times[0] = new_score self.times[2] = self.times[1] self.times[1] = tmp break elif i == 1: tmp = self.times[1] self.times[1] = new_score self.times[2] = tmp break elif i == 2: self.times[2] = new_score break """ Enregistre le score dans le fichier texte. """ def save_scores(self, scores, level_name): file = open("high scores/" + level_name + ".txt", "w") for i in range(0, 3): file.write(scores[i] + '\n') file.close() """ Fonction d'affichage de fin de niveau. Affiche toujours le score. Dépend des retours des fonction collide de Trophy et Lava """ def process(self, level_name): running = True click = False new = ['', '', ''] self.time = str(self.ggf.timer) self.read_scores(level_name) if self.state == "Victoire": self.update_scores(self.time) for j in range(0, 3): i = 1 if (self.time == self.times[j]): new[j] = "New !" while (str(self.times[j][i]) != '.'): i += 1 self.times[j] = self.times[j].replace( self.times[j][i + 3:len(self.times[j])], "") self.save_scores(self.times, level_name) while running: highlight = "None" self.ggf.mode.blit(self.ggf.bg, [0, 0]) if self.state == "Victoire": self.ggf.mode.blit(self.ggf.win, [448, 10]) elif self.state == "Game over": self.ggf.mode.blit(self.ggf.lose, [448, 10]) self.time = self.time.replace(self.time[6:len(self.time)], "") self.ggf.draw_text( level_name, pygame.font.Font("images/Fipps-Regular.otf", 35), (255, 255, 255), self.ggf.mode, 900, 20) self.ggf.draw_text( str(self.time) + "s", pygame.font.Font("images/Fipps-Regular.otf", 35), (255, 255, 255), self.ggf.mode, 30, 20) self.ggf.draw_text("Meilleurs scores : ", self.time_font, (255, 255, 255), self.ggf.mode, 430, 250) self.ggf.draw_text(self.times[0] + "s " + new[0], self.time_font, (255, 255, 255), self.ggf.mode, 430, 300) self.ggf.draw_text(self.times[1] + "s " + new[1], self.time_font, (255, 255, 255), self.ggf.mode, 430, 350) self.ggf.draw_text(self.times[2] + "s " + new[2], self.time_font, (255, 255, 255), self.ggf.mode, 430, 400) self.retry = Button("Réessayer", 450, 70, (430, 500), self.ggf) self.menu = Button("Menu", 450, 70, (430, 600), self.ggf) if self.menu.collides(): highlight = "Menu" if click: running = False self.activated = False self.game = False elif self.retry.collides(): highlight = "Réessayer" if click: self.activated = False self.game = True running = False else: click = False for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(0) if event.type == pygame.MOUSEBUTTONUP: if event.button == 1: click = True clic.play() self.retry.render(highlight) self.menu.render(highlight) pygame.display.update()
def process(self): self.buttons.clear() self.mode.blit(self.bg, [0, 0]) self.ggf.draw_text("Select Level", self.ggf.font, (255, 255, 255), self.mode, 450, 10) i = 0 # compteur for level in self.levels: # Intéractions avec les niveaux b = Button(level.name, 450, 70, (430, 300 + i), self.ggf) edit = Button("", 40, 40, (900, 305 + i), self.ggf).custom_image("images/Edit.png", (50, 50)) delete = Button("", 40, 40, (350, 310 + i), self.ggf).custom_image("images/RedCross.png", (50, 50)) self.buttons.append((b, level, [430, 300 + i], edit, delete)) i += 80 add = Button("", 40, 40, (630, 300 + i), self.ggf).custom_image("images/AddCross.png", (50, 50)) back = Button("", 40, 40, (10, 10), self.ggf).custom_image("images/getback.png", (50, 50)) click = False highlight = "None" for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(0) if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: click = True clic.play() self.box.verifClick(pygame.mouse.get_pos()) if event.type == pygame.KEYDOWN and self.text: if self.box.active: if event.key == pygame.K_LSHIFT: self.box.caps = True self.box.addText(event.key) self.new_level_name = self.box.getText() self.text = self.box.active if event.type == pygame.KEYUP and event.key == pygame.K_LSHIFT and self.text: self.box.caps = False self.new_level = not self.text and self.new_level_name is not None and self.new_level_name != "" for button in self.buttons: if button[0].collides(): highlight = button[1].name if click: self.selected_level = button[1] self.ggf.level = self.selected_level self.ggf.game_menu.loop(self.selected_level.name) if button[3].collides(): highlight = button[1].name if click: self.selected_level = button[1] self.ggf.level = self.selected_level LevelEditor(button[1], self.ggf.game_menu.game_handler, self.mode, self).process() if button[4].collides() and not self.has_selected_level(): highlight = button[1].name if click and len(self.levels) > 1: self.remove_level(button[1]) if back.collides(): if click: return False if add.collides(): if len(self.levels) == 4: self.ggf.draw_text("Trop de niveaux", self.ggf.font, (255, 9, 28), self.mode, 350, 600) break highlight = "" if click: if self.new_level is True: level = Level(self.new_level_name) self.register_level(level) self.levels.append(level) self.box.text = "" self.new_level_name = "" self.new_level = False break self.text = True if not self.new_level else False button[0].render(highlight) button[3].render(highlight) button[4].render(highlight) add.render(highlight) back.render(highlight) if self.text: self.box.draw(self.mode) pygame.display.update() return True