# libgdx ashley how to detect clickEvent on Entity

How can I detect a click event on an Entity?
I use libgdx with Ashley.
Must I implement it by my self e.g. in touch down method of InputProcessor test if any entity is on this click position.
Or exist already a listener for Entity like the ClickListener for Actor in libgdx?

• What have you tried so far? I would probably have a clickable component which has the bounds of the entity and a system that listens for clicks/touches and loops through each clickable entity to see if any of the bounds intersect. – dfour Jun 28 '18 at 9:38
• I haven't tried it. You do not have to show me any code either. My question is only Do I have to do it myself or is there already a listener? – Morchul Jun 28 '18 at 9:48
• Ashley only comes with limited prebuilt systems which are meant to be extended from, more than directly used. So you will more than likely have to build you own system. – dfour Jun 28 '18 at 9:59
• So it doesn't have any prebuild listeners. Thanks, now I will try it on my own. – Morchul Jun 28 '18 at 10:03

As far as I know Ashley does not have any pre-built systems that would handle click events and map them to entities.

A simple clickable system could easily be created using a clickable component and clickable system.

# An example with an OrthographicCamera:

The clickable component with the rectangle bounds

public class ClickableComponent implements Component{
public Rectangle bounds = new Rectangle(0,0,10,10);
}


A Transform component to store location

public class TransformComponent implements Component{
public final Vector3 position = new Vector3();
}


With a Clickable System

public class ClickableSystem extends IteratingSystem{

private ComponentMapper<ClickableComponent> cc;
private ComponentMapper<TransformComponent> tc;
private OrthographicCamera camera;

@SuppressWarnings("unchecked")
public ClickableSystem(OrthographicCamera cam) {
super(Family.all(ClickableComponent.class,TransformComponent.class).get());
cc = ComponentMapper.getFor(ClickableComponent.class);
tc = ComponentMapper.getFor(TransformComponent.class);
camera = cam;
}

@Override
protected void processEntity(Entity entity, float deltaTime) {
ClickableComponent click = cc.get(entity);
TransformComponent transform = tc.get(entity);

//update click bounds
click.bounds.x = transform.position.x;
click.bounds.y = transform.position.y;

if(Gdx.input.isButtonPressed(Buttons.LEFT)){
// touching
Vector3 clickPosition = camera.unproject(new Vector3(Gdx.input.getX(), Gdx.input.getY(),0));
System.out.println(clickPosition+":"+click.bounds.toString());
if(click.bounds.contains(clickPosition.x, clickPosition.y)){
//object clicked