package de.dbaelz.secludedness.screen; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Peripheral; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; import de.dbaelz.secludedness.MainGame; import de.dbaelz.secludedness.level.Level; import de.dbaelz.secludedness.level.LevelStatistic; import de.dbaelz.secludedness.level.Player; import de.dbaelz.secludedness.manager.AudioManager.MusicFile; import de.dbaelz.secludedness.manager.InputManager; import de.dbaelz.secludedness.manager.LevelManager; public class LevelScreen extends AbstractScreen { private MainGame mGame; private Level mLevel; private Player mPlayer; private InputManager mInputManager; private Texture mTexture; private TextureRegion mPlayerTexture; private BitmapFont mFont; private SpriteBatch mBatch = new SpriteBatch(); private OrthographicCamera mCamera; private OrthogonalTiledMapRenderer mMapRenderer; private boolean mUsePolling; private boolean mIsCampaign; public LevelScreen(MainGame game, boolean isCampaign, String levelFilename) { this(game, isCampaign, levelFilename, true); } public LevelScreen(MainGame game, boolean isCampaign, String levelFilename, boolean newMusic) { super(game); mGame = game; mIsCampaign = isCampaign; mLevel = new Level(levelFilename); mPlayer = new Player(mLevel.getPlayerCellX(), mLevel.getPlayerCellY(), mLevel.getPlayerStartHealth()); if (newMusic) { mGame.getAudioManager().playMusic(MusicFile.getRandomMusicFile(), true); } } @Override public boolean isLevelScreen() { return true; } @Override public void render(float delta) { doGameLogic(delta); super.render(delta); mMapRenderer.setView(mCamera); mMapRenderer.render(); mBatch.begin(); mBatch.draw(mPlayerTexture, mPlayer.getPositionX(), mPlayer.getPositionY()); // TODO: Debug, remove with nice hud mFont.draw(mBatch, "HEALTH: " + mPlayer.getHealth(), 50, 50); mBatch.end(); } @Override public void show() { super.show(); mTexture = new Texture(Gdx.files.internal("textures/player.png")); mPlayerTexture = new TextureRegion(mTexture, 0, 0, 64, 64); mFont = new BitmapFont(); mFont.setColor(1.0f, 0.5f, 1.0f, 1.0f); // TODO: Change input based on settings if ((Gdx.app.getType() == ApplicationType.Android) && (Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer))) { mUsePolling = true; } else { mUsePolling = false; } mInputManager = new InputManager(mGame, mLevel, mPlayer); Gdx.input.setInputProcessor(mInputManager); } @Override public void resize(int width, int height) { mMapRenderer = new OrthogonalTiledMapRenderer(mLevel.getMap(), 1.0f); mCamera = new OrthographicCamera(); mCamera.setToOrtho(false, width, height); mCamera.update(); } @Override public void hide() { super.hide(); } @Override public void dispose() { mMapRenderer.dispose(); mTexture.dispose(); mFont.dispose(); super.dispose(); } private void doGameLogic(float delta) { if (mLevel.isAborted()) { mGame.setScreen(new MenuScreen(mGame)); } if (mUsePolling && !mLevel.isFinished()) { mInputManager.pollPlayerInput(delta, mLevel, mPlayer); } if (mPlayer.getHealth() == 0) { if (mIsCampaign) { mGame.setScreen(new LevelScreen(mGame, true, mLevel.getMapName(), false)); } else { showResultScreen(); } } if (mLevel.isFinished()) { if (mIsCampaign) { LevelManager levelManager = mGame.getLevelManager(); LevelStatistic statistic = mLevel.getLevelStatistic(); statistic.setHealth(mPlayer.getHealth()); int score = statistic.getMoves() + statistic.getTeleports() + (Math.abs(statistic.getHealth()-statistic.getStartHealth())); levelManager.handleCampaignLevelFinished(score); if (levelManager.isCampaignFinished()) { mGame.setScreen(new CampaignFinishScreen(mGame)); } else { mGame.setScreen(new LevelScreen(mGame, true, levelManager.getCurrentCampaignLevelFilename())); } } else { showResultScreen(); } } } private void showResultScreen() { mLevel.getLevelStatistic().setHealth(mPlayer.getHealth()); mGame.setScreen(new ResultScreen(mGame, mLevel.getLevelStatistic())); } }