package com.indignado.logicbricks.systems.sensors; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.EntityListener; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.ObjectSet; import com.indignado.logicbricks.components.sensors.KeyboardSensorComponent; import com.indignado.logicbricks.core.sensors.KeyboardSensor; import com.indignado.logicbricks.utils.Log; /** * @author Rubentxu */ public class KeyboardSensorSystem extends SensorSystem<KeyboardSensor, KeyboardSensorComponent> implements InputProcessor, EntityListener { private ObjectSet<KeyboardSensor> keyboardSensors; public KeyboardSensorSystem() { super(KeyboardSensorComponent.class); keyboardSensors = new ObjectSet<KeyboardSensor>(); } @Override public boolean query(KeyboardSensor sensor, float deltaTime) { boolean isActive = false; if (sensor.keyCode != Input.Keys.UNKNOWN) { if (sensor.keysCodeSignal.contains(sensor.keyCode)) { Log.debug(tag, "sensor %s keyCodeSignal contains: %s size signal %d", sensor.name, sensor.keyCode, sensor.keysCodeSignal.size); isActive = true; } } else if (sensor.allKeys && !(sensor.keysSignal.size == 0)) { isActive = true; Log.debug(tag, "sensor allKeys: signal : %s", sensor.keysCodeSignal); if (sensor.logToggle) { for (Character key : sensor.keysSignal) { sensor.target = sensor.target + key; } } } sensor.keysSignal.clear(); return isActive; } @Override public boolean keyDown(int keycode) { Log.debug(tag, "keyDown size: %d", keyboardSensors.size); for (KeyboardSensor ks : keyboardSensors) { ks.keysCodeSignal.add(new Integer(keycode)); } Log.debug(tag, "keyDown %d", keycode); return false; } @Override public boolean keyUp(int keycode) { for (KeyboardSensor ks : keyboardSensors) { ks.keysCodeSignal.remove(new Integer(keycode)); } Log.debug(tag, "keyUp %d size %d", keycode, keyboardSensors.first().keysCodeSignal.size); return false; } @Override public boolean keyTyped(char character) { for (KeyboardSensor ks : keyboardSensors) { ks.keysSignal.add(character); } return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { 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; } @Override public void entityAdded(Entity entity) { Log.debug(tag, "KeyboardSensor add"); KeyboardSensorComponent keyboardSensorComponent = entity.getComponent(KeyboardSensorComponent.class); if (keyboardSensorComponent != null) { IntMap.Values<ObjectSet<KeyboardSensor>> values = keyboardSensorComponent.sensors.values(); while (values.hasNext()) { keyboardSensors.addAll(values.next()); } } } @Override public void entityRemoved(Entity entity) { KeyboardSensorComponent keyboardSensorComponent = entity.getComponent(KeyboardSensorComponent.class); if (keyboardSensorComponent != null) { IntMap.Values<ObjectSet<KeyboardSensor>> values = keyboardSensorComponent.sensors.values(); while (values.hasNext()) for (KeyboardSensor sensor : values.next()) { keyboardSensors.remove(sensor); } } } }