package com.indignado.logicbricks.systems.actuators; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.utils.ObjectSet; import com.indignado.logicbricks.components.RigidBodiesComponents; import com.indignado.logicbricks.components.actuators.MotionActuatorComponent; import com.indignado.logicbricks.config.Settings; import com.indignado.logicbricks.core.actuators.MotionActuator; import com.indignado.logicbricks.core.controllers.Controller; import com.indignado.logicbricks.core.data.LogicBrick; import com.indignado.logicbricks.utils.Log; /** * @author Rubentxu */ public class MotionActuatorSystem extends ActuatorSystem<MotionActuator, MotionActuatorComponent> { public MotionActuatorSystem() { super(MotionActuatorComponent.class); } @Override public void processEntity(Entity entity, float deltaTime) { if (Settings.DEBUG_ENTITY != null) tag = Log.tagEntity(this.getClass().getSimpleName(), entity); Integer state = stateMapper.get(entity).getCurrentState(); ObjectSet<MotionActuator> actuators = (ObjectSet<MotionActuator>) actuatorMapper.get(entity).actuators.get(state); if (actuators != null) { for (MotionActuator actuator : actuators) { for (Controller controller : actuator.controllers) { if (controller.pulseState.equals(LogicBrick.BrickMode.BM_ON)) { Log.debug(tag, "Controller %s pulseState %s", controller.name, controller.pulseState); actuator.pulseState = LogicBrick.BrickMode.BM_ON; } else { actuator.pulseState = LogicBrick.BrickMode.BM_OFF; break; } } processActuator(actuator, deltaTime); } } } @Override public void processActuator(MotionActuator actuator, float deltaTime) { if (actuator.targetRigidBody == null) { actuator.targetRigidBody = actuator.owner.getComponent(RigidBodiesComponents.class).rigidBodies.first(); } Body body = actuator.targetRigidBody; if (actuator.pulseState.equals(LogicBrick.BrickMode.BM_ON)) { Log.debug(tag, "Actuator: %s", actuator.name); if (actuator.velocity != null) { Log.debug(tag, "apply velocity: %s", actuator.velocity); body.setLinearVelocity(actuator.velocity); } if (actuator.force != null) { Log.debug(tag, "apply force: %s", actuator.force); body.applyForce(actuator.force, body.getWorldCenter(), true); float angle = MathUtils.atan2(body.getLinearVelocity().y, body.getLinearVelocity().x); body.setTransform(body.getPosition().x, body.getPosition().y, angle); } if (actuator.impulse != null) { Log.debug(tag, "Apply impulse: %s", actuator.impulse); body.applyLinearImpulse(actuator.impulse, body.getWorldCenter(), true); } if (!actuator.fixedRotation) { if (actuator.angularVelocity != 0) { Log.debug(tag, "Apply angularVelocity: %s", actuator.angularVelocity); body.setAngularVelocity(actuator.angularVelocity); } else if (actuator.torque != 0) { Log.debug(tag, "Apply Torque: %s", actuator.torque); body.applyTorque(actuator.torque, true); } else if (actuator.angularImpulse != 0) { Log.debug(tag, "Apply angularImpulse: %s", actuator.angularImpulse); body.applyAngularImpulse(actuator.angularImpulse, true); } } else { if (!actuator.targetRigidBody.isFixedRotation()) body.setFixedRotation(true); } if (actuator.limitVelocityX > 0) { Vector2 vel = body.getLinearVelocity(); if (Math.abs(vel.x) > actuator.limitVelocityX) { vel.x = Math.signum(vel.x) * actuator.limitVelocityX; body.setLinearVelocity(new Vector2(vel.x, vel.y)); } else if (Math.abs(vel.y) > actuator.limitVelocityX * 2) { vel.y = Math.signum(vel.y) * actuator.limitVelocityX * 2; body.setLinearVelocity(new Vector2(vel.x, vel.y)); } } if (actuator.limitVelocityY != 0 && body.getLinearVelocity().y > actuator.limitVelocityY) { Vector2 velocity = body.getLinearVelocity(); velocity.y = actuator.limitVelocityY; body.setLinearVelocity(velocity); } } if (!body.isFixedRotation() && !actuator.fixedRotation && actuator.angularVelocity == 0 && actuator.torque == 0 && actuator.angularImpulse == 0) { float angle = MathUtils.atan2(body.getLinearVelocity().y, body.getLinearVelocity().x); Log.debug(tag, "velocity %s apply angle: %f", body.getLinearVelocity(), angle); body.setTransform(body.getPosition(), angle); } } }