From 79e1009430e5292b5bcaf9d9dabc72e352994ac8 Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 23 Dec 2023 14:17:08 +0100 Subject: [PATCH] Ajout d'un joueur --- assets/entities/{test => player}/none/0.png | Bin assets/entities/{test => player}/none/1.png | Bin assets/entities/{test => player}/none/2.png | Bin maps/map2.tmj | 128 ++++++++++++++++++++ src/engine.py | 10 +- src/entity.py | 6 +- src/entity_manager.py | 4 + src/event_handler.py | 9 +- src/renderer.py | 13 +- 9 files changed, 155 insertions(+), 15 deletions(-) rename assets/entities/{test => player}/none/0.png (100%) rename assets/entities/{test => player}/none/1.png (100%) rename assets/entities/{test => player}/none/2.png (100%) create mode 100644 maps/map2.tmj diff --git a/assets/entities/test/none/0.png b/assets/entities/player/none/0.png similarity index 100% rename from assets/entities/test/none/0.png rename to assets/entities/player/none/0.png diff --git a/assets/entities/test/none/1.png b/assets/entities/player/none/1.png similarity index 100% rename from assets/entities/test/none/1.png rename to assets/entities/player/none/1.png diff --git a/assets/entities/test/none/2.png b/assets/entities/player/none/2.png similarity index 100% rename from assets/entities/test/none/2.png rename to assets/entities/player/none/2.png diff --git a/maps/map2.tmj b/maps/map2.tmj new file mode 100644 index 0000000..1862b61 --- /dev/null +++ b/maps/map2.tmj @@ -0,0 +1,128 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":true, + "layers":[ + { + "chunks":[ + { + "data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 2, 2, 2, 1, 1, 3, 3, 1, 1, 1, 1, + 1, 3, 3, 1, 1, 2, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, + 1, 3, 3, 3, 2, 3, 2, 2, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "height":16, + "width":16, + "x":0, + "y":0 + }], + "height":16, + "id":1, + "name":"Calque de Tuiles 1", + "opacity":1, + "startx":0, + "starty":0, + "type":"tilelayer", + "visible":true, + "width":16, + "x":0, + "y":0 + }, + { + "chunks":[ + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":0, + "y":0 + }], + "height":16, + "id":2, + "name":"Calque de Tuiles 2", + "opacity":1, + "startx":0, + "starty":0, + "type":"tilelayer", + "visible":true, + "width":16, + "x":0, + "y":0 + }, + { + "chunks":[ + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":0, + "y":0 + }], + "height":16, + "id":3, + "name":"Calque de Tuiles 3", + "opacity":1, + "startx":0, + "starty":0, + "type":"tilelayer", + "visible":true, + "width":16, + "x":0, + "y":0 + }], + "nextlayerid":4, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.10.1", + "tileheight":16, + "tilesets":[ + { + "firstgid":1, + "source":"..\/assets\/tiles.tsx" + }], + "tilewidth":16, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/src/engine.py b/src/engine.py index dadd01b..6302df2 100644 --- a/src/engine.py +++ b/src/engine.py @@ -27,11 +27,13 @@ class Engine: self.renderer.load_tile_set("assets/tiles.png", 16) anim = Anim(0.5) # TODO : REMOVE (ONLY USED FOR TESTING) - anim.load_animation_from_directory("assets/entities/test/none") - self.renderer.register_animation(anim, "test_none") + anim.load_animation_from_directory("assets/entities/player/none") + self.renderer.register_animation(anim, "player_none") - test_entity = self.entity_manager.register_entity("test") - test_entity.link_animation("test_none") + player = self.entity_manager.register_entity("player") + player.link_animation("player_none") + + self.camera.follow_entity(player) def loop(self): """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. diff --git a/src/entity.py b/src/entity.py index b52a3b3..c9e9aa9 100644 --- a/src/entity.py +++ b/src/entity.py @@ -1,8 +1,8 @@ class Entity: """Classe permettant de gérer les entités. Créée automatiquement par `EntityManager.register_entity()`""" def __init__(self, name: str): - self.x = 2 - self.y = 2 + self.x = 8 + self.y = 8 # Time utilisé pour les IA self.time = 0 @@ -13,7 +13,7 @@ class Entity: def update(self, delta: float): """Met à jour l'entité.""" - self.x += 1 + # self.x += 1 self.time += delta diff --git a/src/entity_manager.py b/src/entity_manager.py index 0bdb1b5..862e05e 100644 --- a/src/entity_manager.py +++ b/src/entity_manager.py @@ -20,3 +20,7 @@ class EntityManager: def get_all_entities(self): """Donne la liste de toutes les entités enregistrées.""" return list(self.entities.values()) + + def get_by_name(self, name: str): + """Donne l'entité avec le nom donné.""" + return self.entities[name] diff --git a/src/event_handler.py b/src/event_handler.py index 73ffa10..ea7a261 100644 --- a/src/event_handler.py +++ b/src/event_handler.py @@ -22,14 +22,15 @@ class EventHandler: elif e.type == KEYUP: self.key_pressed.remove(e.key) + player = self.engine.entity_manager.get_by_name("player") if K_RIGHT in self.key_pressed: - self.engine.camera.target_x += 20 + player.x += 2 if K_LEFT in self.key_pressed: - self.engine.camera.target_x -= 20 + player.x -= 2 if K_UP in self.key_pressed: - self.engine.camera.target_y -= 20 + player.y -= 2 if K_DOWN in self.key_pressed: - self.engine.camera.target_y += 20 + player.y += 2 if K_x in self.key_pressed: self.engine.camera.target_zoom *= 1.01 if K_c in self.key_pressed: diff --git a/src/renderer.py b/src/renderer.py index e9c98aa..ec64f99 100644 --- a/src/renderer.py +++ b/src/renderer.py @@ -33,7 +33,8 @@ class Renderer: self.window.fill((255, 255, 255)) # On crée une surface temporaire qui nous permettra de faire le rendu à l'échelle 1:1 - rendered_surface_size = (display.get_window_size()[0] / self.engine.camera.zoom, display.get_window_size()[1] / self.engine.camera.zoom) + rendered_surface_size = (display.get_window_size()[0] / self.engine.camera.zoom, + display.get_window_size()[1] / self.engine.camera.zoom) rendered_surface = surface.Surface(rendered_surface_size) self.renderer_layer(0, rendered_surface) @@ -60,15 +61,19 @@ class Renderer: y_middle_offset = display.get_window_size()[1] / 2 / self.engine.camera.zoom for entity in self.engine.entity_manager.get_all_entities(): + # On récupère la frame courante de l'animation anim: Anim = self.animations[entity.animation_name] frame = anim.get_frame(0.01666667) - rendered_surface.blit(frame, (entity.x-self.engine.camera.x+x_middle_offset, entity.y-self.engine.camera.y+y_middle_offset)) + + # On affiche l'image + rendered_surface.blit(frame, (entity.x-self.engine.camera.x+x_middle_offset-frame.get_width()/2, + entity.y-self.engine.camera.y+y_middle_offset-frame.get_height()/2)) def renderer_layer(self, layer_id: int, rendered_surface: surface.Surface): """Rend la map.""" # On calcule le nombre de tiles à mettre sur notre écran en prenant en compte le zoom - x_map_range = int(display.get_window_size()[0] / 16 / self.engine.camera.zoom) + 2 - y_map_range = int(display.get_window_size()[1] / 16 / self.engine.camera.zoom) + 2 + x_map_range = int(display.get_window_size()[0] / self.tile_size / self.engine.camera.zoom) + 2 + y_map_range = int(display.get_window_size()[1] / self.tile_size / self.engine.camera.zoom) + 2 # On calcule le décalage pour centrer la caméra x_middle_offset = display.get_window_size()[0] / 2 / self.engine.camera.zoom