package net.mostlyoriginal.game.system.ui; import com.artemis.Aspect; import com.artemis.ComponentMapper; import com.artemis.Entity; import com.artemis.annotations.Wire; import com.artemis.managers.TagManager; import com.artemis.systems.EntityProcessingSystem; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import net.mostlyoriginal.api.component.basic.Bounds; import net.mostlyoriginal.api.system.physics.CollisionSystem; import net.mostlyoriginal.game.component.ui.Clickable; /** * Track mouse over clickables. will indicate hover or clicked. * * @author Daan van Yperen */ @Wire public class MouseClickSystem extends EntityProcessingSystem { CollisionSystem system; TagManager tagManager; protected ComponentMapper<Clickable> mClickable; private boolean leftMousePressed; public MouseClickSystem() { super(Aspect.getAspectForAll(Clickable.class, Bounds.class)); } @Override protected void begin() { super.begin(); leftMousePressed = Gdx.input.isButtonPressed(Input.Buttons.LEFT); } @Override protected void process(Entity e) { final Entity cursor = tagManager.getEntity("cursor"); if ( cursor != null ) { // update state based on cursor. final Clickable clickable = mClickable.get(e); final boolean overlapping = system.overlaps(cursor, e); if ( overlapping ) { clickable.state = leftMousePressed ? Clickable.ClickState.CLICKED : Clickable.ClickState.HOVER; } else { clickable.state = Clickable.ClickState.NONE; } } } }