PlayerControlSystem.java

package com.devcharles.piazzapanic.componentsystems;

import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem;
import com.badlogic.gdx.math.Vector2;
import com.devcharles.piazzapanic.components.B2dBodyComponent;
import com.devcharles.piazzapanic.components.ControllableComponent;
import com.devcharles.piazzapanic.components.PlayerComponent;
import com.devcharles.piazzapanic.components.PowerUpComponent.PowerUpType;
import com.devcharles.piazzapanic.input.KeyboardInput;
import com.devcharles.piazzapanic.utility.Mappers;

/**
 * Controls the one cook that has the PlayerComponent
 */
public class PlayerControlSystem extends IteratingSystem {

    KeyboardInput input;
    Integer timer = 30000;

    boolean changingCooks = false;
    PlayerComponent playerComponent;
    
    int speedMultiplier = 1;

    public PlayerControlSystem(KeyboardInput input) {
        super(Family.all(ControllableComponent.class).get());

        this.input = input;
    }

    @Override
    protected void processEntity(Entity entity, float deltaTime) {

        // Collect toggleable inputs
        // Those need to be toggled off once recieved to prevent registering the input
        // twice
        if (this.changingCooks) {
            this.changingCooks = false;
            entity.add(this.playerComponent);
        }

        if (!Mappers.player.has(entity)) {
            return;
        }

        if (input.changeCooks) {
            input.changeCooks = false;

            this.changingCooks = true; // Next cook in the queue will get playercomponent
            this.playerComponent = Mappers.player.get(entity);
            entity.remove(PlayerComponent.class);
            return;
        }

        if (input.putDown) {
            input.putDown = false;
            Mappers.player.get(entity).putDown = true;
        }
        if (input.pickUp) {
            input.pickUp = false;
            Mappers.player.get(entity).pickUp = true;
        }
        if (input.interact) {
            input.interact = false;
            Mappers.player.get(entity).interact = true;
        }

        B2dBodyComponent b2body = Mappers.b2body.get(entity);
        
        Vector2 direction = new Vector2(0, 0);
        
        // collect all the movement inputs
        if (input.left) {
            direction.add(-1, 0);
        }
        if (input.right) {
            direction.add(1, 0);
        }
        if (input.up) {
            direction.add(0, 1);
        }
        if (input.down) {
            direction.add(0, -1);
        }

        ControllableComponent cook = Mappers.controllable.get(entity);

        if(cook.currentPowerup.contains(PowerUpType.SpeedBoost)){
            speedMultiplier = 2;
            if(timer <= 0 ){
                cook.currentPowerup.remove(PowerUpType.SpeedBoost);
                speedMultiplier = 1;
                timer = 30000;
            }
           timer = timer - 17;
        }

        // Normalise vector (make length 1). This ensures player moves at the same speed
        // in all directions.
        // e.g. if player wants to go left and up at the same time, the vector is (1,1)
        // and length (speed) is sqrt(2)
        // but we need length to be 1
        direction.nor();
        //increase the player speed
        direction = direction.scl(speedMultiplier);

        Vector2 finalV = direction.cpy().scl(2000 * deltaTime);

        // Rotate the box2d shape in the movement direction
        if (!direction.isZero(0.7f)) {
            b2body.body.setTransform(b2body.body.getPosition(), direction.angleRad());
            b2body.body.applyLinearImpulse(finalV, b2body.body.getPosition(), true);
        }

    }


}