package de.dbaelz.secludedness.manager;
import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.Input.Orientation;
import com.badlogic.gdx.Input.Peripheral;
import com.badlogic.gdx.InputProcessor;
import de.dbaelz.secludedness.MainGame;
import de.dbaelz.secludedness.level.Level;
import de.dbaelz.secludedness.level.LevelStatistic;
import de.dbaelz.secludedness.level.Player;
public class InputManager implements InputProcessor {
private MainGame mGame;
private Level mLevel;
private Player mPlayer;
private boolean mAccelerometerReadyForPolling;
public InputManager(MainGame game, Level level, Player player) {
mGame = game;
mLevel = level;
mPlayer = player;
Gdx.input.setCatchBackKey(true);
}
@Override
public boolean keyDown(int keycode) {
return false;
}
@Override
public boolean keyUp(int keycode) {
if (keycode == Keys.BACK || keycode == Keys.ESCAPE) {
mLevel.setAborted(true);
}
if (!mLevel.isFinished()) {
int xPosition = mPlayer.getPositionX();
int yPosition = mPlayer.getPositionY();
if (keycode == Keys.RIGHT) {
xPosition += 64;
} else if (keycode == Keys.LEFT) {
xPosition -= 64;
} else if (keycode == Keys.UP) {
yPosition += 64;
} else if (keycode == Keys.DOWN) {
yPosition -= 64;
}
handlePlayer(xPosition, yPosition);
}
return true;
}
@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;
}
public void pollPlayerInput(float delta, Level level, Player player) {
int xPosition = player.getPositionX();
int yPosition = player.getPositionY();
if ((Gdx.app.getType() == ApplicationType.Android) && (Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer))) {
float accelX = Gdx.input.getAccelerometerX();
float accelY = Gdx.input.getAccelerometerY();
// Game is in landscape, so rotate axes when default orientation is portrait
if (Gdx.input.getNativeOrientation() == Orientation.Portrait) {
accelX = Gdx.input.getAccelerometerY();
accelY = Gdx.input.getAccelerometerX();
}
float sensibility = 4.0f;
if (Math.abs(accelX) <= 1.0f && Math.abs(accelY) <= 1.0f) {
mAccelerometerReadyForPolling = true;
return;
}
if (mAccelerometerReadyForPolling) {
if (accelX > sensibility) {
xPosition += 64;
mAccelerometerReadyForPolling = false;
} else if (accelX < -sensibility) {
xPosition -= 64;
mAccelerometerReadyForPolling = false;
} else if (accelY > sensibility) {
yPosition -= 64;
mAccelerometerReadyForPolling = false;
} else if (accelY < -sensibility) {
yPosition += 64;
mAccelerometerReadyForPolling = false;
}
}
} else {
if (Gdx.input.isKeyPressed(Keys.RIGHT)) {
xPosition += 64;
} else if (Gdx.input.isKeyPressed(Keys.LEFT)) {
xPosition -= 64;
} else if (Gdx.input.isKeyPressed(Keys.UP)) {
yPosition += 64;
} else if (Gdx.input.isKeyPressed(Keys.DOWN)) {
yPosition -= 64;
}
}
handlePlayer(xPosition, yPosition);
}
private void handlePlayer(int xPosition, int yPosition) {
if (xPosition != mPlayer.getPositionX() || yPosition != mPlayer.getPositionY()) {
LevelStatistic statistic = mLevel.getLevelStatistic();
statistic.changeMovesBy(1);
mLevel.removeFog(xPosition, yPosition);
if (mLevel.isCollidingWithExit(xPosition, yPosition)) {
mLevel.setFinished(true);
} else if (mLevel.isCollidingWithTrap(xPosition, yPosition)) {
mGame.getAudioManager().playTrapSound();
statistic.changeTrapsBy(1);
mPlayer.changeHealthBy(-1);
mPlayer.setPositionX(xPosition);
mPlayer.setPositionY(yPosition);
} else if (mLevel.isCollidingWithPortal(xPosition, yPosition)) {
mGame.getAudioManager().playPortalSound();
statistic.changeTeleportsBy(1);
mPlayer.resetPositionToStart();
} else if (mLevel.isCollidingWithForeground(xPosition, yPosition)) {
mGame.getAudioManager().playCollisionSound();
} else {
mPlayer.setPositionX(xPosition);
mPlayer.setPositionY(yPosition);
}
}
}
}