From b322119db48a0e81d05332db666edde40f605003 Mon Sep 17 00:00:00 2001 From: Tipragot Date: Wed, 1 Nov 2023 20:16:08 +0100 Subject: [PATCH] Ajout d'une origine --- src/main.py | 4 +++- src/plugins/assets.py | 3 +-- src/plugins/render.py | 21 +++++++++++++-------- src/plugins/text.py | 3 +++ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main.py b/src/main.py index f1c1477..950163e 100644 --- a/src/main.py +++ b/src/main.py @@ -5,6 +5,7 @@ Module d'exemple de l'utilisation du moteur de jeu. from engine import Scene, start_game from plugins import assets, defaults from plugins.animation import Animation +from plugins.render import Sprite from plugins.sound import Sound @@ -19,7 +20,8 @@ start_game( callback=lambda world, entity: entity.set( Sound(world[assets.Assets].get_sound("edqsd")) ), - ) + ), + Sprite(world[assets.Assets].get_texture("intro")), ) ], [], diff --git a/src/plugins/assets.py b/src/plugins/assets.py index 51aa190..d8e2cd8 100644 --- a/src/plugins/assets.py +++ b/src/plugins/assets.py @@ -235,11 +235,10 @@ def loading_scene(target: Scene, name: str, clear_cache: bool = True): asset_iterator = world[AssetIterator] file_loaded = asset_iterator.total - len(asset_iterator.files) progress = file_loaded / asset_iterator.total - pixels = int(render.WIDTH * progress) # Affichage de la barre de progression progress_bar = world.query(ProgessBar).pop() - progress_bar[render.Sprite].area = (0, 0, pixels, render.HEIGHT) + progress_bar[render.Sprite].area = (0, 0, progress, 1.0) return Scene( [AssetIterator.prepare_world], diff --git a/src/plugins/render.py b/src/plugins/render.py index fc7e12b..f8aec72 100644 --- a/src/plugins/render.py +++ b/src/plugins/render.py @@ -46,19 +46,16 @@ class Sprite: position: Vec2 = Vec2(0), order: float = -1.0, area: Optional[tuple[float, float, float, float]] = None, + origin: Vec2 = Vec2(0), ): self.texture = texture self.position = position self.order = order if area is None: - self.area = ( - 0.0, - 0.0, - float(texture.get_width()), - float(texture.get_height()), - ) + self.area = (0.0, 0.0, 1.0, 1.0) else: self.area = area + self.origin = origin def __initialize(world: World): @@ -76,10 +73,18 @@ def __render(world: World): surface = world[Surface] sprites = [entity[Sprite] for entity in world.query(Sprite)] for sprite in sorted(sprites, key=lambda sprite: sprite.order): + original_size = Vec2(*sprite.texture.get_size()) + size = original_size * Vec2(*sprite.area[2:]) + position = sprite.position - (sprite.origin * size) surface.blit( sprite.texture, - (sprite.position.x, sprite.position.y), - sprite.area, + (position.x, position.y), + ( + sprite.area[0] * original_size.x, + sprite.area[1] * original_size.y, + sprite.area[2] * original_size.x, + sprite.area[3] * original_size.y, + ), ) # On affiche la surface sur la fenetre diff --git a/src/plugins/text.py b/src/plugins/text.py index 8145c0b..83cb1de 100644 --- a/src/plugins/text.py +++ b/src/plugins/text.py @@ -7,6 +7,7 @@ import pygame from engine import GlobalPlugin from engine.ecs import World +from engine.math import Vec2 from plugins.assets import Assets from plugins.render import Sprite @@ -21,10 +22,12 @@ class Text: text: str, size: int = 50, color: pygame.Color = pygame.Color(255, 255, 255), + origin: Vec2 = Vec2(0), ): self.text = text self.size = size self.color = color + self.origin = origin def __render_texts(world: World):