Compare commits

..

28 commits

Author SHA1 Message Date
Yannis 866d964c25 Début de rendu de la vie 2024-01-14 20:07:19 +01:00
Yannis c4a19bbcbb Fix de du stockage des points 2024-01-14 20:07:07 +01:00
Yannis 2fda053da9 Ajout de l'enregistrement des boss figth 2024-01-14 19:40:02 +01:00
Yannis a25d9d459b Ajout d'une deuxième musique 2024-01-14 19:39:30 +01:00
Yannis 9923bba45c Ajout du lancement de l'OST de combat 2024-01-14 18:58:13 +01:00
Yannis 8b9034fb09 Ajout de l'entrée dans les temples 2024-01-14 18:56:42 +01:00
Yannis 161dfc1c24 Changement du nom des OST (dsl Kerrian mais il fallait bien) 2024-01-14 18:43:16 +01:00
Yannis 7ff96fe5c9 Retrait de la grande vitesse du joueur pour les tests 2024-01-13 23:33:27 +01:00
Yannis b65fb9d127 Fix du crash lors de la mort du joueur 2024-01-13 23:30:27 +01:00
Yannis 28df17050f Update du pdn tileset 2024-01-13 23:17:02 +01:00
Yannis af05762706 Retrait des modifications sur le joueur 2024-01-13 23:16:38 +01:00
Yannis e043093748 Ajout des entrées de temples 2024-01-13 23:15:08 +01:00
Yannis 28a4cf1db0 Nettoyage du code 2024-01-13 22:57:07 +01:00
Yannis 29adfda8dd Fix dans la map 2024-01-13 22:50:21 +01:00
Yannis 989587379a Fix des problèmes lors du merge 2024-01-13 22:19:42 +01:00
Yannis 323e190474 Merge remote-tracking branch 'origin/main' into game_assembly
# Conflicts:
#	src/main.py
2024-01-13 21:42:10 +01:00
Yannis 4a613ccfb6 Merge remote-tracking branch 'origin/game_assembly' into game_assembly 2024-01-09 12:00:57 +01:00
Yannis 8d12c791d1 Ajout des temples 2024-01-09 12:00:24 +01:00
Adastram b2a1311839 Merge branch 'game_assembly' of https://gitea.tipragot.fr/rfg/nsi-rpg into game_assembly 2024-01-09 11:20:56 +01:00
Adastram 37db2829a7 Added shuffle function for background music 2024-01-09 11:20:47 +01:00
Yannis 347febaf11 Fix du spam de la touche o 2024-01-09 10:21:27 +01:00
Adastram 0a659dcbe0 Removed Debug prints 2024-01-09 10:03:19 +01:00
Adastram 7c6031a713 FIXED SOUND MANAGER AND MAIN 2024-01-09 08:02:33 +01:00
Adastram df86633f8e Added main OST and auto_audio_start, WORKING VERSION 2024-01-09 08:01:52 +01:00
Yannis 6219dcdb71 Réglage du joueur 2024-01-08 21:17:43 +01:00
Yannis b3663ed81b Fix collisions map 5 2024-01-08 21:03:48 +01:00
Yannis 04e51bd376 Update de la map 5 2024-01-08 20:55:52 +01:00
Yannis 75ce3b6c37 Update de la map 5 2024-01-08 19:12:26 +01:00
15 changed files with 5237 additions and 165 deletions

BIN
assets/OST/boss_fight_1.mp3 Normal file

Binary file not shown.

BIN
assets/OST/boss_fight_2.mp3 Normal file

Binary file not shown.

BIN
assets/OST/forest_sound.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 210 KiB

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,44 @@ class BossFightManager:
self.current_boss_animation = "none"
self.current_player_animation = "none"
self.fights = {}
self.current_fight_id = -1
self.player_points = -1
self.boss_points = -1
def update(self):
"""Met à jour le combat de boss."""
if self.engine.game_state == GameState.BOSS_FIGHT:
pass
def register_fight_data(self, fight_id: int, boss_name: str, total_concurrent_points: int, boss_damage_count: int):
"""Enregistre les données permettant de mettre en place le combat."""
self.fights[fight_id] = [boss_name, total_concurrent_points, boss_damage_count]
def enter_boss_fight(self, fight_id: int):
"""Entre dans le combat de boss donné."""
self.current_fight_id = fight_id
self.engine.sound_manager.music_pause(3)
self.engine.renderer.fadeout(3, (0, 0, 0), 100, True, self.setup_fight)
def setup_fight(self):
"""Met en place le combat."""
# Change la musique
self.engine.sound_manager.music_remove_from_playlist(".\\assets\\OST\\forest_sound.mp3")
self.engine.sound_manager.music_add_to_playlist(".\\assets\\OST\\boss_fight_1.mp3")
self.engine.sound_manager.music_start_playlist()
volume = self.engine.sound_manager.music_get_volume()
self.engine.sound_manager.music_set_volume(0)
self.engine.sound_manager.music_resume(0)
self.engine.sound_manager.music_next()
self.engine.sound_manager.music_set_volume(volume)
self.engine.entity_manager.pause()
self.player_points = self.fights[self.current_fight_id][1]
self.boss_points = self.fights[self.current_fight_id][1]
self.engine.game_state = GameState.BOSS_FIGHT

View file

@ -52,6 +52,8 @@ class Engine:
new_time = time.time_ns()/10E8
delta = new_time-last_time
if delta == 0.:
delta = 1/512 # Sécurité pour éviter les divisions par 0 si le delta baisse trop
last_time = new_time
def update(self, delta: float):

View file

@ -1,5 +1,6 @@
import math
from src.engine.enums import EntityDeathResult
from src.engine.map_manager import MapManager
from src.engine.mobs_AI import MobAI
@ -42,6 +43,9 @@ class Entity:
self.shadow = None
self.death_callback = None
self.death_result = EntityDeathResult.REMOVED
def set_default_life(self, life: int):
"""Définit le nombre de PV de l'entité. Mettre -1 pour rendre l'entité immortelle."""
self.life_points = life

View file

@ -1,4 +1,5 @@
from src.engine.entity import Entity
from src.engine.enums import EntityDeathResult
from src.engine.map_manager import MapManager
@ -32,7 +33,13 @@ class EntityManager:
entity = self.entities[entity_name]
entity.update(delta)
if entity.life_points == 0:
self.entities.pop(entity_name)
if entity.death_callback is not None:
entity.death_callback()
if entity.death_result == EntityDeathResult.REMOVED:
self.entities.pop(entity_name)
elif entity.death_result == EntityDeathResult.RESET_LIFE:
entity.life_points = entity.max_life_points
if entity.brain is not None and not self.paused:
entity.brain.update(delta)

View file

@ -8,3 +8,8 @@ class GameState(Enum):
BOSS_FIGHT = 2
MAIN_MENU = 3
# AJouter si besoin, mais à utiliser de préférence avec parsimony
class EntityDeathResult(Enum):
REMOVED = 0 # The entity is removed
RESET_LIFE = 1

View file

@ -225,6 +225,7 @@ class EventHandler:
if K_o in self.key_pressed:
print(f"Player pos: X = {self.engine.entity_manager.get_by_name('player').x} "
f"Y = {self.engine.entity_manager.get_by_name('player').y}")
self.key_pressed.remove(K_o)
if K_x in self.key_pressed:
self.engine.camera.target_zoom *= 1.01

View file

@ -179,7 +179,7 @@ class Renderer:
True, (255, 0, 0)), (0, 30))
self.window.blit(font.SysFont("Arial", 20).render(f"Zoom: {round(self.engine.camera.zoom, 2)}",
True, (255, 0, 0)), (0, 60))
self.window.blit(font.SysFont("Arial", 20).render(f"Volume: {self.engine.sound_manager.music_get_volume()}, Pos: {self.engine.sound_manager.music_get_current_song_pos()}s, Index: {self.engine.sound_manager.music_current_index}, Paused: {self.engine.sound_manager.music_is_paused}",
self.window.blit(font.SysFont("Arial", 20).render(f"Volume: {self.engine.sound_manager.music_get_volume()}, Pos: {self.engine.sound_manager.music_get_current_song_pos()}s, Index: {self.engine.sound_manager.music_current_index}, Paused: {self.engine.sound_manager.music_is_paused}, Shuffled: {self.engine.sound_manager.music_shuffle_playlist}",
True, (255, 0, 0)), (0, 90))
self.window.blit(font.SysFont("Arial", 20).render(f"Track: {self.engine.sound_manager.music_current_song}",
True, (255, 0, 0)), (0, 120))
@ -488,6 +488,11 @@ class Renderer:
def render_boss_fight_scene(self, delta: float):
"""Rend les sprites du joueur et du boss lors d'un combat de boss."""
# On rend le fond qui correspond au points des 2 concurents
total_point = self.engine.boss_fight_manager.player_points + self.engine.boss_fight_manager.boss_points
draw.rect(self.window, (75, 50, 255), (0, 0, math.ceil(display.get_window_size()[0]*(self.engine.boss_fight_manager.player_points/total_point)), display.get_window_size()[1]))
# On récupère l'image de l'animation du boss
boss_animation: Anim = self.boss_fight_boss_animations[self.engine.boss_fight_manager.current_boss_animation]
frame = boss_animation.get_frame(delta)

View file

@ -1,4 +1,5 @@
from pygame import mixer
from random import randint
class SoundManager:
def __init__(self, music_base_volume: float):
@ -9,10 +10,12 @@ class SoundManager:
self.music_current_song = ""
self.music_play_playlist = False
self.music_current_index = 0
self.music_shuffle_playlist = True
self.music_before_pause_pos = 0
self.music_before_pause_song = ""
self.music_is_paused = False
self.music_next_request = False
self.music_pos_delay = 0
@ -25,20 +28,41 @@ class SoundManager:
self.time = self.tick * delta
if self.music_play_playlist and not self.music_is_paused: # Musique de fond
if not mixer.music.get_busy():
if not mixer.music.get_busy() or self.music_next_request:
if self.music_next_request:
self.music_next_request = False
mixer.music.fadeout(1)
if len(self.music_playlist) == 0:
pass
elif self.music_current_song == "":
self.__music_play(self.music_playlist[0])
else:
just_played_index = self.music_playlist.index(self.music_current_song)
if len(self.music_playlist) - 1 <= just_played_index: # Dernier son de la playlist / la playlist a rétréci entre temps
self.music_current_index = 0
self.__music_play(self.music_playlist[0]) # Recommence depuis le début de la playlist
else:
self.music_current_index = just_played_index + 1
self.__music_play(self.music_playlist[self.music_current_index]) # Joue la musique suivante dans la playlist
if self.music_current_song in self.music_playlist:
just_played_index = self.music_playlist.index(self.music_current_song)
if self.music_shuffle_playlist and len(self.music_playlist) != 1:
while True:
new_index = randint(0, len(self.music_playlist) - 1)
if new_index != just_played_index:
break
self.music_current_index = new_index
self.__music_play(self.music_playlist[new_index])
elif len(self.music_playlist) - 1 <= just_played_index: # Dernier son de la playlist / la playlist a rétréci entre temps
self.music_current_index = 0
self.__music_play(self.music_playlist[0]) # Recommence depuis le début de la playlist
else:
self.music_current_index = just_played_index + 1
self.__music_play(self.music_playlist[self.music_current_index]) # Joue la musique suivante dans la playlist
else: # Song removed from playlist, no idea what was the index, starting again from start or from random index if playlist_shuffle = True
new_index = randint(0, len(self.music_playlist) - 1)
self.music_current_index = new_index
self.__music_play(self.music_playlist[new_index])
def music_get_volume(self):
@ -84,7 +108,7 @@ class SoundManager:
def music_remove_from_playlist(self, song_path: str = None, index: int = None):
if song_path:
index = self.music_playlist.index(song_path)
if index:
if index != None:
self.music_playlist.pop(index)
def music_start_playlist(self):
@ -92,3 +116,9 @@ class SoundManager:
def music_stop_playlist(self):
self.music_play_playlist = False
def music_playlist_set_shuffle(self, shuffle: bool):
self.music_shuffle_playlist = shuffle
def music_next(self):
self.music_next_request = True

View file

@ -3,7 +3,7 @@ import pygame.image
from src.custom_AI import WolfAI
from src.engine.animation import Anim
from src.engine.engine import Engine
from src.engine.enums import GameState
from src.engine.enums import GameState, EntityDeathResult
from src.engine.menu_manager import Menu, Label, Button
@ -16,7 +16,7 @@ class Game(Engine):
self.dialogs_manager.load_dialogs("assets/dialogs.json")
self.create_player_entity()
self.load_boss_fight_assets()
self.setup_boss_fight()
self.spawn_mobs()
self.DEBUG_MODE = True
@ -29,16 +29,24 @@ class Game(Engine):
self.event_handler.register_button_area((0, 0, 0.1, 0.1), lambda : print("salut"), 0)
self.sound_manager.music_add_to_playlist(".\\assets\\OST\\boss_fight_1.mp3")
self.sound_manager.music_start_playlist()
self.setup_main_menu()
def start_game(self):
self.game_state = GameState.NORMAL
self.renderer.fadein(1, (0, 0, 0), 100, True)
#self.game_state = GameState.NORMAL
self.boss_fight_manager.enter_boss_fight(1)
#self.renderer.fadein(1, (0, 0, 0), 100, True)
def play_button_callback(self):
self.renderer.fadeout(1, (0, 0, 0), 100, True, self.start_game)
self.menu_manager.hide()
self.sound_manager.music_remove_from_playlist(".\\assets\\OST\\boss_fight_1.mp3")
self.sound_manager.music_add_to_playlist(".\\assets\\OST\\forest_sound.mp3")
self.sound_manager.music_next()
def setup_main_menu(self):
"""Crée les éléments du menu principal."""
menu = Menu()
@ -47,18 +55,29 @@ class Game(Engine):
btn_base_image = pygame.image.load("assets/textures/GUI/button_1.png").convert_alpha()
btn_hover_image = pygame.image.load("assets/textures/GUI/button_2.png").convert_alpha()
slider_base_image = pygame.image.load("assets/textures/GUI/slider_cursor_1.png").convert_alpha()
slider_hover_image = pygame.image.load("assets/textures/GUI/slider_cursor_2.png").convert_alpha()
slider_rail_image = pygame.image.load("assets/textures/GUI/slider_rail_1.png").convert_alpha()
menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 0, 0), self.play_button_callback, btn_base_image, btn_hover_image, "play_button", True, 0))
self.menu_manager.register_menu(menu, "main")
self.menu_manager.show("main")
self.create_boss_temple_area()
def create_boss_temple_area(self):
"""Enregistre les zones d'entrées de boss fight."""
self.event_sheduler.register_area((3104, 608, 48, 16), lambda _: self.boss_fight_manager.enter_boss_fight(1),
["player"], True)
self.event_sheduler.register_area((4544, 592, 48, 16), lambda _: self.boss_fight_manager.enter_boss_fight(2),
["player"], True)
self.event_sheduler.register_area((5664, 688, 32, 16), lambda _: self.boss_fight_manager.enter_boss_fight(3),
["player"], True)
self.event_sheduler.register_area((6720, 720, 16, 32), lambda _: self.boss_fight_manager.enter_boss_fight(4),
["player"], True)
def create_player_entity(self):
"""Crée une entité joueur."""
# On crée les animations
anim = Anim(0.5)
anim.load_animation_from_directory("assets/textures/entities/player/none")
self.renderer.register_animation(anim, "player_none")
@ -67,18 +86,33 @@ class Game(Engine):
anim.load_animation_from_directory("assets/textures/entities/player/walking")
self.renderer.register_animation(anim, "player_walking")
# On crée l'entité
player = self.entity_manager.register_entity("player")
player.link_animation("player_none")
player.collision_rect = [-6, -7, 6, 16]
player.set_default_life(15)
player.max_speed = 64.0
player.death_result = EntityDeathResult.RESET_LIFE
player.death_callback = self.create_player_entity
self.entity_manager.set_player_entity("player")
player.shadow = "player_shadow"
self.renderer.register_shadow("assets/textures/entities/player/shadow.png", "player_shadow")
# On définit ses attributs
player.set_default_life(15)
player.max_speed = 640.0
player.x = 220.
player.y = 767.
# On place la caméra au niveau du joueur
self.camera.x = player.x
self.camera.y = player.y
self.camera.target_x = player.x
self.camera.target_y = player.y
# On enregistre l'entité
self.entity_manager.set_player_entity("player")
self.camera.follow_entity(player)
def spawn_mobs(self):
@ -99,7 +133,7 @@ class Game(Engine):
mob.x, mob.y = 1600, 16
def load_boss_fight_assets(self):
def setup_boss_fight(self):
"""Charge les animations de combat des combats de boss."""
player_none = Anim(1)
player_none.load_animation_from_directory("assets/textures/boss_fight/player_big/none")
@ -110,6 +144,12 @@ class Game(Engine):
self.renderer.boss_fight_GUI_container = pygame.image.load("assets/textures/boss_fight/fight_actions_GUI.png").convert_alpha()
# On crée les boss
self.boss_fight_manager.register_fight_data(1, "Greg", 15, 1)
self.boss_fight_manager.register_fight_data(2, "Mark", 18, 2)
self.boss_fight_manager.register_fight_data(3, "Steve", 20, 3)
self.boss_fight_manager.register_fight_data(4, "The ultra-supra boss", 25, 4)
game = Game()
game.loop()