Début de rendu de dialogues
This commit is contained in:
parent
2a47bb5d60
commit
879e6e8c0d
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"test": ["test1", "test2", "test très long permettant de tester le retour à la ligne dans le renderer du jeu dans la fonction qui rend les dialogues et il faut éviter d'en faire des si long car ça pourrait dépacer en base de l'écran ! Bonne journée !"],
|
||||
"test": ["test1111", "test2", "test très long permettant de tester le retour à la ligne dans le renderer du jeu dans la fonction qui rend les dialogues et il faut éviter d'en faire des si long car ça pourrait dépacer en base de l'écran ! Bonne journée !"],
|
||||
"test2": ["salut", "aurevoir"]
|
||||
}
|
BIN
assets/textures/GUI/dialogs_box.png
Normal file
BIN
assets/textures/GUI/dialogs_box.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
|
@ -8,6 +8,10 @@ class DialogsManager:
|
|||
self.current_dialog_id = -1
|
||||
self.dialogs = {}
|
||||
self.reading_dialog = False
|
||||
self.current_dialogue_letter_id = 0
|
||||
|
||||
self.LETTER_WRITTING_DELAY = 0.5
|
||||
self.letter_timer = 0
|
||||
|
||||
def next_dialog(self):
|
||||
"""Passe au dialogue suivant. Renvoie True si le dialogue est fini."""
|
||||
|
@ -27,11 +31,27 @@ class DialogsManager:
|
|||
|
||||
self.reading_dialog = True
|
||||
|
||||
def get_current_dialog_sentence(self) -> str:
|
||||
def get_current_dialog_sentence(self, progressive=True) -> str:
|
||||
"""Renvoie la phrase actuelle du dialogue."""
|
||||
if progressive:
|
||||
return self.current_dialogs[self.current_dialog_id][:self.current_dialogue_letter_id]
|
||||
else:
|
||||
return self.current_dialogs[self.current_dialog_id]
|
||||
|
||||
def load_dialogs(self, file_path: str):
|
||||
"""Charge les dialogues du jeu grave au fichier json donné."""
|
||||
with open(file_path, "r", encoding="utf-8") as file:
|
||||
self.dialogs = json.loads(file.read())
|
||||
|
||||
def update(self, delta: float):
|
||||
"""Met à jour e gestionnaire de dialogues."""
|
||||
if self.reading_dialog:
|
||||
self.letter_timer -= delta
|
||||
|
||||
if self.letter_timer <= 0:
|
||||
self.letter_timer = self.LETTER_WRITTING_DELAY
|
||||
self.current_dialogue_letter_id += 1
|
||||
if self.current_dialogue_letter_id > len(self.current_dialogs[self.current_dialog_id]):
|
||||
self.current_dialogue_letter_id -= 1
|
||||
|
||||
print(self.get_current_dialog_sentence())
|
|
@ -52,6 +52,7 @@ class Engine:
|
|||
self.renderer.update(0.016666666)
|
||||
self.event_handler.update()
|
||||
self.event_sheduler.update()
|
||||
self.dialogs_manager.update(0.016666666)
|
||||
|
||||
def stop(self):
|
||||
"""Arrête le programme."""
|
||||
|
|
|
@ -15,7 +15,8 @@ class Renderer:
|
|||
def __init__(self, core: 'engine.Engine'):
|
||||
self.engine = core
|
||||
self.window_type = RESIZABLE
|
||||
self.window_size = (display.Info().current_w, display.Info().current_h) if self.window_type == FULLSCREEN else (600, 600)
|
||||
self.window_size = (display.Info().current_w, display.Info().current_h) if self.window_type == FULLSCREEN else (
|
||||
600, 600)
|
||||
self.window = display.set_mode(self.window_size, self.window_type)
|
||||
self.tiles = []
|
||||
self.tile_size = 0
|
||||
|
@ -26,6 +27,9 @@ class Renderer:
|
|||
self.boss_fight_player_animations: dict[str: Anim] = {}
|
||||
self.boss_fight_GUI_container = None
|
||||
|
||||
# Boite de dialogue
|
||||
self.dialogs_box = None
|
||||
|
||||
# Variables utilisées par le menu principal
|
||||
self.main_menu_assets: dict[str: Anim] = {}
|
||||
|
||||
|
@ -54,8 +58,8 @@ class Renderer:
|
|||
part_speed_y = - part_speed_y
|
||||
|
||||
# On choisit sa position dans le rectangle
|
||||
part_x = random.randint(x-w, x+w-part_size)
|
||||
part_y = random.randint(y-h, y+h-part_size)
|
||||
part_x = random.randint(x - w, x + w - part_size)
|
||||
part_y = random.randint(y - h, y + h - part_size)
|
||||
|
||||
# On choisit la durée de vie
|
||||
part_life_time = random.uniform(min_life_time, max_life_time)
|
||||
|
@ -123,9 +127,28 @@ class Renderer:
|
|||
self.window.blit(font.SysFont("Arial", 20).render(f"Zoom: {self.engine.camera.zoom}",
|
||||
True, (255, 0, 0)), (0, 60))
|
||||
|
||||
# Rendu présent dans tous les types de jeu
|
||||
self.render_dialogs_box()
|
||||
|
||||
# Apres avoir tout rendu, on met à jour l'écran
|
||||
display.update()
|
||||
|
||||
def render_dialogs_box(self):
|
||||
"""Rend la boite de dialogue lorsqu'un dialogue est lancé."""
|
||||
|
||||
# Rend le conteneur des dialogues
|
||||
if self.engine.dialogs_manager.reading_dialog:
|
||||
resized_box = transform.scale(self.dialogs_box,
|
||||
(display.get_window_size()[0],
|
||||
self.dialogs_box.get_height() / self.dialogs_box.get_width() *
|
||||
display.get_window_size()[0]))
|
||||
self.window.blit(resized_box, (0, display.get_window_size()[1] - resized_box.get_height()))
|
||||
|
||||
# Rend le texte
|
||||
text_font = font.SysFont("Arial", display.get_window_size()[0]//20)
|
||||
rendered_text = text_font.render(self.engine.dialogs_manager.get_current_dialog_sentence(), True, (0, 0, 0))
|
||||
self.window.blit(rendered_text, (display.get_window_size()[0]/30, display.get_window_size()[1] - resized_box.get_height()+display.get_window_size()[0]/30))
|
||||
|
||||
def render_debug_area(self, rendered_surface: surface.Surface):
|
||||
"""Rend les zones de collisions et de détections quand le mode DEBUG est activé."""
|
||||
|
||||
|
@ -136,8 +159,8 @@ class Renderer:
|
|||
for area in self.engine.event_sheduler.area_callbacks:
|
||||
area_rect = area[0]
|
||||
draw.rect(rendered_surface, (200, 100, 0),
|
||||
(math.floor(x_middle_offset+area_rect[0]-self.engine.camera.x),
|
||||
math.floor(y_middle_offset+area_rect[1]-self.engine.camera.y),
|
||||
(math.floor(x_middle_offset + area_rect[0] - self.engine.camera.x),
|
||||
math.floor(y_middle_offset + area_rect[1] - self.engine.camera.y),
|
||||
math.floor(area_rect[2]), math.floor(area_rect[3])), width=1)
|
||||
|
||||
def register_shadow(self, file_path: str, name: str):
|
||||
|
@ -184,8 +207,8 @@ class Renderer:
|
|||
frame = transform.scale(frame, (display.get_window_size()[0] / 5, display.get_window_size()[0] / 5))
|
||||
|
||||
# On colle le boss à droite de la fenêtre
|
||||
self.window.blit(frame, (display.get_window_size()[0]-frame.get_width()-display.get_window_size()[0]/20,
|
||||
display.get_window_size()[1]/4-frame.get_height()/2))
|
||||
self.window.blit(frame, (display.get_window_size()[0] - frame.get_width() - display.get_window_size()[0] / 20,
|
||||
display.get_window_size()[1] / 4 - frame.get_height() / 2))
|
||||
|
||||
# On récupère l'image de l'animation du joueur
|
||||
player_animation = self.boss_fight_player_animations[self.engine.boss_fight_manager.current_player_animation]
|
||||
|
@ -195,14 +218,17 @@ class Renderer:
|
|||
frame = transform.scale(frame, (display.get_window_size()[0] / 5, display.get_window_size()[0] / 5))
|
||||
|
||||
# On colle le joueur à gauche de la fenêtre
|
||||
self.window.blit(frame, (display.get_window_size()[0]/20, display.get_window_size()[1]/4-frame.get_height()/2))
|
||||
self.window.blit(frame,
|
||||
(display.get_window_size()[0] / 20, display.get_window_size()[1] / 4 - frame.get_height() / 2))
|
||||
|
||||
def render_boss_fight_gui(self):
|
||||
"""Rend la barre d'action en bas de l'écran pendant le combat de boss."""
|
||||
|
||||
resized_container = transform.scale(self.boss_fight_GUI_container,
|
||||
(display.get_window_size()[0], self.boss_fight_GUI_container.get_height()/self.boss_fight_GUI_container.get_width()*display.get_window_size()[0]))
|
||||
self.window.blit(resized_container, (0, display.get_window_size()[1]-resized_container.get_height()))
|
||||
(display.get_window_size()[0],
|
||||
self.boss_fight_GUI_container.get_height() / self.boss_fight_GUI_container.get_width() *
|
||||
display.get_window_size()[0]))
|
||||
self.window.blit(resized_container, (0, display.get_window_size()[1] - resized_container.get_height()))
|
||||
|
||||
def render_entities(self, rendered_surface: surface.Surface, gui_surface: surface.Surface, delta: float):
|
||||
"""Rend toutes les entités."""
|
||||
|
@ -250,7 +276,8 @@ class Renderer:
|
|||
cooldown_value = entity.damage_cooldown / entity.default_damage_cooldown
|
||||
|
||||
# On calcule où placer la barre de vei sur la surface des GUI
|
||||
life_bar_dest = (math.floor((entity.x - self.engine.camera.x + x_middle_offset) * self.engine.camera.zoom -
|
||||
life_bar_dest = (
|
||||
math.floor((entity.x - self.engine.camera.x + x_middle_offset) * self.engine.camera.zoom -
|
||||
life_bar_width / 2),
|
||||
math.floor((entity.y - self.engine.camera.y + y_middle_offset - frame.get_height() / 2) *
|
||||
self.engine.camera.zoom - life_bar_height - life_bar_y_offset))
|
||||
|
|
|
@ -22,7 +22,9 @@ class Game(Engine):
|
|||
|
||||
self.game_state = GameState.NORMAL
|
||||
|
||||
self.event_sheduler.register_area((0, 20, 20, 20), None)
|
||||
self.event_sheduler.register_area((64, 64, 32, 32), lambda _: self.dialogs_manager.start_dialog("test"), ["player"])
|
||||
|
||||
self.renderer.dialogs_box = pygame.image.load("assets/textures/GUI/dialogs_box.png").convert_alpha()
|
||||
|
||||
def create_player_entity(self):
|
||||
"""Crée une entité joueur."""
|
||||
|
@ -64,7 +66,7 @@ class Game(Engine):
|
|||
mob.set_default_life(5)
|
||||
mob.max_speed = 1.
|
||||
|
||||
mob.x, mob.y = 160, 16
|
||||
mob.x, mob.y = 1600, 16
|
||||
|
||||
def load_boss_fight_assets(self):
|
||||
"""Charge les animations de combat des combats de boss."""
|
||||
|
@ -75,7 +77,7 @@ class Game(Engine):
|
|||
boss_none.load_animation_from_directory("assets/textures/boss_fight/boss_sprite/test/none")
|
||||
self.renderer.register_boss_fight_boss_animation(boss_none, "none")
|
||||
|
||||
self.renderer.boss_fight_GUI_container = pygame.image.load("assets/textures/boss_fight/fight_actions_GUI.png")
|
||||
self.renderer.boss_fight_GUI_container = pygame.image.load("assets/textures/boss_fight/fight_actions_GUI.png").convert_alpha()
|
||||
|
||||
|
||||
game = Game()
|
||||
|
|
Loading…
Reference in a new issue