Java tutorial
/* * 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; } }