コード例 #1
0
ファイル: cauchemar.py プロジェクト: Godot-dev/IUT_GameJam
class Cauchemar:
    def __init__(self, difficulty, legumesFruits, game):
        self.difficulty = difficulty
        self.legumesFruits = legumesFruits
        self.images = self.loadImagesEnnemis()
        self.game = game
        self.player = Player()    
        self.background = pygame.image.load(f'assets/backgrounds/backgroundD{difficulty}.jpg')
        self.background = pygame.transform.scale(self.background, (1024, 768))
        self.liste_projectiles = []
        self.time = 0 # Indique le nombre de frames effectuées dans le cauchemar depuis son début
        self.frequence = 75 - difficulty * 15 # La fréquence à laquelle on crée un ennemi
        self.cooldownDash = 120 # Permets de ne pas autoriser le joueur de faire des dash à l'infini mais toutes les deux secondes

    def drawCauchemar(self, screen):
        screen.blit(self.background, (0,0))
        screen.blit(self.player.image, self.player.rect)
        self.player.image = self.player.imageFront
        self.time += 1
        if self.time % self.frequence == 0: # On ajoute un ennemi tous les self.frequence frames
            j = random.randint(0,2) # sélectionne l'un des trois legumes/fruits du cauchemar
            self.liste_projectiles.append(globals()[self.legumesFruits[j]](self.difficulty, self.images[j])) # et l'ajoute à l'écran
        
        for projectile in self.liste_projectiles:
            projectile.move()
            
            screen.blit(projectile.image,projectile.rect) 
            if(projectile.__class__.__name__ == "Carotte" and projectile.time > 120 and projectile.time < 180):
                pygame.draw.rect(screen,(255,255,255),projectile.bar_position)
            if projectile.rect.x + projectile.rect.w < 0  or projectile.rect.x - projectile.rect.w > 1024 or projectile.rect.y + projectile.rect.h < 0 or projectile.rect.y - projectile.rect.h > 768: 
                self.liste_projectiles.remove(projectile)
            elif self.check_collision(projectile):
                self.liste_projectiles.remove(projectile)
                self.player.health -= 1
                if self.player.health == 2:
                    pygame.mixer.Sound.play(pygame.mixer.Sound('assets/music/SoundFX/Hit1.ogg'))
                    self.player.imageVie = pygame.image.load('assets/character/2coeurs.png')
                elif self.player.health == 1:
                    pygame.mixer.Sound.play(pygame.mixer.Sound('assets/music/SoundFX/Hit1.ogg'))
                    self.player.imageVie = pygame.image.load('assets/character/1coeurs.png')
                else: # Le joueur perds la partie, il faudra remplir plus tard le else
                    self.game.temps = math.floor(self.time/60) + (self.game.etape-1)*60
                    pygame.mixer.Sound.play(pygame.mixer.Sound('assets/music/SoundFX/Hit1.ogg'))
                    self.game.perdu = True # Permettra de charger la bonne cinématique de défaite
                    self.terminerCauchemar()
        self.updateTimeBar(screen)
        if self.cooldownDash < 120:
            self.updateDashBar(screen)
        
        screen.blit(self.player.imageVie, (884,670))
        

    def catch_signal(self, pressed):
        f = self.player.velocity
        self.cooldownDash += 1
        diagonale = (pressed.get(pygame.K_RIGHT) and pressed.get(pygame.K_UP)) or (pressed.get(pygame.K_RIGHT) and pressed.get(pygame.K_DOWN)) or (pressed.get(pygame.K_LEFT) and pressed.get(pygame.K_UP)) or (pressed.get(pygame.K_LEFT) and pressed.get(pygame.K_DOWN))
        immobile = True # On ne sait pas encore si le joueur bouge, on part donc du principe qu'il est immobile
        # Si le joueur va en diagonale, sa vitesse doit être réduite car il va faire deux déplacements en une seule action
        if (diagonale): # Si le joueur se déplace quelque part en diagonale
            f *= 0.7
            self.player.velocity = int(f)

        if pressed.get(pygame.K_RIGHT) and self.player.rect.x + self.player.rect.width < 1024:
            self.player.move_right()
            immobile = False
        if pressed.get(pygame.K_LEFT) and self.player.rect.x > 0:
            self.player.move_left()
            immobile = False
        if pressed.get(pygame.K_UP) and self.player.rect.y > 0:
            self.player.move_up()
            immobile = False
        if pressed.get(pygame.K_DOWN) and self.player.rect.y + self.player.rect.height < 768:
            self.player.move_down()
            immobile = False
        if pressed.get(pygame.K_SPACE) and self.cooldownDash > 120 and not diagonale and not immobile:
            pygame.mixer.Sound.play(pygame.mixer.Sound('assets/music/SoundFX/Dash1.wav'))
            self.player.dash(pressed)
            self.cooldownDash = 0 # On remets le cooldown à 0, il faudra donc attendre deux secondes (60*2 = 120) pour en effectuer un à nouveau 

        # Sa vitesse peut désormais être remise par défaut
        if (diagonale):
            self.player.velocity = int(f/0.7)

    def check_collision(self, projectile):
        if(projectile.__class__.__name__ == "Carotte" and projectile.time > 120 and projectile.time < 180):
            return self.player.rect.colliderect(projectile.bar_position)
        else:
            return pygame.sprite.collide_mask(self.player, projectile)

    def updateTimeBar(self, screen):
        bar_back_color = (60,63,60) # Couleur de fond
        bar_color = (111,210,46) # Couleur affichant l'avancée du niveau

        bar_back_position = [30, 730, 128, 10]
        l = self.time / 30
        bar_position = [30, 730, l, 10]

        pygame.draw.rect(screen,bar_back_color,bar_back_position)
        pygame.draw.rect(screen,bar_color,bar_position)

        if(l == 128): # Le niveau est terminé
            self.game.health += self.player.health
            if self.difficulty == 3: # Si le joueur vient de finir le dernier niveau, alors on informe game qui se chargera de finir le jeu
                self.game.victoire = True 
            self.terminerCauchemar()

    def updateDashBar(self, screen):
        bar_back_color = (60,63,60) # Couleur de fond
        bar_color = (111,210,46) # Couleur affichant l'avancée du niveau

        bar_back_position = [448, 730, 128, 10]
        bar_position = [448, 730, self.cooldownDash, 10]

        pygame.draw.rect(screen,bar_back_color,bar_back_position)
        pygame.draw.rect(screen,bar_color,bar_position)

    def terminerCauchemar(self):
        self.game.finCauchemar = True
        self.game.phaseDeJeu = None
    
    def loadImagesEnnemis(self):
        return [pygame.image.load(f'assets/projectiles/{self.legumesFruits[0]}.png'),pygame.image.load(f'assets/projectiles/{self.legumesFruits[1]}.png'),pygame.image.load(f'assets/projectiles/{self.legumesFruits[2]}.png')]