Compare commits
21 commits
main
...
game_assem
Author | SHA1 | Date | |
---|---|---|---|
Yannis | 7ff96fe5c9 | ||
Yannis | b65fb9d127 | ||
Yannis | 28df17050f | ||
Yannis | af05762706 | ||
Yannis | e043093748 | ||
Yannis | 28a4cf1db0 | ||
Yannis | 29adfda8dd | ||
Yannis | 989587379a | ||
Yannis | 323e190474 | ||
Yannis | 4a613ccfb6 | ||
Yannis | 8d12c791d1 | ||
Adastram | b2a1311839 | ||
Adastram | 37db2829a7 | ||
Yannis | 347febaf11 | ||
Adastram | 0a659dcbe0 | ||
Adastram | 7c6031a713 | ||
Adastram | df86633f8e | ||
Yannis | 6219dcdb71 | ||
Yannis | b3663ed81b | ||
Yannis | 04e51bd376 | ||
Yannis | 75ce3b6c37 |
BIN
assets/OST/Bruit de foret pour yannis.mp3
Normal file
BIN
assets/OST/Bruit de foret pour yannis.mp3
Normal file
Binary file not shown.
Binary file not shown.
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
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
45
src/main.py
45
src/main.py
|
@ -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
|
||||
|
||||
|
||||
|
@ -29,6 +29,9 @@ 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\\Main Title (Y'as pas de boss la donc jpp le mettre pour un fight).mp3")
|
||||
self.sound_manager.music_start_playlist()
|
||||
|
||||
self.setup_main_menu()
|
||||
|
||||
def start_game(self):
|
||||
|
@ -39,6 +42,10 @@ class Game(Engine):
|
|||
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\\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\\Bruit de foret pour yannis.mp3")
|
||||
self.sound_manager.music_next()
|
||||
|
||||
def setup_main_menu(self):
|
||||
"""Crée les éléments du menu principal."""
|
||||
menu = Menu()
|
||||
|
@ -47,18 +54,25 @@ 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 _: 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):
|
||||
"""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 +81,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 = 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)
|
||||
|
||||
def spawn_mobs(self):
|
||||
|
|
Loading…
Reference in a new issue