com.hajnar.GravityShip.Screens.GameScreen.java Source code

Java tutorial

Introduction

Here is the source code for com.hajnar.GravityShip.Screens.GameScreen.java

Source

/*******************************************************************************
 * Copyright 2013 Jn Hajnr.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.hajnar.GravityShip.Screens;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.hajnar.GravityShip.*;

public class GameScreen implements Screen, InputProcessor {

    public static final boolean DEBUG_RENDER_ENABLED = false;

    private Game game;
    private GameWorld gameWorld;
    private GameWorldRenderGL2 worldRender;
    private SpriteBatch batch;
    private OrthographicCamera staticCamera;

    private float levelDuration;
    private float gameoverDuration;

    private Sprite restartSprite;
    private Sprite exitSprite;
    private Sprite resumeSprite;
    private Sprite nextLevelSprite;

    StringBuilder stringBuffer;

    //   Controller connectedController;

    public GameScreen(Game game) {
        Gdx.input.setInputProcessor(this);
        //      connectedController = Controllers.getControllers().first();
        //      if (connectedController != null)
        //      {
        //         Gdx.app.log("Connected controller: ", connectedController + "");
        //         if (connectedController.getName().toLowerCase().contains("x-box") && connectedController.getName().toLowerCase().contains("360"))
        //            connectedController.addListener(this);
        //      }

        this.game = game;
        gameWorld = new GameWorld();
        gameWorld.loadWorld(GravityShip.prefs.getRecentWorld());
        this.batch = new SpriteBatch(300);
        this.staticCamera = new OrthographicCamera(Helper.FRUSTUM_WIDTH, Helper.FRUSTUM_HEIGHT);
        this.staticCamera.position.set(Helper.FRUSTUM_WIDTH / 2, Helper.FRUSTUM_HEIGHT / 2, 0);
        this.staticCamera.update();
        if (DEBUG_RENDER_ENABLED)
            this.worldRender = new GameWorldRenderGL2(gameWorld, batch, true);
        else
            this.worldRender = new GameWorldRenderGL2(gameWorld, batch, false);

        restartSprite = new Sprite(Assets.restartRegion);
        restartSprite.setPosition(Helper.FRUSTUM_WIDTH / 2 - restartSprite.getWidth() / 2,
                Helper.FRUSTUM_HEIGHT / 2 - restartSprite.getHeight() / 2);
        exitSprite = new Sprite(Assets.exitRegion);
        exitSprite.setPosition(Helper.FRUSTUM_WIDTH / 2 - exitSprite.getWidth() / 2,
                Helper.FRUSTUM_HEIGHT / 2 - exitSprite.getHeight() / 2 - 150);
        nextLevelSprite = new Sprite(Assets.nextLevelRegion);
        nextLevelSprite.setPosition(Helper.FRUSTUM_WIDTH / 2 - nextLevelSprite.getWidth() / 2,
                Helper.FRUSTUM_HEIGHT / 2 - nextLevelSprite.getHeight() / 2 + 150);
        resumeSprite = new Sprite(Assets.resumeRegion);
        resumeSprite.setPosition(Helper.FRUSTUM_WIDTH / 2 - resumeSprite.getWidth() / 2,
                Helper.FRUSTUM_HEIGHT / 2 - resumeSprite.getHeight() / 2 + 150);

        Assets.leftSprite.setPosition(Helper.FRUSTUM_WIDTH - 333, 20);
        Assets.rightSprite.setPosition(Helper.FRUSTUM_WIDTH - 190, 20);
        Assets.thrustSprite.setPosition(60, 20);

        Gdx.input.setCursorCatched(true);

        stringBuffer = new StringBuilder();

        levelDuration = 0;
        gameoverDuration = 0;
    }

    @Override
    public void render(float delta) {

        if (gameWorld.getState() != GameWorld.WORLD_PAUSED) {
            gameWorld.update(delta);
        }

        if (gameWorld.getState() == GameWorld.WORLD_RUNNING)
            levelDuration += delta;
        else if (gameWorld.getState() == GameWorld.WORLD_GAME_OVER)
            gameoverDuration += delta;

        Gdx.gl.glClearColor(0f, 0f, 0f, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_STENCIL_BUFFER_BIT);

        if (GravityShip.deviceType == GravityShip.DEV_TYPE_DESKTOP)
            worldRender.renderDesktop(delta);
        else
            worldRender.renderAndroid(delta);

        switch (gameWorld.getState()) {
        case GameWorld.WORLD_RUNNING:
            renderOnScreenControlsAndInfo();
            break;
        case GameWorld.WORLD_GAME_OVER:
            if (gameoverDuration > 1.5f)
                renderGameOverMenu();
            break;
        case GameWorld.WORLD_NEXT_LEVEL:
            renderNextLevelMenu();
            break;
        case GameWorld.WORLD_PAUSED:
            renderPauseMenu();
            break;
        }
    }

    @Override
    public void resize(int width, int height) {
        Helper.WINDOW_WIDTH = width;
        Helper.WINDOW_HEIGHT = height;
    }

    @Override
    public void show() {
        Gdx.input.setCursorCatched(true);
        Gdx.input.setInputProcessor(this);
        gameWorld.reset();
    }

    @Override
    public void hide() {
        Gdx.input.setInputProcessor(null);
    }

    @Override
    public void pause() {
        gameWorld.pause();
    }

    @Override
    public void resume() {
    }

    @Override
    public void dispose() {
        worldRender.dispose();
    }

    public void renderOnScreenControlsAndInfo() {
        batch.begin();
        batch.setProjectionMatrix(staticCamera.combined);
        batch.draw(Assets.starHUDRegion, Helper.FRUSTUM_WIDTH / 2 - 50, Helper.FRUSTUM_HEIGHT - 33);
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append(gameWorld.getNumOfCollectedStars()).append("/").append(gameWorld.getNumOfStars());
        Assets.gameFont.draw(batch, stringBuffer, Helper.FRUSTUM_WIDTH / 2 - 10, Helper.FRUSTUM_HEIGHT - 5);
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append("Life: ").append(gameWorld.getPlayer().getLifeAmmount());
        Assets.gameFont.draw(batch, stringBuffer, 5, Helper.FRUSTUM_HEIGHT - 5);
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append("Fuel: ").append(Math.round(gameWorld.getPlayer().getFuelAmmount()));
        Assets.gameFont.draw(batch, stringBuffer, 5, Helper.FRUSTUM_HEIGHT - 40);
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append("Level ").append(GravityShip.prefs.getRecentWorld());
        Assets.gameFont.draw(batch, stringBuffer, Helper.FRUSTUM_WIDTH - 160, Helper.FRUSTUM_HEIGHT - 5);
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append("Time: ").append(Math.round(levelDuration));
        Assets.gameFont.draw(batch, stringBuffer, Helper.FRUSTUM_WIDTH - 160, Helper.FRUSTUM_HEIGHT - 40);
        //      Assets.gameFont.draw(batch, "Loc: " + Math.round(gameWorld.getPlayer().getBody().getPosition().x) + ", " + Math.round(gameWorld.getPlayer().getBody().getPosition().y), Helper.FRUSTUM_WIDTH/2 - 180, 30);
        if (GravityShip.deviceType == GravityShip.DEV_TYPE_ANDROID) {
            Assets.leftSprite.draw(batch);
            Assets.rightSprite.draw(batch);
            Assets.thrustSprite.draw(batch);
        }
        batch.end();
    }

    public void renderGameOverMenu() {
        batch.begin();
        batch.setProjectionMatrix(staticCamera.combined);
        //      batch.draw(Assets.gameoverBackground, 0, 0, Helper.FRUSTUM_WIDTH, Helper.FRUSTUM_HEIGHT);
        Assets.gameFont.draw(batch, "Game Over", Helper.FRUSTUM_WIDTH / 2 - 110, Helper.FRUSTUM_HEIGHT - 5);
        restartSprite.draw(batch);
        exitSprite.draw(batch);
        batch.end();
    }

    public void renderNextLevelMenu() {
        batch.begin();
        batch.setProjectionMatrix(staticCamera.combined);
        //      batch.draw(Assets.succesBackground, 0, 0, Helper.FRUSTUM_WIDTH, Helper.FRUSTUM_HEIGHT);
        Assets.gameFont.draw(batch, "Level Passed", Helper.FRUSTUM_WIDTH / 2 - 120, Helper.FRUSTUM_HEIGHT - 5);
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append("Time: ").append(Math.round(levelDuration));
        Assets.gameFont.draw(batch, stringBuffer, Helper.FRUSTUM_WIDTH / 2 - 73, Helper.FRUSTUM_HEIGHT - 85);
        if (GravityShip.prefs.getRecentWorld() < GravityShip.prefs.getNumOfWorlds())
            nextLevelSprite.draw(batch);
        restartSprite.draw(batch);
        exitSprite.draw(batch);
        batch.end();
    }

    public void renderPauseMenu() {
        batch.begin();
        batch.setProjectionMatrix(staticCamera.combined);
        //      batch.draw(Assets.pauseBackground, 0, 0, Helper.FRUSTUM_WIDTH, Helper.FRUSTUM_HEIGHT);
        Assets.gameFont.draw(batch, "Pause menu", Helper.FRUSTUM_WIDTH / 2 - 110, Helper.FRUSTUM_HEIGHT - 5);
        resumeSprite.draw(batch);
        restartSprite.draw(batch);
        exitSprite.draw(batch);
        batch.end();
    }

    public GameWorld getGameWorld() {
        return gameWorld;
    }

    public float getGameOverDuration() {
        return gameoverDuration;
    }

    //////////////// keyboard input ////////////////////

    @Override
    public boolean keyDown(int keycode) {
        switch (gameWorld.getState()) {
        case GameWorld.WORLD_RUNNING:
            if (keycode == Keys.UP) {
                gameWorld.getPlayer().thrustOn();
            }

            if (keycode == Keys.LEFT)
                gameWorld.getPlayer().setRotationRatio(-1);

            if (keycode == Keys.RIGHT)
                gameWorld.getPlayer().setRotationRatio(1);

            if (keycode == Keys.ESCAPE) {
                gameWorld.pause();
                Gdx.input.setCursorCatched(false);
            }

            //         if(keycode == Keys.Q)
            //         {
            //            gameWorld.getPlayer().getBody().setTransform(98,10, 0);
            //         }

            if (keycode == Keys.BACK) {
                gameWorld.pause();
                Gdx.input.setCursorCatched(false);
            }
            break;
        case GameWorld.WORLD_PAUSED:
            if (keycode == Keys.ENTER) {
                gameWorld.resume();
                Gdx.input.setCursorCatched(true);
            }
            if (keycode == Keys.ESCAPE) {
                game.setScreen(GravityShip.menuScreen);
            }
            break;
        case GameWorld.WORLD_GAME_OVER:
            if (keycode == Keys.ENTER) {
                gameWorld.reset();
                levelDuration = 0;
                gameoverDuration = 0;
                Gdx.input.setCursorCatched(true);
            }
            if (keycode == Keys.ESCAPE)
                game.setScreen(GravityShip.menuScreen);
            break;
        case GameWorld.WORLD_NEXT_LEVEL:
            if (keycode == Keys.ENTER && GravityShip.prefs.getRecentWorld() < GravityShip.prefs.getNumOfWorlds()) {
                GravityShip.prefs.setRecentWorld(GravityShip.prefs.getRecentWorld() + 1);
                gameWorld.loadWorld(GravityShip.prefs.getRecentWorld());
                gameWorld.reset();
                levelDuration = 0;
                gameoverDuration = 0;
                Gdx.input.setCursorCatched(true);
            }
            if (keycode == Keys.ESCAPE)
                game.setScreen(GravityShip.menuScreen);
            break;
        }
        return true;
    }

    @Override
    public boolean keyUp(int keycode) {
        if (keycode == Keys.UP) {
            gameWorld.getPlayer().thrustOff();
        }

        if (keycode == Keys.LEFT || keycode == Keys.RIGHT)
            gameWorld.getPlayer().setRotationRatio(0);

        return true;
    }

    @Override
    public boolean keyTyped(char character) {
        // TODO Auto-generated method stub
        return false;
    }

    //////////////// touch/mouse input ////////////////////

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        float x = screenX * (Helper.FRUSTUM_WIDTH / Helper.WINDOW_WIDTH);
        float y = Helper.FRUSTUM_HEIGHT - screenY * (Helper.FRUSTUM_HEIGHT / Helper.WINDOW_HEIGHT);
        switch (gameWorld.getState()) {
        case GameWorld.WORLD_RUNNING:
            if (GravityShip.deviceType == GravityShip.DEV_TYPE_ANDROID) {
                if (Assets.thrustSprite.getBoundingRectangle().contains(x, y)) {
                    gameWorld.getPlayer().thrustOn();
                }
                if (Assets.leftSprite.getBoundingRectangle().contains(x, y))
                    gameWorld.getPlayer().setRotationRatio(-1);
                if (Assets.rightSprite.getBoundingRectangle().contains(x, y))
                    gameWorld.getPlayer().setRotationRatio(1);
            }
            break;
        case GameWorld.WORLD_PAUSED:
            if (resumeSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                gameWorld.resume();
                Gdx.input.setCursorCatched(true);
            }
            if (restartSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                gameWorld.reset();
                levelDuration = 0;
                gameoverDuration = 0;
                Gdx.input.setCursorCatched(true);
            }
            if (exitSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                game.setScreen(GravityShip.menuScreen);
            }
            break;
        case GameWorld.WORLD_GAME_OVER:
            if (restartSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                gameWorld.reset();
                levelDuration = 0;
                gameoverDuration = 0;
                Gdx.input.setCursorCatched(true);
            }
            if (exitSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                game.setScreen(GravityShip.menuScreen);
            }
            break;
        case GameWorld.WORLD_NEXT_LEVEL:
            if (nextLevelSprite.getBoundingRectangle().contains(x, y)
                    && GravityShip.prefs.getRecentWorld() < GravityShip.prefs.getNumOfWorlds()) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                GravityShip.prefs.setRecentWorld(GravityShip.prefs.getRecentWorld() + 1);
                System.out.println(GravityShip.prefs.getRecentWorld());
                GravityShip.savePreferences();
                gameWorld.loadWorld(GravityShip.prefs.getRecentWorld());
                gameWorld.reset();
                levelDuration = 0;
                gameoverDuration = 0;
                Gdx.input.setCursorCatched(true);
            }
            if (restartSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                gameWorld.reset();
                levelDuration = 0;
                gameoverDuration = 0;
                Gdx.input.setCursorCatched(true);
            }
            if (exitSprite.getBoundingRectangle().contains(x, y)) {
                Assets.playSound(Assets.buttonClickSound);
                Assets.vibrate(40);
                game.setScreen(GravityShip.menuScreen);
            }
            break;
        }
        return true;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        if (GravityShip.deviceType == GravityShip.DEV_TYPE_ANDROID) {
            if (gameWorld.getState() != GameWorld.WORLD_GAME_OVER) {
                if (screenX < Helper.WINDOW_WIDTH / 2) {
                    gameWorld.getPlayer().thrustOff();
                } else
                    gameWorld.getPlayer().setRotationRatio(0);
            }
        }
        return true;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        if (GravityShip.deviceType == GravityShip.DEV_TYPE_ANDROID) {
            float x = screenX * (Helper.FRUSTUM_WIDTH / Helper.WINDOW_WIDTH);
            float y = Helper.FRUSTUM_HEIGHT - screenY * (Helper.FRUSTUM_HEIGHT / Helper.WINDOW_HEIGHT);
            if (gameWorld.getState() == GameWorld.WORLD_RUNNING) {
                if (Assets.thrustSprite.getBoundingRectangle().contains(x, y)) {
                    gameWorld.getPlayer().thrustOn();
                } else if (Assets.leftSprite.getBoundingRectangle().contains(x, y))
                    gameWorld.getPlayer().setRotationRatio(-1);
                else if (Assets.rightSprite.getBoundingRectangle().contains(x, y))
                    gameWorld.getPlayer().setRotationRatio(1);
                else {
                    gameWorld.getPlayer().thrustOff();
                    gameWorld.getPlayer().setRotationRatio(0);
                }
            }
        }
        return true;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        // TODO Auto-generated method stub
        return false;
    }

    //////////////// joystick input ////////////////////
    //   @Override
    //   public boolean accelerometerMoved(Controller arg0, int arg1, Vector3 arg2) {
    //      // TODO Auto-generated method stub
    //      return false;
    //   }
    //
    //   @Override
    //   public boolean axisMoved(Controller arg0, int arg1, float arg2) {
    //      if (arg1 == 0)
    //      {
    //         if (arg2 < -0.2)
    //            gameWorld.getPlayer().setRotationRatio(arg2);
    //         else if (arg2 > 0.2)
    //            gameWorld.getPlayer().setRotationRatio(arg2);
    //         else
    //            gameWorld.getPlayer().setRotationRatio(0);
    //      }
    //      if (arg1 == 5)
    //      {
    //         if (arg2 > -0.6)
    //            gameWorld.getPlayer().thrustOn();
    //         else
    //            gameWorld.getPlayer().thrustOff();
    //      }
    //      return true;
    //   }
    //
    //   @Override
    //   public boolean buttonDown(Controller arg0, int arg1) {
    //      switch(gameWorld.getState())
    //      {
    //      case GameWorld.WORLD_RUNNING:
    //         if (arg1 == 0)
    //            gameWorld.getPlayer().thrustOn();
    //         if (arg1 == 7)
    //         {
    //            gameWorld.pause();
    //            Gdx.input.setCursorCatched(false);
    //         }
    //         break;
    //      case GameWorld.WORLD_PAUSED:
    //         if (arg1 == 7)
    //         {
    //            gameWorld.resume();
    //            Gdx.input.setCursorCatched(true);
    //         }
    //         if (arg1 == 0)
    //         {
    //            gameWorld.reset();
    //            levelDuration = 0;
    //            gameoverDuration = 0;
    //            Gdx.input.setCursorCatched(true);
    //         }
    //         if (arg1 == 1)
    //         {
    //            game.setScreen(GravityShip.menuScreen);
    //            Gdx.input.setCursorCatched(false);
    //         }
    //         break;
    //      case GameWorld.WORLD_GAME_OVER:
    //         if (arg1 == 0)
    //         {
    //            gameWorld.reset();
    //            levelDuration = 0;
    //            gameoverDuration = 0;
    //            Gdx.input.setCursorCatched(true);
    //         }
    //         if (arg1 == 1)
    //            game.setScreen(GravityShip.menuScreen);
    //         break;
    //      case GameWorld.WORLD_NEXT_LEVEL:
    //         if (arg1 == 0 && GravityShip.prefs.getRecentWorld() < GravityShip.prefs.getNumOfWorlds())
    //         {
    //            GravityShip.prefs.setRecentWorld(GravityShip.prefs.getRecentWorld()+1);
    //            gameWorld.loadWorld(GravityShip.prefs.getRecentWorld());
    //            gameWorld.reset();
    //            levelDuration = 0;
    //            gameoverDuration = 0;
    //            Gdx.input.setCursorCatched(true);
    //         }
    //         if(arg1 == 1)
    //            game.setScreen(GravityShip.menuScreen);
    //         break;
    //      }
    //      return true;
    //   }
    //
    //   @Override
    //   public boolean buttonUp(Controller arg0, int arg1) {
    //      if (arg1 == 0)
    //         gameWorld.getPlayer().thrustOff();
    //      return false;
    //   }
    //
    //   @Override
    //   public void connected(Controller arg0) {
    //      // TODO Auto-generated method stub
    //
    //   }
    //
    //   @Override
    //   public void disconnected(Controller arg0) {
    //      // TODO Auto-generated method stub
    //
    //   }
    //
    //   @Override
    //   public boolean povMoved(Controller arg0, int arg1, PovDirection arg2) {
    //      // TODO Auto-generated method stub
    //      return false;
    //   }
    //
    //   @Override
    //   public boolean xSliderMoved(Controller arg0, int arg1, boolean arg2) {
    //      // TODO Auto-generated method stub
    //      return false;
    //   }
    //
    //   @Override
    //   public boolean ySliderMoved(Controller arg0, int arg1, boolean arg2) {
    //      // TODO Auto-generated method stub
    //      return false;
    //   }

}