diff --git a/src/main.py b/src/main.py index ad2e0b7..0c44023 100644 --- a/src/main.py +++ b/src/main.py @@ -7,6 +7,7 @@ from engine.ecs import World from plugins import assets, defaults from plugins.animation import Animation from plugins.coroutine import Coroutine, condition, wait +from plugins.hover import HoveredTexture from plugins.inputs import MousePosition @@ -35,6 +36,10 @@ start_game( [ lambda world: world.new_entity().set( Coroutine(super_fonction_du_turfu(world)), + HoveredTexture( + world[assets.Assets].get_texture("directory"), + world[assets.Assets].get_texture("attack_point"), + ), ) ], [], diff --git a/src/plugins/defaults.py b/src/plugins/defaults.py index 7235082..8e2913d 100644 --- a/src/plugins/defaults.py +++ b/src/plugins/defaults.py @@ -7,6 +7,7 @@ from plugins import ( assets, coroutine, display, + hover, inputs, render, sound, @@ -20,6 +21,7 @@ PLUGIN = ( + timing.PLUGIN + assets.PLUGIN + inputs.PLUGIN + + hover.PLUGIN + coroutine.PLUGIN + sound.PLUGIN + text.PLUGIN diff --git a/src/plugins/hover.py b/src/plugins/hover.py new file mode 100644 index 0000000..c73ea65 --- /dev/null +++ b/src/plugins/hover.py @@ -0,0 +1,92 @@ +""" +Un plugin permettant de savoir si la souris est par dessus une entité. +""" + + +import pygame + +from engine import GlobalPlugin +from engine.ecs import World +from engine.math import Vec2 +from plugins.inputs import MousePosition +from plugins.render import Sprite + + +class HoverEnter: + """ + Composant indicant que l'entité vient de commencer a être survolée par la souris. + """ + + +class Hovered: + """ + Composant indicant que l'entité est survolée par la souris. + """ + + +class HoverExit: + """ + Composant indicant que la souris viens d'arreter de survoler l'entité. + """ + + +class HoveredTexture: + """ + Composant permettant de changer la texture d'une entité lorsque + celle-ci est survolée par la souris. + """ + + def __init__(self, normal: pygame.Surface, hovered: pygame.Surface): + self.normal = normal + self.hovered = hovered + + +def __update_hovered(world: World): + """ + Vérifie le survol de la souris sur les entitées. + """ + # On met à jour les composants + mouse_position = world[MousePosition] + for entity in world.query(Sprite): + # Récupération de la position et taille de l'entité + sprite = entity[Sprite] + size = Vec2(*sprite.texture.get_size()) * Vec2(*sprite.area[2:]) + position = sprite.position - (sprite.origin * size) + + # On détermine si la souris est sur l'entité + if ( + mouse_position.x >= position.x + and mouse_position.x <= position.x + size.x + and mouse_position.y >= position.y + and mouse_position.y <= position.y + size.y + ): + if Hovered not in entity: + entity[HoverEnter] = HoverEnter() + else: + del entity[HoverEnter] + entity[Hovered] = Hovered() + else: + if Hovered in entity: + entity[HoverExit] = HoverExit() + else: + del entity[HoverExit] + del entity[Hovered] + + # On affiche la bonne texture + for entity in world.query(HoveredTexture): + if Hovered in entity: + texture = entity[HoveredTexture].hovered + else: + texture = entity[HoveredTexture].normal + if Sprite in entity: + entity[Sprite].texture = texture + else: + entity[Sprite] = Sprite(texture) + + +PLUGIN = GlobalPlugin( + [], + [__update_hovered], + [], + [], +)