package com.deftwun.zombiecopter.systems; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.EntityListener; import com.badlogic.ashley.core.EntitySystem; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Logger; import com.deftwun.zombiecopter.ComponentMappers; import com.deftwun.zombiecopter.App; import com.deftwun.zombiecopter.UserInterface; import com.deftwun.zombiecopter.components.ControllerComponent; import com.deftwun.zombiecopter.components.PhysicsComponent; import com.deftwun.zombiecopter.components.VehicleComponent; import com.deftwun.zombiecopter.components.VehicleOperatorComponent; public class PlayerSystem extends EntitySystem implements EntityListener,InputProcessor{ private Logger logger = new Logger("PlayerSystem",Logger.INFO); private Entity currentPlayer = null; public PlayerSystem(){ logger.debug("initializing"); } public void setPlayer(Entity e){ currentPlayer = e; if (e != null) App.engine.systems.camera.setFollow(e); } public Entity getPlayer(){ if (currentPlayer == null) logger.debug("currentPlayer == null"); return currentPlayer; } @Override public void update(float deltaTime) { if (currentPlayer == null) return; ComponentMappers mappers = App.engine.mappers; ControllerComponent controller = mappers.controller.get(currentPlayer); PhysicsComponent physics = mappers.physics.get(currentPlayer); //Set entity controller inputs if (controller == null) return; UserInterface ui = App.engine.ui; controller.moveVector.set(ui.getMoveVector()); controller.attack = ui.isFiring(); if (ui.isTouchScreen) controller.lookVector.set(ui.getFireVector()); else { if (physics == null) return; Vector2 worldCoords = App.engine.systems.camera.unproject(ui.getTouchPosition()); worldCoords.scl(1/App.engine.PIXELS_PER_METER); controller.lookVector.set(worldCoords.sub(physics.getPosition()).nor()); } //Set entity boundary around player if (physics == null) return; App.engine.entityBounds.setCenter(physics.getPosition()); } @Override public void entityAdded(Entity entity) { //If an current player is not set and a new entity is added with a player component, // then set the new entity as the current player /* if (currentPlayer == null){ if (Platformer.engine.mappers.player.has(entity)){ logger.debug("Player set to entity #" + entity.getId()); Platformer.engine.systems.camera.setFollow(entity); currentPlayer = entity; } } */ } @Override public void entityRemoved(Entity entity) { //If the current player is removed then current player = null; if (currentPlayer == entity){ logger.debug("Current player has been removed: Entity#" + currentPlayer.getId()); currentPlayer = null; } } @Override public boolean keyDown(int keycode) { if (currentPlayer == null) return false; if (keycode == Keys.E){ //TODO: this shoudl be driven by tghe 'action' switch in the controller component logger.debug("Vehicle Key pressed"); VehicleComponent vehicle = App.engine.mappers.vehicle.get(currentPlayer); VehicleOperatorComponent operator = App.engine.mappers.vehicleOperator.get(currentPlayer); if (vehicle != null) vehicle.eject = true; if (operator != null) operator.enterVehicle = true; } return false; } @Override public boolean keyUp(int keycode) { if (currentPlayer == null) return false; if (keycode == Keys.E){ logger.debug("Vehicle Key depressed"); VehicleComponent vehicle = App.engine.mappers.vehicle.get(currentPlayer); VehicleOperatorComponent operator = App.engine.mappers.vehicleOperator.get(currentPlayer); if (vehicle != null) vehicle.eject = false; if (operator != null) operator.enterVehicle = false; } return false; } @Override public boolean keyTyped(char character) { return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { return false; } @Override public boolean mouseMoved(int screenX, int screenY) { return false; } @Override public boolean scrolled(int amount) { return false; } }