ColorRunner/core/src/de/samdev/colorrunner/game/world/entities/gameentities/PlayerEntity.java

177 lines
5.7 KiB
Java

package de.samdev.colorrunner.game.world.entities.gameentities;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.graphics.Texture;
import de.samdev.colorrunner.CRGame;
import de.samdev.colorrunner.game.renderer.CRAssets;
import de.samdev.colorrunner.game.world.CRGameWorld;
import de.samdev.colorrunner.game.world.SwipeDirection;
import de.samdev.colorrunner.game.world.entities.CRGameEntity;
import de.samdev.colorrunner.game.world.entities.MovingEntity;
import de.samdev.colorrunner.game.world.entities.gameentities.controller.AbstractPlayerController;
import de.samdev.colorrunner.game.world.entities.gameentities.controller.GravityPlayerController;
import de.samdev.colorrunner.game.world.entities.gameentities.controller.RunBottomPlayerController;
import de.samdev.colorrunner.game.world.entities.gameentities.controller.FlyPlayerController;
import de.samdev.colorrunner.game.world.entities.gameentities.controller.RunTopPlayerController;
import de.samdev.colorrunner.game.world.entities.gameentities.floor.FloorTileEntity;
import de.samdev.colorrunner.game.world.map.CRMapStorage;
import de.samdev.colorrunner.game.world.map.provider.StaticMapProvider;
import de.samdev.colorrunner.game.world.map.provider.TriggerType;
import de.samdev.colorrunner.screens.gameScreen.GameScreen;
import de.samdev.colorrunner.screens.menu.MainMenu;
public class PlayerEntity extends MovingEntity {
public final static float PLAYER_WIDTH = 31.9f;
public final static float PLAYER_HEIGHT = 31.9f;
public final static float PLAYER_SPEED_FORCE = 166f;
public final static float PLAYER_TERMINAL_SPEED = 320f;
public final static float PLAYER_ROTATION_SPEED = -200f;
private SwipeDirection phase = SwipeDirection.UP;
private AbstractPlayerController controller;
private Preferences ingameprefs = Gdx.app.getPreferences("ingamepreferences");
public PlayerEntity(CRGameWorld _owner, float x, float y) {
super(_owner, x, y, PLAYER_WIDTH, PLAYER_HEIGHT);
controller = new RunBottomPlayerController(this);
}
@Override
public void update(float delta) {
if (velocity.x < PLAYER_TERMINAL_SPEED)
velocity.x += PLAYER_SPEED_FORCE * delta;
updateRotation(delta);
TriggerType trigger = getTrigger();
switch (trigger){
case RUNTOP:
if (controller.getControllerType() != ControllingType.RUNTOP) controller = new RunTopPlayerController(this);
break;
case RUNBOTTOM:
if (controller.getControllerType() != ControllingType.RUNBOTTOM) controller = new RunBottomPlayerController(this);
break;
case FLY:
if (controller.getControllerType() != ControllingType.FLY) controller = new FlyPlayerController(this);
break;
case GRAVITY:
if (controller.getControllerType() != ControllingType.GRAVITY) controller = new GravityPlayerController(this);
break;
case END:
//((Game)Gdx.app.getApplicationListener()).setScreen(new MainMenu());
int currantlvl = ingameprefs.getInteger("currantlvl", 1);
currantlvl++;
int highestlevel = ingameprefs.getInteger("highestlevel", 1);
if(currantlvl > highestlevel)
highestlevel = currantlvl;
ingameprefs.putInteger("highestlevel", highestlevel);
ingameprefs.putInteger("currantlvl", currantlvl);
ingameprefs.flush();
int maximumlvl = 4;
if(currantlvl > maximumlvl)
((Game)Gdx.app.getApplicationListener()).setScreen(new MainMenu());
else
CRGame.Inst().setScreen(new GameScreen(new StaticMapProvider(CRMapStorage.map_map.get(currantlvl))));
world.music.stop();
break;
}
controller.update(delta);
super.update(delta);
}
private void updateRotation(float delta) {
boolean touch = isTouching_ANY();
boolean aligned = (visualRotation % 90 == 0);
if (!touch)
{
visualRotation = visualRotation + PLAYER_ROTATION_SPEED * delta;
visualRotation = (visualRotation + 720f) % 360f;
float p = (float) ((Math.max(Math.abs(Math.cos(Math.toRadians(visualRotation + 45))), Math.abs(Math.sin(Math.toRadians(visualRotation + 45)))) * Math.sqrt(PLAYER_WIDTH * PLAYER_WIDTH + PLAYER_HEIGHT * PLAYER_HEIGHT)));
updateHitBox(p, p);
}
else if (touch && aligned)
{
// all ok - move along
}
else if (touch && !aligned)
{
visualRotation = (visualRotation + 720f) % 90f;
if (visualRotation < 45) visualRotation = visualRotation + PLAYER_ROTATION_SPEED * delta;
else visualRotation = visualRotation - PLAYER_ROTATION_SPEED * delta;
if (visualRotation >= 90f || visualRotation <= 0f) visualRotation = 0f;
visualRotation = (visualRotation + 720f) % 90f;
float p = (float) ((Math.max(Math.abs(Math.cos(Math.toRadians(visualRotation + 45))), Math.abs(Math.sin(Math.toRadians(visualRotation + 45)))) * Math.sqrt(PLAYER_WIDTH * PLAYER_WIDTH + PLAYER_HEIGHT * PLAYER_HEIGHT)));
updateHitBox(p, p);
}
else
{
Gdx.app.error("PlayerEntity", "updateRotation::WTF");
}
}
public void jumpPressed() {
controller.jumpPressed();
}
public void switchPhase(SwipeDirection sd) {
if (phase == sd) return;
phase = sd;
for (CRGameEntity ent : world.entities) {
if (ent == this) continue;
if (ent.bounds.overlaps(bounds) && ent.canCollide(false, this) && ent instanceof FloorTileEntity)
ent.remove();
}
}
@Override
public Texture getTexture() {
switch (phase) {
case UP:
return CRAssets.TEX_PLAYER_UP;
case RIGHT:
return CRAssets.TEX_PLAYER_RIGHT;
case DOWN:
return CRAssets.TEX_PLAYER_DOWN;
case LEFT:
return CRAssets.TEX_PLAYER_LEFT;
default:
return null;
}
}
@Override
public boolean canCollide(boolean actualCollision, CRGameEntity collider) {
return collider.canCollide(actualCollision, this);
}
public SwipeDirection getPhase() {
return phase;
}
}