Merge branch 'game_assembly' of https://git.tipragot.fr/rfg/nsi-rpg into Merge-in-game_assembly-(NO-MORRE-TIME)
This commit is contained in:
commit
71725cdaef
BIN
assets/textures/Title_Screen.png
Normal file
BIN
assets/textures/Title_Screen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 303 KiB |
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 210 KiB |
5177
maps/map5.tmj
5177
maps/map5.tmj
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,6 @@
|
||||||
import math
|
import math
|
||||||
|
|
||||||
|
from src.engine.enums import EntityDeathResult
|
||||||
from src.engine.map_manager import MapManager
|
from src.engine.map_manager import MapManager
|
||||||
from src.engine.mobs_AI import MobAI
|
from src.engine.mobs_AI import MobAI
|
||||||
|
|
||||||
|
@ -42,6 +43,9 @@ class Entity:
|
||||||
|
|
||||||
self.shadow = None
|
self.shadow = None
|
||||||
|
|
||||||
|
self.death_callback = None
|
||||||
|
self.death_result = EntityDeathResult.REMOVED
|
||||||
|
|
||||||
def set_default_life(self, life: int):
|
def set_default_life(self, life: int):
|
||||||
"""Définit le nombre de PV de l'entité. Mettre -1 pour rendre l'entité immortelle."""
|
"""Définit le nombre de PV de l'entité. Mettre -1 pour rendre l'entité immortelle."""
|
||||||
self.life_points = life
|
self.life_points = life
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from src.engine.entity import Entity
|
from src.engine.entity import Entity
|
||||||
|
from src.engine.enums import EntityDeathResult
|
||||||
from src.engine.map_manager import MapManager
|
from src.engine.map_manager import MapManager
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +33,13 @@ class EntityManager:
|
||||||
entity: Entity = self.entities[entity_name]
|
entity: Entity = self.entities[entity_name]
|
||||||
entity.update(delta)
|
entity.update(delta)
|
||||||
if entity.life_points == 0:
|
if entity.life_points == 0:
|
||||||
|
if entity.death_callback is not None:
|
||||||
|
entity.death_callback()
|
||||||
|
if entity.death_result == EntityDeathResult.REMOVED:
|
||||||
self.entities.pop(entity_name)
|
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:
|
if entity.brain is not None and not self.paused:
|
||||||
entity.brain.update(delta)
|
entity.brain.update(delta)
|
||||||
|
|
|
@ -8,3 +8,8 @@ class GameState(Enum):
|
||||||
BOSS_FIGHT = 2
|
BOSS_FIGHT = 2
|
||||||
MAIN_MENU = 3
|
MAIN_MENU = 3
|
||||||
# AJouter si besoin, mais à utiliser de préférence avec parsimony
|
# AJouter si besoin, mais à utiliser de préférence avec parsimony
|
||||||
|
|
||||||
|
|
||||||
|
class EntityDeathResult(Enum):
|
||||||
|
REMOVED = 0 # The entity is removed
|
||||||
|
RESET_LIFE = 1
|
||||||
|
|
|
@ -225,6 +225,7 @@ class EventHandler:
|
||||||
if K_o in self.key_pressed:
|
if K_o in self.key_pressed:
|
||||||
print(f"Player pos: X = {self.engine.entity_manager.get_by_name('player').x} "
|
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}")
|
f"Y = {self.engine.entity_manager.get_by_name('player').y}")
|
||||||
|
self.key_pressed.remove(K_o)
|
||||||
|
|
||||||
if K_x in self.key_pressed:
|
if K_x in self.key_pressed:
|
||||||
self.engine.settings_manager.zoom *= 1.01
|
self.engine.settings_manager.zoom *= 1.01
|
||||||
|
|
|
@ -89,6 +89,15 @@ class Button(Widget):
|
||||||
"""Modifie la valeur du hover."""
|
"""Modifie la valeur du hover."""
|
||||||
self.hovered = state
|
self.hovered = state
|
||||||
|
|
||||||
|
class Image(Widget):
|
||||||
|
"""Un widget d'image."""
|
||||||
|
def __init__(self, x: int | float, y: int | float, size: int | float, image_path: str, widget_name: str,
|
||||||
|
centered: bool = False, is_window_relative: int = -1):
|
||||||
|
super().__init__(x, y, is_window_relative, widget_name)
|
||||||
|
self.size = size
|
||||||
|
self.image = pygame.image.load(image_path)
|
||||||
|
self.centered = centered
|
||||||
|
|
||||||
|
|
||||||
class Menu:
|
class Menu:
|
||||||
"""Un menu contenant des widgets."""
|
"""Un menu contenant des widgets."""
|
||||||
|
|
|
@ -151,7 +151,7 @@ class SoundManager:
|
||||||
def music_remove_from_playlist(self, song_path: str = None, index: int = None):
|
def music_remove_from_playlist(self, song_path: str = None, index: int = None):
|
||||||
if song_path:
|
if song_path:
|
||||||
index = self.music_playlist.index(song_path)
|
index = self.music_playlist.index(song_path)
|
||||||
if index:
|
if index != None:
|
||||||
self.music_playlist.pop(index)
|
self.music_playlist.pop(index)
|
||||||
|
|
||||||
def music_start_playlist(self):
|
def music_start_playlist(self):
|
||||||
|
|
48
src/main.py
48
src/main.py
|
@ -3,8 +3,8 @@ import pygame.image
|
||||||
from src.custom_AI import WolfAI
|
from src.custom_AI import WolfAI
|
||||||
from src.engine.animation import Anim
|
from src.engine.animation import Anim
|
||||||
from src.engine.engine import Engine
|
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
|
from src.engine.menu_manager import Menu, Label, Button, Image
|
||||||
from pygame.locals import RESIZABLE, FULLSCREEN
|
from pygame.locals import RESIZABLE, FULLSCREEN
|
||||||
|
|
||||||
class Game(Engine):
|
class Game(Engine):
|
||||||
|
@ -32,6 +32,7 @@ class Game(Engine):
|
||||||
self.sound_manager.music_add_to_playlist(".\\assets\\OST\\Main Title (Y'as pas de boss la donc jpp le mettre pour un fight).mp3")
|
self.sound_manager.music_add_to_playlist(".\\assets\\OST\\Main Title (Y'as pas de boss la donc jpp le mettre pour un fight).mp3")
|
||||||
self.sound_manager.music_start_playlist()
|
self.sound_manager.music_start_playlist()
|
||||||
|
|
||||||
|
|
||||||
self.setup_main_menu()
|
self.setup_main_menu()
|
||||||
|
|
||||||
def start_game(self):
|
def start_game(self):
|
||||||
|
@ -49,7 +50,7 @@ class Game(Engine):
|
||||||
def setup_main_menu(self):
|
def setup_main_menu(self):
|
||||||
"""Crée les éléments du menu principal."""
|
"""Crée les éléments du menu principal."""
|
||||||
menu = Menu()
|
menu = Menu()
|
||||||
menu.add_widget(Label(0.5, 0.1, "The Forest's Secret", 0.1, (0, 0, 0), "game_title", True, 0))
|
menu.add_widget(Image(0, 0, 1, "assets\\textures\\Title_Screen.png", "title_screen_image", False, 2))
|
||||||
|
|
||||||
btn_base_image = pygame.image.load("assets/textures/GUI/button_1.png").convert_alpha()
|
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()
|
btn_hover_image = pygame.image.load("assets/textures/GUI/button_2.png").convert_alpha()
|
||||||
|
@ -63,6 +64,7 @@ class Game(Engine):
|
||||||
self.menu_manager.register_menu(menu, "main")
|
self.menu_manager.register_menu(menu, "main")
|
||||||
|
|
||||||
self.menu_manager.show("main")
|
self.menu_manager.show("main")
|
||||||
|
self.create_boss_temple_area()
|
||||||
|
|
||||||
def setup_settings_menu(self):
|
def setup_settings_menu(self):
|
||||||
"""Crée les éléments du menu de paramètre"""
|
"""Crée les éléments du menu de paramètre"""
|
||||||
|
@ -72,8 +74,27 @@ class Game(Engine):
|
||||||
#base_image = pygame.image.load("assets\\textures\\GUI\\setting_menu.png")
|
#base_image = pygame.image.load("assets\\textures\\GUI\\setting_menu.png")
|
||||||
#hover_image = pygame.image.load("assets\\textures\\GUI\\setting_menu_hovered.png")
|
#hover_image = pygame.image.load("assets\\textures\\GUI\\setting_menu_hovered.png")
|
||||||
|
|
||||||
|
|
||||||
|
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 _: print("temple 1"), ["player"], True)
|
||||||
|
self.event_sheduler.register_area((4544, 592, 48, 16), lambda _: print("temple 2"), ["player"], True)
|
||||||
|
self.event_sheduler.register_area((5664, 688, 32, 16), lambda _: print("temple 3"), ["player"], True)
|
||||||
|
self.event_sheduler.register_area((6720, 720, 16, 32), lambda _: print("temple 4"), ["player"], True)
|
||||||
|
|
||||||
|
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 _: print("temple 1"), ["player"], True)
|
||||||
|
self.event_sheduler.register_area((4544, 592, 48, 16), lambda _: print("temple 2"), ["player"], True)
|
||||||
|
self.event_sheduler.register_area((5664, 688, 32, 16), lambda _: print("temple 3"), ["player"], True)
|
||||||
|
self.event_sheduler.register_area((6720, 720, 16, 32), lambda _: print("temple 4"), ["player"], True)
|
||||||
|
|
||||||
def create_player_entity(self):
|
def create_player_entity(self):
|
||||||
"""Crée une entité joueur."""
|
"""Crée une entité joueur."""
|
||||||
|
|
||||||
|
# On crée les animations
|
||||||
anim = Anim(0.5)
|
anim = Anim(0.5)
|
||||||
anim.load_animation_from_directory("assets/textures/entities/player/none")
|
anim.load_animation_from_directory("assets/textures/entities/player/none")
|
||||||
self.renderer.register_animation(anim, "player_none")
|
self.renderer.register_animation(anim, "player_none")
|
||||||
|
@ -82,18 +103,33 @@ class Game(Engine):
|
||||||
anim.load_animation_from_directory("assets/textures/entities/player/walking")
|
anim.load_animation_from_directory("assets/textures/entities/player/walking")
|
||||||
self.renderer.register_animation(anim, "player_walking")
|
self.renderer.register_animation(anim, "player_walking")
|
||||||
|
|
||||||
|
# On crée l'entité
|
||||||
player = self.entity_manager.register_entity("player")
|
player = self.entity_manager.register_entity("player")
|
||||||
player.link_animation("player_none")
|
player.link_animation("player_none")
|
||||||
player.collision_rect = [-6, -7, 6, 16]
|
player.collision_rect = [-6, -7, 6, 16]
|
||||||
|
player.death_result = EntityDeathResult.RESET_LIFE
|
||||||
player.set_default_life(15)
|
player.death_callback = self.create_player_entity
|
||||||
player.max_speed = 64.0
|
|
||||||
|
|
||||||
self.entity_manager.set_player_entity("player")
|
self.entity_manager.set_player_entity("player")
|
||||||
|
|
||||||
player.shadow = "player_shadow"
|
player.shadow = "player_shadow"
|
||||||
self.renderer.register_shadow("assets/textures/entities/player/shadow.png", "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 = 64.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)
|
self.camera.follow_entity(player)
|
||||||
|
|
||||||
def spawn_mobs(self):
|
def spawn_mobs(self):
|
||||||
|
|
Loading…
Reference in a new issue