org.saltosion.pixelprophecy.states.GameState.java Source code

Java tutorial

Introduction

Here is the source code for org.saltosion.pixelprophecy.states.GameState.java

Source

/*
 * Copyright (C) 2016 Saltosion
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNUss General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.saltosion.pixelprophecy.states;

import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Box2D;
import com.badlogic.gdx.physics.box2d.World;
import java.util.ArrayList;
import org.saltosion.pixelprophecy.Comp;
import org.saltosion.pixelprophecy.GameWorld;
import org.saltosion.pixelprophecy.ItemContainer;
import org.saltosion.pixelprophecy.gui.GUIManager;
import org.saltosion.pixelprophecy.gui.nodes.GUINode;
import org.saltosion.pixelprophecy.gui.nodes.ImageNode;
import org.saltosion.pixelprophecy.gui.nodes.TextNode;
import org.saltosion.pixelprophecy.input.GameInputAdapter;
import org.saltosion.pixelprophecy.input.InputManager;
import org.saltosion.pixelprophecy.input.InventoryToggleAction;
import org.saltosion.pixelprophecy.input.MoveInputAction;
import org.saltosion.pixelprophecy.systems.MovementSystem;
import org.saltosion.pixelprophecy.systems.PhysicsSystem;
import org.saltosion.pixelprophecy.systems.RenderingSystem;
import org.saltosion.pixelprophecy.util.MapLoader;
import org.saltosion.pixelprophecy.util.Names;
import org.saltosion.pixelprophecy.util.SpriteLoader;

public class GameState extends State {

    // Input
    private InputMultiplexer multiplexer;
    private GameInputAdapter inputAdapter;

    // Ashley
    private Engine engine;
    private PhysicsSystem ps;
    private RenderingSystem rs;

    // Box2d
    private World world;

    // GameWorld
    private GameWorld gameWorld;
    private MapLoader mapLoader;

    // Player
    private Entity player;

    //GUI
    private GUIManager guiManager;
    private TextNode fpsClock;

    private ImageNode inventorybg;
    private ImageNode inventoryfadebg;

    private final ArrayList<GUINode> inventoryNodes = new ArrayList<>();

    public GameState(InputMultiplexer multiplexer, GUIManager guiManager, MapLoader mapLoader) {
        this.multiplexer = multiplexer;
        this.guiManager = guiManager;
        this.mapLoader = mapLoader;
    }

    @Override
    public void enter() {

        // Initialize Box2D
        Box2D.init();
        engine = new Engine();
        world = new World(Vector2.Zero, true);

        // Create World object
        gameWorld = new GameWorld(mapLoader, world, engine);

        // Initialize systems
        engine.addSystem(ps = new PhysicsSystem(world));
        engine.addSystem(rs = new RenderingSystem(world));
        engine.addSystem(new MovementSystem());

        //Initialize world
        gameWorld.setRayHandler(rs.getRayHandler());
        // Set map
        setMap(Names.TEST, "playerspawn");

        // Set player
        player = gameWorld.getPlayer();

        // Make camera follow player
        rs.setFollowedEntity(player);

        // Initialize input
        multiplexer.addProcessor(inputAdapter = new GameInputAdapter(this));

        InputManager.setKey(Input.Keys.W, new MoveInputAction(new Vector2(0, 1), player));
        InputManager.setKey(Input.Keys.A, new MoveInputAction(new Vector2(-1, 0), player));
        InputManager.setKey(Input.Keys.S, new MoveInputAction(new Vector2(0, -1), player));
        InputManager.setKey(Input.Keys.D, new MoveInputAction(new Vector2(1, 0), player));
        InputManager.setKey(Input.Keys.I, new InventoryToggleAction(this));

        fpsClock = new TextNode("fps-clock", "FPS: Calculating..");
        fpsClock.setLocalTranslation(new Vector2(0, 1));
        fpsClock.setAlignment(new Vector2(-1, 1));
        fpsClock.setScale(10);
        guiManager.getRootNode().attach(fpsClock);

        inventorybg = new ImageNode("inventory-bg", SpriteLoader.createSprite(Names.INVENTORY_BG_SPRITE));
        inventorybg.setLocalTranslation(new Vector2(1, 1));
        inventorybg.setAlignment(new Vector2(1, 1));
        inventorybg.setScale(13);

        guiManager.getRootNode().attach(inventorybg);

        inventoryfadebg = new ImageNode("inventory-fade-bg", SpriteLoader.createSprite(Names.INVENTORY_FADE_BG));
        inventoryfadebg.setLocalTranslation(new Vector2(0, 0));
        inventoryfadebg.setScale(13);
        inventoryfadebg.setAlignment(new Vector2(0, .7f));
        inventorybg.attach(inventoryfadebg);

        inventorybg.setVisible(false);
    }

    @Override
    public void update() {
        fpsClock.setText("FPS: " + Gdx.graphics.getFramesPerSecond());
        engine.update(Gdx.graphics.getDeltaTime());
    }

    @Override
    public void leave() {
        multiplexer.removeProcessor(inputAdapter);
    }

    @Override
    public void dispose() {
        if (rs == null) {
            return;
        }
        rs.getRayHandler().dispose();
    }

    @Override
    public void resize(int width, int height) {
        rs.resize(width, height);
    }

    public OrthographicCamera getGameCamera() {
        return rs.getCamera();
    }

    public void setMap(String mapName, String spawnPoint) {
        gameWorld.setMap(mapName, spawnPoint);
        rs.setMap(mapLoader.getMap(mapName));
    }

    public void updateInventoryGUI() {
        for (GUINode node : inventoryNodes) {
            inventoryfadebg.detach(node);
        }
        ItemContainer inventory = player.getComponent(Comp.Creature.class).getInventory();
        float yoffset = 0;
        for (Entity item : inventory.getItems()) {
            Comp.Item iComp = item.getComponent(Comp.Item.class);
            ImageNode in = new ImageNode(yoffset + "-item-image", iComp.getImagesprite());
            in.setLocalTranslation(new Vector2(-.5f, .8f - yoffset));
            in.setAlignment(new Vector2(0, .5f));
            in.setScale(4);
            inventoryfadebg.attach(in);
            inventoryNodes.add(in);

            TextNode tn = new TextNode(yoffset + "-item-text", iComp.getName());
            tn.setLocalTranslation(new Vector2(.2f, .8f - yoffset));
            tn.setAlignment(new Vector2(0, 0));
            tn.setScale(4);
            inventoryfadebg.attach(tn);

            inventoryNodes.add(tn);

            TextNode tnWeight = new TextNode(yoffset + "-item-text-weight",
                    ((int) Math.floor(iComp.getWeight() * 100f)) / 100f + " kg");
            tnWeight.setLocalTranslation(new Vector2(.2f, .8f - .1f - yoffset));
            tnWeight.setAlignment(new Vector2(0, 0));
            tnWeight.setScale(4);
            inventoryfadebg.attach(tnWeight);

            inventoryNodes.add(tn);

            yoffset += .4f;
        }
    }

    public ImageNode getInventoryParentNode() {
        return inventorybg;
    }

}