package com.indignado.logicbricks.systems;
import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.QueryCallback;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.physics.box2d.joints.MouseJoint;
import com.badlogic.gdx.physics.box2d.joints.MouseJointDef;
import com.indignado.logicbricks.components.StateComponent;
import com.indignado.logicbricks.config.Settings;
import com.indignado.logicbricks.utils.Log;
import com.indignado.logicbricks.utils.builders.LBBuilders;
/**
* @author Rubentxu
*/
public class DraggableBodySystem extends LogicBrickSystem implements InputProcessor {
private MouseJointDef jointDef;
private MouseJoint joint;
private Vector3 tmp = new Vector3();
private Vector2 tmp2 = new Vector2();
private Camera camera;
private World physics;
private QueryCallback queryCallback = new QueryCallback() {
@Override
public boolean reportFixture(Fixture fixture) {
if (!fixture.testPoint(tmp.x, tmp.y))
return true;
jointDef.bodyB = fixture.getBody();
jointDef.target.set(tmp.x, tmp.y);
joint = (MouseJoint) context.get(World.class).createJoint(jointDef);
return false;
}
};
public DraggableBodySystem() {
super(Family.all(StateComponent.class).get());
}
@Override
public void addedToEngine(Engine engine) {
super.addedToEngine(engine);
this.camera = context.get(Camera.class);
this.physics = context.get(World.class);
if (Settings.DRAGGABLE_BOX2D_BODIES) {
jointDef = new MouseJointDef();
jointDef.bodyA = context.get(LBBuilders.class).getBodyBuilder().build();
jointDef.collideConnected = true;
jointDef.maxForce = Settings.DRAGGABLE_BOX2D_MAX_FORCE;
} else {
Log.error(tag, "A reference not set up a draggableRefBody");
}
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
if (Settings.DRAGGABLE_BOX2D_BODIES) {
camera.unproject(tmp.set(screenX, screenY, 0));
physics.QueryAABB(queryCallback, tmp.x, tmp.y, tmp.x, tmp.y);
}
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
if (Settings.DRAGGABLE_BOX2D_BODIES) {
if (joint == null)
return false;
camera.unproject(tmp.set(screenX, screenY, 0));
joint.setTarget(tmp2.set(tmp.x, tmp.y));
}
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
if (Settings.DRAGGABLE_BOX2D_BODIES) {
if (joint == null)
return false;
physics.destroyJoint(joint);
joint = null;
}
return false;
}
public boolean keyDown(int keycode) {
return false;
}
public boolean keyUp(int keycode) {
return false;
}
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
@Override
protected void processEntity(Entity entity, float deltaTime) {
}
}