예제 #1
0
    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)
예제 #2
0
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
예제 #3
0
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()
예제 #4
0
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()
예제 #5
0
    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