diff --git a/core/assets/square.png b/core/assets/square.png new file mode 100644 index 0000000..3b1e50f Binary files /dev/null and b/core/assets/square.png differ diff --git a/core/assets/square2.png b/core/assets/square2.png new file mode 100644 index 0000000..155f96c Binary files /dev/null and b/core/assets/square2.png differ diff --git a/core/src/netwerkprog/game/client/MainGame.java b/core/src/netwerkprog/game/client/MainGame.java index 65e9ced..b22b32f 100644 --- a/core/src/netwerkprog/game/client/MainGame.java +++ b/core/src/netwerkprog/game/client/MainGame.java @@ -3,21 +3,30 @@ package netwerkprog.game.client; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Files; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.GL20; 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.GlyphLayout; import com.badlogic.gdx.graphics.g2d.SpriteBatch; - import com.badlogic.gdx.graphics.g2d.TextureRegion; +import netwerkprog.game.client.game.GAMESTATE; +import netwerkprog.game.client.game.characters.Agent; import netwerkprog.game.client.game.characters.Hacker; import netwerkprog.game.client.game.characters.Team; import netwerkprog.game.client.game.characters.abilities.BodySwap; +import netwerkprog.game.client.game.map.GameInputProcessor; +import netwerkprog.game.client.game.map.GameTile; import netwerkprog.game.client.game.map.Map; import netwerkprog.game.client.game.map.MapRenderer; -import netwerkprog.game.client.game.map.GameInputProcessor; +import netwerkprog.game.util.game.Faction; import netwerkprog.game.util.game.GameCharacter; import netwerkprog.game.util.graphics.FrameRate; +import netwerkprog.game.util.graphics.TextRenderer; + +import java.awt.*; public class MainGame extends ApplicationAdapter { SpriteBatch batch; @@ -29,11 +38,16 @@ public class MainGame extends ApplicationAdapter { private GameInputProcessor gameInputProcessor; private GameCharacter selectedCharacter; private Team team; + private Team enemyTeam; + private TextRenderer textRenderer; + private BitmapFont font; + private GlyphLayout layout; + private GAMESTATE gamestate; + private Faction chosenFaction; private Map map; public MapRenderer mapRenderer; - - public GameCharacter testCharacter; + public AssetManager assets; private static MainGame INSTANCE; @@ -55,17 +69,20 @@ public class MainGame extends ApplicationAdapter { screenHeight = Gdx.graphics.getHeight(); frameRate = new FrameRate(); camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - + textRenderer = new TextRenderer(); + font = new BitmapFont(); + layout = new GlyphLayout(); + assets = new AssetManager(); String[] strings = new String[]{ "#########################", "#xxxx #", "# x #", - "# xxxx #", - "# xx #", - "# x #", - "# x #", - "# x #", + "# xxxx xxxxx #", + "# xxxx xxxxx #", + "# xxxx xx xx #", + "# x xxxxx #", + "# x xxxx #", "# x #", "# xxxxxx #", "# x #", @@ -80,7 +97,7 @@ public class MainGame extends ApplicationAdapter { camera.viewportWidth = screenWidth / 2; camera.viewportHeight = screenHeight / 2; camera.update(); - initCharacters(); + setGamestate(GAMESTATE.SELECTING_FACTION); // this.tree.insert(new Hacker(,new BodySwap())); @@ -90,16 +107,29 @@ public class MainGame extends ApplicationAdapter { // connectToServer(); } - private void initCharacters() { - Texture texture = new Texture(Gdx.files.internal("core/assets/characters.png")); + public void initCharacters() { + assets.load("core/assets/characters.png", Texture.class); + assets.finishLoading(); + Texture texture = assets.get("core/assets/characters.png"); TextureRegion[][] characters = TextureRegion.split(texture, 32, 32); - this.testCharacter = new Hacker("harry",characters[1][0], new BodySwap("test")); - GameCharacter character2 = new Hacker("test2",characters[2][0], new BodySwap("test")); - this.setSelectedCharacter(testCharacter); - mapRenderer.getGameTiles()[1][1].visit(testCharacter); - mapRenderer.getGameTiles()[1][2].visit(character2); this.team = new Team(); - this.team.addMember(this.testCharacter, character2); + + for (int i = 1; i <= 5; i++) { + GameCharacter temp = new Hacker("hacker" + i, characters[5][0], new BodySwap("test")); + mapRenderer.getGameTiles()[1][i].visit(temp); + if (chosenFaction == Faction.HACKER) { + this.team.addMember(temp); + } + } + + for (int i = 1; i <= 5; i++) { + GameCharacter temp = new Agent("Agent" + i, characters[11][0], new BodySwap("Test")); + mapRenderer.getGameTiles()[3][i].visit(temp); + if (chosenFaction == Faction.MEGACORPORATION) { + this.team.addMember(temp); + } + } + this.setSelectedCharacter(this.team.get(0)); } @@ -129,12 +159,36 @@ public class MainGame extends ApplicationAdapter { */ @Override public void render() { - update(); - // clear screen - Gdx.gl.glClearColor(0, 0, 0, 1); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - mapRenderer.render(); - frameRate.render(); + if (this.gamestate == GAMESTATE.PLAYING) { + update(); + // clear screen + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + mapRenderer.render(); + frameRate.render(); + renderText(); + } else if (this.gamestate == GAMESTATE.SELECTING_FACTION) { + renderString("FACTION SELECT\nPress 1 for mega corporation, press 2 for hackers", Gdx.graphics.getWidth() / 2f, Gdx.graphics.getHeight() / 2f); + } + + } + + private void renderText() { + String text = "FACION: " + chosenFaction; + text += "\nSelected character: " + selectedCharacter.getName(); + text += "\nHealth: " + selectedCharacter.getHealth(); + layout.setText(font, text); + textRenderer.render(text, Gdx.graphics.getWidth() - layout.width - 5, Gdx.graphics.getHeight() - 3); + } + + private void renderString(String text) { + layout.setText(font, text); + textRenderer.render(text, Gdx.graphics.getWidth() - layout.width - 5, Gdx.graphics.getHeight() - 3); + } + + private void renderString(String text, float x, float y) { + layout.setText(font, text); + textRenderer.render(text, x - layout.width / 2f, x - layout.height / 2f); } /** @@ -153,6 +207,7 @@ public class MainGame extends ApplicationAdapter { screenWidth = width; frameRate.resize(width, height); mapRenderer.resize(width, height); + textRenderer.resize(width, height); } @Override @@ -163,6 +218,8 @@ public class MainGame extends ApplicationAdapter { @Override public void dispose() { batch.dispose(); + textRenderer.dispose(); + assets.dispose(); } public float getScreenWidth() { @@ -183,7 +240,25 @@ public class MainGame extends ApplicationAdapter { public void setSelectedCharacter(GameCharacter character) { this.selectedCharacter = character; - System.out.println("selected character set to : " + character); + GameTile characterTile = mapRenderer.getTile(character); + Point pos = mapRenderer.getPos(characterTile); + mapRenderer.setSurroundedTilesOfCurrentCharacter(pos.x, pos.y); + } + + public GAMESTATE getGamestate() { + return gamestate; + } + + public void setGamestate(GAMESTATE gamestate) { + this.gamestate = gamestate; + } + + public Faction getChosenFaction() { + return chosenFaction; + } + + public void setChosenFaction(Faction chosenFaction) { + this.chosenFaction = chosenFaction; } public GameCharacter getSelectedCharacter() { @@ -197,4 +272,5 @@ public class MainGame extends ApplicationAdapter { public Team getTeam() { return team; } + } diff --git a/core/src/netwerkprog/game/client/game/GAMESTATE.java b/core/src/netwerkprog/game/client/game/GAMESTATE.java new file mode 100644 index 0000000..8622908 --- /dev/null +++ b/core/src/netwerkprog/game/client/game/GAMESTATE.java @@ -0,0 +1,6 @@ +package netwerkprog.game.client.game; + +public enum GAMESTATE { + PLAYING, + SELECTING_FACTION +} diff --git a/core/src/netwerkprog/game/client/game/Game.java b/core/src/netwerkprog/game/client/game/Game.java deleted file mode 100644 index ddfdc1d..0000000 --- a/core/src/netwerkprog/game/client/game/Game.java +++ /dev/null @@ -1,15 +0,0 @@ -package netwerkprog.game.client.game; - -import netwerkprog.game.util.application.Controller; - -public class Game extends Controller { - - - public Game() { - } - - @Override - public void run() { - - } -} diff --git a/core/src/netwerkprog/game/client/game/Graphics.java b/core/src/netwerkprog/game/client/game/Graphics.java deleted file mode 100644 index 29747f0..0000000 --- a/core/src/netwerkprog/game/client/game/Graphics.java +++ /dev/null @@ -1,14 +0,0 @@ -package netwerkprog.game.client.game; - -import netwerkprog.game.util.application.Controller; - -public class Graphics extends Controller { - public Graphics() { - - } - - @Override - public void run() { - - } -} diff --git a/core/src/netwerkprog/game/client/game/characters/Agent.java b/core/src/netwerkprog/game/client/game/characters/Agent.java index 3fe9c68..5e01224 100644 --- a/core/src/netwerkprog/game/client/game/characters/Agent.java +++ b/core/src/netwerkprog/game/client/game/characters/Agent.java @@ -6,7 +6,7 @@ import netwerkprog.game.util.game.Faction; import netwerkprog.game.util.game.GameCharacter; public class Agent extends GameCharacter { - public Agent(TextureRegion textureRegion, Ability... abilities) { - super("Agent", Faction.MEGACORPORATION, textureRegion, abilities); + public Agent(String name, TextureRegion textureRegion, Ability... abilities) { + super(name, Faction.MEGACORPORATION, textureRegion, abilities); } } diff --git a/core/src/netwerkprog/game/client/game/characters/DevTest1.java b/core/src/netwerkprog/game/client/game/characters/DevTest1.java index af0f1aa..fdedfe5 100644 --- a/core/src/netwerkprog/game/client/game/characters/DevTest1.java +++ b/core/src/netwerkprog/game/client/game/characters/DevTest1.java @@ -1,8 +1,8 @@ package netwerkprog.game.client.game.characters; import com.badlogic.gdx.graphics.g2d.TextureRegion; -import netwerkprog.game.util.game.GameCharacter; import netwerkprog.game.util.game.Faction; +import netwerkprog.game.util.game.GameCharacter; public class DevTest1 extends GameCharacter { public DevTest1() { diff --git a/core/src/netwerkprog/game/client/game/characters/DevTest2.java b/core/src/netwerkprog/game/client/game/characters/DevTest2.java index c5d01e5..a8f839f 100644 --- a/core/src/netwerkprog/game/client/game/characters/DevTest2.java +++ b/core/src/netwerkprog/game/client/game/characters/DevTest2.java @@ -1,7 +1,7 @@ package netwerkprog.game.client.game.characters; -import netwerkprog.game.util.game.GameCharacter; import netwerkprog.game.util.game.Faction; +import netwerkprog.game.util.game.GameCharacter; public class DevTest2 extends GameCharacter { public DevTest2() { diff --git a/core/src/netwerkprog/game/client/game/characters/DevTest3.java b/core/src/netwerkprog/game/client/game/characters/DevTest3.java index 401e170..3208678 100644 --- a/core/src/netwerkprog/game/client/game/characters/DevTest3.java +++ b/core/src/netwerkprog/game/client/game/characters/DevTest3.java @@ -1,7 +1,7 @@ package netwerkprog.game.client.game.characters; -import netwerkprog.game.util.game.GameCharacter; import netwerkprog.game.util.game.Faction; +import netwerkprog.game.util.game.GameCharacter; public class DevTest3 extends GameCharacter { public DevTest3() { diff --git a/core/src/netwerkprog/game/client/game/map/GameInputProcessor.java b/core/src/netwerkprog/game/client/game/map/GameInputProcessor.java index 07ddc6c..65c6ae6 100644 --- a/core/src/netwerkprog/game/client/game/map/GameInputProcessor.java +++ b/core/src/netwerkprog/game/client/game/map/GameInputProcessor.java @@ -8,6 +8,8 @@ import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.TimeUtils; import netwerkprog.game.client.MainGame; +import netwerkprog.game.client.game.GAMESTATE; +import netwerkprog.game.util.game.Faction; import netwerkprog.game.util.game.GameCharacter; import java.util.ArrayList; @@ -89,25 +91,41 @@ public class GameInputProcessor implements InputProcessor { @Override public boolean keyUp(int keycode) { // System.out.println(camera.position.x + " , " + camera.position.y); - if (keysList.contains(keycode)) { - if (keycode == keysList.get(0)) { - this.isWPressed = false; - return true; - } - if (keycode == keysList.get(1)) { - this.isAPressed = false; - return true; - } - if (keycode == keysList.get(2)) { - this.isSPressed = false; - return true; - } - if (keycode == keysList.get(3)) { - this.isDPressed = false; - return true; - } + if (mainGame.getGamestate() == GAMESTATE.PLAYING) { - return true; + if (keysList.contains(keycode)) { + if (keycode == keysList.get(0)) { + this.isWPressed = false; + return true; + } + if (keycode == keysList.get(1)) { + this.isAPressed = false; + return true; + } + if (keycode == keysList.get(2)) { + this.isSPressed = false; + return true; + } + if (keycode == keysList.get(3)) { + this.isDPressed = false; + return true; + } + + return true; + } + } else if (mainGame.getGamestate() == GAMESTATE.SELECTING_FACTION) { + if (keycode == Input.Keys.NUM_1) { + System.out.println("MEGA CORP"); + mainGame.setChosenFaction(Faction.MEGACORPORATION); + mainGame.initCharacters(); + mainGame.setGamestate(GAMESTATE.PLAYING); + } + if (keycode == Input.Keys.NUM_2) { + System.out.println("HACKER"); + mainGame.setChosenFaction(Faction.HACKER); + mainGame.initCharacters(); + mainGame.setGamestate(GAMESTATE.PLAYING); + } } return false; } @@ -122,25 +140,37 @@ public class GameInputProcessor implements InputProcessor { Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0); camera.unproject(touchPoint); + if (mainGame.getGamestate() == GAMESTATE.PLAYING) { - for (int row = 0; row < mainGame.mapRenderer.getGameTiles().length; row++) { - for (int col = 0; col < mainGame.mapRenderer.getGameTiles()[0].length; col++) { - GameTile gameTile = mainGame.mapRenderer.getGameTiles()[row][col]; - if (gameTile.contains(touchPoint.x, touchPoint.y)) { - if (button == Input.Buttons.LEFT) { + + for (int row = 0; row < mainGame.mapRenderer.getGameTiles().length; row++) { + for (int col = 0; col < mainGame.mapRenderer.getGameTiles()[0].length; col++) { + GameTile gameTile = mainGame.mapRenderer.getGameTiles()[row][col]; + if (gameTile.contains(touchPoint.x, touchPoint.y)) { + if (button == Input.Buttons.LEFT) { // System.out.println(gameTile + " row: " + row + ", col: " + col); - if (mainGame.hasCharacterSelected() && !gameTile.containsCharacter()) { + if (mainGame.hasCharacterSelected() && !gameTile.containsCharacter()) { // System.out.println(mainGame.getSelectedCharacter()); - removeCharacterFromTile(mainGame.getSelectedCharacter()); - gameTile.visit(mainGame.getSelectedCharacter()); + if (gameTile.getSymbol() != '#' && mainGame.mapRenderer.getSurroundedTilesOfCurrentCharacter().contains(gameTile)) { + removeCharacterFromTile(mainGame.getSelectedCharacter()); + gameTile.visit(mainGame.getSelectedCharacter()); + mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row); + } + } + if (!mainGame.hasCharacterSelected() && gameTile.containsCharacter()) { + if (gameTile.getCharacter().getFaction() == mainGame.getChosenFaction()) { + mainGame.setSelectedCharacter(gameTile.getCharacter()); + mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row); + } + } + if (gameTile.containsCharacter() + && !mainGame.getSelectedCharacter().equals(gameTile.getCharacter()) + && gameTile.getCharacter().getFaction() == mainGame.getChosenFaction()) { + mainGame.setSelectedCharacter(gameTile.getCharacter()); + mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row); + } + return true; } - if (!mainGame.hasCharacterSelected() && gameTile.containsCharacter()) { - mainGame.setSelectedCharacter(gameTile.getCharacter()); - } - if (gameTile.containsCharacter() && !mainGame.getSelectedCharacter().equals(gameTile.getCharacter())) { - mainGame.setSelectedCharacter(gameTile.getCharacter()); - } - return true; } } } diff --git a/core/src/netwerkprog/game/client/game/map/Map.java b/core/src/netwerkprog/game/client/game/map/Map.java index 9ca8a1e..4b6affb 100644 --- a/core/src/netwerkprog/game/client/game/map/Map.java +++ b/core/src/netwerkprog/game/client/game/map/Map.java @@ -1,7 +1,5 @@ package netwerkprog.game.client.game.map; -import java.util.Arrays; - /** * Map class to hold a 2d array of tiles which will specify the map */ diff --git a/core/src/netwerkprog/game/client/game/map/MapRenderer.java b/core/src/netwerkprog/game/client/game/map/MapRenderer.java index 5baa40d..5b0cd29 100644 --- a/core/src/netwerkprog/game/client/game/map/MapRenderer.java +++ b/core/src/netwerkprog/game/client/game/map/MapRenderer.java @@ -4,9 +4,14 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import netwerkprog.game.client.MainGame; -import netwerkprog.game.util.graphics.Renderable; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import netwerkprog.game.client.MainGame; +import netwerkprog.game.util.game.GameCharacter; +import netwerkprog.game.util.graphics.Renderable; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; public class MapRenderer implements Renderable { private final OrthographicCamera camera; @@ -19,6 +24,8 @@ public class MapRenderer implements Renderable { private static int y = 0; private MainGame mainGame; + private Texture square; + private Texture square2; public static TextureRegion FLOOR_TILE; @@ -26,6 +33,7 @@ public class MapRenderer implements Renderable { public static TextureRegion PATH_TILE; private GameTile[][] gameTiles; + private List surroundedTilesOfCurrentCharacter; /** @@ -50,7 +58,14 @@ public class MapRenderer implements Renderable { * loads all the images for the tiles and adds all the tiles to the array */ private void makeTiles() { - Texture texture = new Texture(Gdx.files.internal(tilePath)); + mainGame.assets.load("square.png", Texture.class); + mainGame.assets.load("square2.png", Texture.class); + mainGame.assets.load(tilePath, Texture.class); + mainGame.assets.finishLoading(); + square = mainGame.assets.get("square.png"); + square2 = mainGame.assets.get("square2.png"); + + Texture texture = mainGame.assets.get(tilePath); TextureRegion[][] tileTextures = TextureRegion.split(texture, 32, 32); FLOOR_TILE = tileTextures[1][6]; @@ -100,18 +115,67 @@ public class MapRenderer implements Renderable { for (int col = 0; col < gameTiles[0].length; col++) { GameTile cur = gameTileRow[col]; batch.draw(cur.getTextureRegion(), cur.x, cur.y); + if (cur.containsCharacter()) { batch.draw(cur.getCharacter().getTextureRegion(), cur.x, cur.y); -// System.out.println("drawing character at " + cur.x + " " + cur.y); + if (cur.getCharacter().equals(mainGame.getSelectedCharacter())) { + batch.draw(square, cur.x, cur.y); + + } } } } + if (surroundedTilesOfCurrentCharacter != null && !surroundedTilesOfCurrentCharacter.isEmpty()) { + for (GameTile gameTile : surroundedTilesOfCurrentCharacter) { + batch.draw(square2, gameTile.x, gameTile.y); + } + } batch.end(); x = 0; y = 0; } + public static int[][] directions = new int[][]{{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}}; + + public List setSurroundedTilesOfCurrentCharacter(int x, int y) { + List res = new ArrayList(); + for (int[] direction : directions) { + int cx = x + direction[0]; + int cy = y + direction[1]; + if (cy >= 0 && cy < gameTiles.length) + if (cx >= 0 && cx < gameTiles[cy].length) + if (gameTiles[cy][cx].getSymbol() != '#') + res.add(gameTiles[cy][cx]); + } + surroundedTilesOfCurrentCharacter = res; + return res; + } + + public GameTile getTile(GameCharacter character) { + for (GameTile[] tiles : this.gameTiles) { + for (GameTile tile : tiles) { + if (tile.containsCharacter()) + if (tile.getCharacter().equals(character)) { + return tile; + } + } + } + return null; + } + + + public Point getPos(GameTile tile) { + for (int row = 0; row < this.gameTiles.length; row++) { + for (int col = 0; col < this.gameTiles[0].length; col++) { + if (gameTiles[row][col].equals(tile)) { + return new Point(col, row); + } + } + } + return new Point(-1, -1); + } + @Override public void update(double deltaTime) { @@ -127,4 +191,9 @@ public class MapRenderer implements Renderable { public GameTile[][] getGameTiles() { return gameTiles; } + + public List getSurroundedTilesOfCurrentCharacter() { + return surroundedTilesOfCurrentCharacter; + } + } diff --git a/core/src/netwerkprog/game/util/game/GameCharacter.java b/core/src/netwerkprog/game/util/game/GameCharacter.java index db91787..4715e86 100644 --- a/core/src/netwerkprog/game/util/game/GameCharacter.java +++ b/core/src/netwerkprog/game/util/game/GameCharacter.java @@ -1,14 +1,14 @@ package netwerkprog.game.util.game; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; +import netwerkprog.game.client.game.map.GameTile; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; - +import java.util.List; import java.util.Objects; public abstract class GameCharacter extends Actor implements Comparable { @@ -18,6 +18,7 @@ public abstract class GameCharacter extends Actor implements Comparable allowedToMove; public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) { super(); @@ -27,6 +28,7 @@ public abstract class GameCharacter extends Actor implements Comparable(); } public String getName() { @@ -106,4 +108,16 @@ public abstract class GameCharacter extends Actor implements Comparable