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 net.mostlyoriginal.ns2d.component.Anim;
import net.mostlyoriginal.ns2d.component.Physics;
import net.mostlyoriginal.ns2d.component.Pos;
import net.mostlyoriginal.ns2d.component.WallSensor;
/**
* Applies physics calculations. Must be run after physics clamps.
*
* @author Daan van Yperen
*/
@Wire
public class AfterPhysicsSystem extends EntityProcessingSystem {
MapCollisionSystem mapCollisionSystem;
private ComponentMapper<Physics> ym;
private ComponentMapper<Pos> pm;
private ComponentMapper<Anim> am;
private ComponentMapper<WallSensor> wm;
public AfterPhysicsSystem() {
super(Aspect.getAspectForAll(Physics.class, Pos.class));
}
@Override
protected void process(Entity e) {
final Physics physics = ym.get(e);
final Pos pos = pm.get(e);
pos.x += physics.vx * world.getDelta();
pos.y += physics.vy * world.getDelta();
if ( physics.vr != 0 && am.has(e))
{
am.get(e).rotation += physics.vr * world.delta;
}
if (physics.friction != 0) {
float adjustedFriction = physics.friction * (wm.has(e) && !wm.get(e).onFloor ? 0.25f : 1 );
if (Math.abs(physics.vx) > 0.005f) {
physics.vx = physics.vx - (physics.vx * world.delta * adjustedFriction);
} else {
physics.vx = 0;
}
if (Math.abs(physics.vr) > 0.005f) {
physics.vr = physics.vr - (physics.vr * world.delta * adjustedFriction);
} else {
physics.vr = 0;
}
if (Math.abs(physics.vy) > 0.005f) {
physics.vy = physics.vy - (physics.vy * world.delta * adjustedFriction);
} else {
physics.vy = 0;
}
}
}
}