ecs #58

Merged
raphael merged 70 commits from ecs into main 2023-11-03 15:29:36 +00:00
3 changed files with 99 additions and 0 deletions
Showing only changes of commit 82e1222118 - Show all commits

View file

@ -7,6 +7,7 @@ from engine.ecs import World
from plugins import assets, defaults from plugins import assets, defaults
from plugins.animation import Animation from plugins.animation import Animation
from plugins.coroutine import Coroutine, condition, wait from plugins.coroutine import Coroutine, condition, wait
from plugins.hover import HoveredTexture
from plugins.inputs import MousePosition from plugins.inputs import MousePosition
@ -35,6 +36,10 @@ start_game(
[ [
lambda world: world.new_entity().set( lambda world: world.new_entity().set(
Coroutine(super_fonction_du_turfu(world)), Coroutine(super_fonction_du_turfu(world)),
HoveredTexture(
world[assets.Assets].get_texture("directory"),
world[assets.Assets].get_texture("attack_point"),
),
) )
], ],
[], [],

View file

@ -7,6 +7,7 @@ from plugins import (
assets, assets,
coroutine, coroutine,
display, display,
hover,
inputs, inputs,
render, render,
sound, sound,
@ -20,6 +21,7 @@ PLUGIN = (
+ timing.PLUGIN + timing.PLUGIN
+ assets.PLUGIN + assets.PLUGIN
+ inputs.PLUGIN + inputs.PLUGIN
+ hover.PLUGIN
+ coroutine.PLUGIN + coroutine.PLUGIN
+ sound.PLUGIN + sound.PLUGIN
+ text.PLUGIN + text.PLUGIN

92
src/plugins/hover.py Normal file
View file

@ -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],
[],
[],
)