package net.onedaybeard.dominatrix.demo.system; import net.onedaybeard.dominatrix.demo.event.CommandEvent; import com.artemis.Aspect; import com.artemis.Entity; import com.artemis.systems.EntityProcessingSystem; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Event; import com.badlogic.gdx.scenes.scene2d.EventListener; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Pools; public final class EventSystem extends EntityProcessingSystem { public static final String TAG = EventSystem.class.getSimpleName(); private final Array<Event> events; private final Array<Actor> receivers; public EventSystem() { super(Aspect.getEmpty()); events = new Array<Event>(); receivers = new Array<Actor>(); } public void addReceiver(Actor receiver) { receivers.add(receiver); } public void addReceiver(EventListener receiver) { Actor actor = new Actor(); actor.addListener(receiver); addReceiver(actor); } @Override protected void initialize() { } public void send(CommandEvent.Type type, float value) { CommandEvent e = Pools.obtain(CommandEvent.class); e.setType(type); e.setValue(value); send(e); } public void send(CommandEvent.Type type, int value) { CommandEvent e = Pools.obtain(CommandEvent.class); e.setType(type); e.setValue(value); send(e); } public void send(Event e) { assert receivers.size > 0 : "No receivers listening"; events.add(e); } @Override protected void begin() { for (int i = 0; receivers.size > i; i++) { for (int j = 0; events.size > j; j++) { receivers.get(i).fire(events.get(j)); } } } @Override protected void process(Entity e) { } @Override protected void end() { if (events.size > 0) { Pools.freeAll(events); events.clear(); } } }