Exemplo n.º 1
0
class Game_scene(Scene):
    def __init__(self, game):
        super(Game_scene, self).__init__(screen, manager)

        screen_size = self.screen.get_size()
        self.balle = Balle(self.screen,
                           (screen_size[0] / 2, screen_size[1] / 2),
                           speed=0.5)
        self.balle.direction = Direction.DOWN_RIGHT

        barre_size = (5, 64)
        self.barres = (Barre(self.screen, size=barre_size, speed=1),
                       Barre(self.screen,
                             coords=(screen_size[0] - barre_size[0],
                                     screen_size[1] - barre_size[1]),
                             size=barre_size,
                             controls={
                                 Direction.UP: pygame.K_o,
                                 Direction.DOWN: pygame.K_l
                             },
                             speed=1))

    def update(self, evts):
        self.collis()
        self.events(evts)

        self.balle.update()
        for barre in self.barres:
            barre.update()
        pygame.display.update()

    def events(self, evts):
        for evt in evts:
            if evt.type == pygame.USEREVENT:
                self.balle.reset()

    def collis(self):
        balleRect = pygame.Rect(self.balle.coords,
                                (self.balle.size, self.balle.size))
        for idx in range(len(self.barres)):
            barreRect = pygame.Rect(self.barres[idx].coords,
                                    self.barres[idx].size)

            if (balleRect.colliderect(barreRect)):
                if idx == 0:
                    if (self.balle.direction == Direction.LEFT):
                        self.balle.direction = Direction.RIGHT
                    elif self.balle.direction == Direction.DOWN_LEFT:
                        self.balle.direction = Direction.DOWN_RIGHT
                    elif self.balle.direction == Direction.UP_LEFT:
                        self.balle.direction = Direction.UP_RIGHT
                elif idx == 1:
                    if self.balle.direction == Direction.RIGHT:
                        self.balle.direction = Direction.LEFT
                    elif self.balle.direction == Direction.UP_RIGHT:
                        self.balle.direction = Direction.UP_LEFT
                    elif self.balle.direction == Direction.DOWN_RIGHT:
                        self.balle.direction = Direction.DOWN_LEFT

                self.balle.speed *= 1.01
Exemplo n.º 2
0
class Jeu:
    '''
        Classe pour gérer l'ensemble des intéractions avec le jeu.
    '''
    def __init__(self, i_fenetre):
        '''
            Définition des variables du constructeur.
        '''

        self.fenetre = i_fenetre  # Stocke les paramètres de la fenêtre.
        self.canevas = tk.Canvas(
            self.fenetre,
            width=self.largeur_fenetre(),
            height=self.hauteur_fenetre(
            ))  # Crée un canvas ( Support de tout les éléments d'affichage. )
        self.canevas.place(x=0, y=0)  # Place le Canvas

        self.raquette = Raquette(self)  # Crée une instance de Raquette.
        self.balle = Balle(self)  # Crée une instance de Balle.
        self.level_id = -1  # Numéro du niveau à charger.
        self.niveau = Level(self,
                            self.level_id)  # Crée une instance du Niveau .
        self.lives = Lives(self, 3,
                           self.largeur_fenetre() / 16,
                           (self.hauteur_fenetre() * 15) /
                           16)  # Crée une instance des Vies.

        self.touche_possible = [
            "q", "d", "Q", "D"
        ]  # Liste des touches qui seront utilisées pour jouer.
        self.touche_options = [
            'plus', 'minus', 'slash'
        ]  # Liste des touches qui seront utilisées pour les options du jeu (Augmenter le taux de rafraîchissement : +, le Diminuer : -, Mettre en place un sol : / ).

        # Capture les événements de la souris.
        self.canevas.bind(
            "<Motion>",
            self.moved)  # Coordonnées du curseur de la souris en abscisse.
        self.canevas.bind("<Button-3>",
                          self.rightClick)  # Si le click droit a été activé.
        self.canevas.bind(
            "<Leave>",
            self.leave)  # Si la souris a quitté le périmètre de la fenêtre.
        self.canevas.bind(
            "<Enter>",
            self.enter)  # Si la souris est entrée le périmètre de la fenêtre.

        # Capture les événements du clavier.
        self.fenetre.bind(
            "<KeyPress>", self.checkKeyPressed
        )  # Active la capture des touches du clavier dans la fenêtre.
        self.resetGame(
        )  # Initialise tout les objets avec leurs paramètres par défaut.

    def largeur_fenetre(self) -> int:
        '''
            Fonction qui retourne la valeur de la largeur de la fenêtre.
        '''

        return self.fenetre.winfo_width(
        )  # Retourne la largeur définie dans main.py

    def hauteur_fenetre(self) -> int:
        '''
            Fonction qui retourne la valeur de la hauteur de la fenêtre.
        '''

        return self.fenetre.winfo_height(
        )  # Retourne la heuteur définie dans main.py

    def checkKeyPressed(self, event):
        '''
            Fonction qui vérifie si une touche à été préssée, et si elle est prise en compte par le programme.
        '''
        # print(f"Touche : {event.keysym}") #Affiche toutes les touches préssés.
        if event.keysym == "Escape":  # Si la touche préssée est 'Echap' alors ,
            self.stopGame(
            )  #Le jeu s'arrête (Sortie de la boucle while -> infini)
        if event.keysym in self.touche_possible:  # Si la touche préssée est dans la liste de celles possibles pour le jeu.
            if event.keysym == "q" or event.keysym == "Q":  # Si la touche préssée est la touche 'q' ou 'Q' (dans le cas d'un clavier en mode MAJS )
                self.raquette.goLeft(
                )  # Apelle la fonction qui permet de déplacer la Raquette vers la Gauche.
            elif event.keysym == "d" or event.keysym == "D":  # Si la touche préssée est la touche 'd' ou 'D' (dans le cas d'un clavier en mode MAJS )
                self.raquette.goRight(
                )  # Apelle la fonction qui permet de déplacer la Raquette vers la Droite.
        if event.keysym in self.touche_options:  # Si la touche préssée est dans la liste de celles possibles pour les options.
            if event.keysym == "plus":  # Si la touche préssée est la touche '+'
                self.time_sleep /= 2  # Le taux de rafraîchissement de la fenêtre est augmenté (temps de pause diminué).
                print("Taux de Rafraîchissement : Augmenté"
                      )  # Message qui s'affiche au passage dans la condition.
            elif event.keysym == "minus":  # Si la touche préssée est la touche '-'
                self.time_sleep *= 2  # Le taux de rafraîchissement de la fenêtre est diminué (temps de pause augmenté).
                print("Taux de Rafraîchissement : Diminué"
                      )  # Message qui s'affiche au passage dans la condition.
            elif event.keysym == 'slash':  # Si la touche préssée est la touche '/'
                self.niveau.ground = not self.niveau.ground  # Toggle (= Basculer) le sol à True / False.
                if self.niveau.ground == True:  # Si le sol est à l'état True.
                    print(
                        "Sol Activé"
                    )  # Message qui s'affiche au passage dans la condition.
                else:  # Sinon
                    print(
                        "Sol Désactivé"
                    )  # Message qui s'affiche si le sol est désactivé après passage dans la boucle.

    def moved(self, event):
        '''
            Fonction récupérant les coordonnées en abscisse de la souris et  les attribuants à la raquette.
        '''
        x = event.x  # Capte les coordonées de la souris en abscisse.
        self.raquette.setPosition(
            x
        )  # Attributs les coordonnées en abscisse de la souris captés précédement et les attributs à la Raquette.

    def enter(self, event):
        '''
            Fonction qui gère l'entrée de la souris dans la zone du canvas.
        '''
        x, y = event.x, event.y  # Capture les coordonnées en abscisse, en ordonné et les stockent.
        if y > 0 and y < self.hauteur_fenetre(
        ):  # Si la souris est dans la fenêtre en hauteur alors ,
            self.raquette.setPositionEnter(
                x
            )  # On demande à placer la souris au maximum de la zone du canvas en largeur.

    def leave(self, event):
        '''
            Fonction qui gère la sortie de la souris de la zone du canvas.
        '''
        x, y = event.x, event.y  # Capture les coordonnées en abscisse, en ordonné et les stockent.
        if y > 0 and y < self.hauteur_fenetre(
        ):  # Si la souris est dans la fenêtre en hauteur alors ,
            self.raquette.setPositionLeave(
                x
            )  # On demande à placer la souris au maximum de la zone du canvas en largeur.

    def miseAJour(self):
        '''
            Fonction mettant à jour tout les éléments susceptibles de varier // Sauf les briques (Auto gérées)
        '''

        self.balle.deplacer()  #  Provoque le déplacement de la Balle.
        self.balle.paint()  #  Actualise l'affichage de la Balle.
        self.raquette.paint()  # Actualise l'affichage de la Raquette.
        self.lives.paint()  # Actualise l'affichage de la Vie.

    def stopGame(self):
        '''
            Fonction permettant d'arrêter le jeu.
        '''
        self.running = False  # Sortie de la bouble infini While.
        print("Game Stopped"
              )  # Message qui s'affiche lors de l'appel de cette fonction.

    def getStateGame(self):
        '''
            Fonction permettant d'obtenir l'état du jeu (Pause/Running). 
        '''
        return self.running  # Retourne True si le jeu est en marche, sinon, s'il est arrêté, retourne False.

    def resetGame(self):
        '''
            Réinitialise tout les paramètres par défaut de tout les objets.
        '''
        self.raquette.reset()  # Réinitialise les paramètres de la Raquette.
        self.balle.reset()  # Réinitialise les paramètres de la Balle.
        self.lives.reset()  # Réinitialise les paramètres de la Vie.
        self.niveau.reset()  # Réinitialise les paramètres du Niveau.
        self.time_sleep = 0.01  # Réinitialise les paramètres de temps de pause du jeu.

    def rightClick(self, event):
        '''
            Fonction permettant de rédémarrer le Jeu avec un clic droit si le Jeu est en pause.
        '''
        if self.getStateGame() == False:  # Si le Jeu est en pause alors ,
            self.resetGame(
            )  # L'on réinitialise tout les paramètres par défaut.
            self.startGame()  # L'on rentre dans la boucle infini While.

    def startGame(self):
        '''
            Fonction permattant de démarrer le Jeu.
        '''
        self.running = True  # Passe la condition de la boucle infini While à l'état : True (l'on rentre dans la boucle).

        while self.getStateGame():  # Tant que le Jeu est à l'état True :

            self.miseAJour()  # Mise à jour du jeu.
            self.fenetre.update()  # Mise à jour par l'os de l'affichage.
            sleep(
                self.time_sleep
            )  # Temps d'arrêt entre chaque rafraîchissement de l'écran qui est défini par : self.time_sleep .