package com.indignado.logicbricks.systems.sensors;
import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.EntityListener;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.utils.IntMap;
import com.badlogic.gdx.utils.ObjectSet;
import com.indignado.logicbricks.components.RigidBodiesComponents;
import com.indignado.logicbricks.components.sensors.RaySensorComponent;
import com.indignado.logicbricks.core.sensors.RaySensor;
import com.indignado.logicbricks.utils.Log;
/**
* @author Rubentxu
*/
public class RaySensorSystem extends SensorSystem<RaySensor, RaySensorComponent> implements EntityListener {
private World physics;
public RaySensorSystem() {
super(RaySensorComponent.class);
}
@Override
public void addedToEngine(Engine engine) {
super.addedToEngine(engine);
this.physics = context.get(World.class);
}
@Override
public boolean query(RaySensor sensor, float deltaTime) {
sensor.contacts.clear();
float angle = sensor.axis2D.ordinal() * 90.0f;
Vector2 point1 = sensor.attachedRigidBody.getPosition();
Vector2 point2 = point1.cpy().add(new Vector2((float) MathUtils.cosDeg(angle), MathUtils.sinDeg(angle)).scl(sensor.range));
physics.rayCast(sensor, point1, point2);
if (sensor.contacts.size > 0) {
return true;
}
return false;
}
@Override
public void entityAdded(Entity entity) {
Log.debug(tag, "EntityAdded add RaySensors");
RigidBodiesComponents rigidBodiesComponent = entity.getComponent(RigidBodiesComponents.class);
RaySensorComponent raySensorComponent = entity.getComponent(RaySensorComponent.class);
if (raySensorComponent != null) {
IntMap.Values<ObjectSet<RaySensor>> values = raySensorComponent.sensors.values();
while (values.hasNext()) {
for (RaySensor sensor : values.next()) {
if (sensor.attachedRigidBody == null)
sensor.attachedRigidBody = rigidBodiesComponent.rigidBodies.first();
}
}
}
}
@Override
public void entityRemoved(Entity entity) {
}
}