package net.onedaybeard.dominatrix.demo.system.debug; import static net.onedaybeard.dominatrix.demo.event.CommandEvent.Type.HOVERED_ENTITY; import static net.onedaybeard.dominatrix.demo.event.CommandEvent.Type.NO_HOVERED_ENTITY; import lombok.Getter; import net.onedaybeard.dominatrix.demo.Director; import net.onedaybeard.dominatrix.demo.artemis.TimerIntervalEntityProcessingSystem; import net.onedaybeard.dominatrix.demo.component.Position; import net.onedaybeard.dominatrix.demo.component.Renderable; import net.onedaybeard.dominatrix.demo.event.CommandEvent; import com.artemis.Aspect; import com.artemis.ComponentMapper; import com.artemis.Entity; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.math.Vector2; public class MouseInputSystem extends TimerIntervalEntityProcessingSystem { private ComponentMapper<Position> positionMapper; private ComponentMapper<Renderable> renderableMapper; private final Vector2 coordinate; private Entity hovered; @Getter private InputProcessor inputProcessor; @SuppressWarnings("unchecked") public MouseInputSystem() { super(Aspect.getAspectForAll(Position.class, Renderable.class), .1f); coordinate = new Vector2(); } @Override protected void initialize() { inputProcessor = new MouseClickListener(); positionMapper = world.getMapper(Position.class); renderableMapper = world.getMapper(Renderable.class); } @Override protected void begin() { hovered = null; coordinate.set(Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY()); } @Override protected void process(Entity e) { if(!renderableMapper.get(e).getSprite().getBoundingRectangle().contains(coordinate.x, coordinate.y)) return; float distanceToCursor = getDistanceToCursor(e); if (hovered == null || distanceToCursor < getDistanceToCursor(hovered)) hovered = e; } private float getDistanceToCursor(Entity e) { return positionMapper.get(e).point().dst(coordinate); } @Override protected void end() { if (hovered != null) Director.instance.send(HOVERED_ENTITY, hovered.getId()); else Director.instance.send(NO_HOVERED_ENTITY); } private class MouseClickListener implements InputProcessor { public MouseClickListener() { } @Override public boolean keyDown(int keycode) { return false; } @Override public boolean keyUp(int keycode) { return false; } @Override public boolean keyTyped(char character) { return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { if (button != 0) return false; int id = (hovered != null ? hovered.getId() : -1); Director.instance.send(CommandEvent.Type.ENTITY_SELECTED, id); return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { return false; } @Override public boolean mouseMoved(int screenX, int screenY) { return false; } @Override public boolean scrolled(int amount) { return false; } } }