package net.mostlyoriginal.ns2d.system.active; import com.artemis.Aspect; import com.artemis.ComponentMapper; import com.artemis.Entity; import com.artemis.annotations.Wire; import com.artemis.systems.EntityProcessingSystem; import com.badlogic.gdx.math.Vector2; import net.mostlyoriginal.ns2d.component.Homing; import net.mostlyoriginal.ns2d.component.Physics; import net.mostlyoriginal.ns2d.component.Pos; import net.mostlyoriginal.ns2d.util.EntityUtil; /** * @author Daan van Yperen */ @Wire public class HomingSystem extends EntityProcessingSystem { ComponentMapper<Homing> hm; ComponentMapper<Pos> pm; ComponentMapper<Physics> ym; PhysicsSystem physicsSystem; public HomingSystem() { super(Aspect.getAspectForAll(Homing.class, Pos.class, Physics.class)); } Vector2 tmp = new Vector2(); @Override protected void process(Entity e) { Homing homing = hm.get(e); if (homing.target != null && homing.target.isActive()) { float distance = EntityUtil.distance(e, homing.target); if (distance < homing.maxDistance) { Pos myPos = pm.get(e); Pos tPos = pm.get(homing.target); // vector of required traversal tmp.set(tPos.x, tPos.y).sub(myPos.x, myPos.y).scl(homing.speedFactor).clamp(0, homing.maxVelocity); Physics physics = ym.get(e); physics.vx = tmp.x; physics.vy = tmp.y; } } else homing.target = null; } }