Merge branch 'master' into Connections

* master:
  optimize imports
  fixed memory leaks
  made only possible to select own factions characters
  made character only able to move in some position
  added character squares he can move
  added stuff
  add square to selected character

# Conflicts:
#	core/src/netwerkprog/game/client/MainGame.java
#	core/src/netwerkprog/game/util/game/GameCharacter.java
This commit is contained in:
MickWerf
2020-06-06 16:47:59 +02:00
16 changed files with 304 additions and 102 deletions

BIN
core/assets/square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

BIN
core/assets/square2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

View File

@@ -3,24 +3,33 @@ 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.connections.Client;
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.data.Data;
import netwerkprog.game.util.data.DataCallback;
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 implements DataCallback {
SpriteBatch batch;
@@ -32,11 +41,16 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
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;
@@ -58,17 +72,20 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
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 #",
@@ -83,7 +100,7 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
camera.viewportWidth = screenWidth / 2;
camera.viewportHeight = screenHeight / 2;
camera.update();
initCharacters();
setGamestate(GAMESTATE.SELECTING_FACTION);
// this.tree.insert(new Hacker(,new BodySwap()));
@@ -93,16 +110,29 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
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));
}
@@ -132,12 +162,36 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
*/
@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);
}
/**
@@ -156,6 +210,7 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
screenWidth = width;
frameRate.resize(width, height);
mapRenderer.resize(width, height);
textRenderer.resize(width, height);
}
@Override
@@ -166,6 +221,8 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
@Override
public void dispose() {
batch.dispose();
textRenderer.dispose();
assets.dispose();
}
public float getScreenWidth() {
@@ -186,7 +243,25 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
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() {
@@ -203,6 +278,6 @@ public class MainGame extends ApplicationAdapter implements DataCallback {
@Override
public void onDataReceived(Data data) {
}
}

View File

@@ -0,0 +1,6 @@
package netwerkprog.game.client.game;
public enum GAMESTATE {
PLAYING,
SELECTING_FACTION
}

View File

@@ -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() {
}
}

View File

@@ -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() {
}
}

View File

@@ -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);
}
}

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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;
}
}
}

View File

@@ -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
*/

View File

@@ -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<GameTile> 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<GameTile> setSurroundedTilesOfCurrentCharacter(int x, int y) {
List<GameTile> res = new ArrayList<GameTile>();
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<GameTile> getSurroundedTilesOfCurrentCharacter() {
return surroundedTilesOfCurrentCharacter;
}
}

View File

@@ -3,10 +3,13 @@ package netwerkprog.game.util.game;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
import netwerkprog.game.client.game.map.GameTile;
import java.io.Serializable;
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<GameCharacter>, Serializable {
@@ -16,6 +19,7 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
protected boolean override;
protected TextureRegion textureRegion;
protected int health;
protected List<GameTile> allowedToMove;
public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) {
super();
@@ -25,6 +29,7 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
this.override = false;
this.textureRegion = textureRegion;
this.health = 100;
this.allowedToMove = new ArrayList<>();
}
public String getName() {
@@ -104,4 +109,16 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
", y=" + super.getY() +
'}';
}
public List<GameTile> getAllowedToMove() {
return allowedToMove;
}
public void setAllowedToMove(List<GameTile> allowedToMove) {
this.allowedToMove = allowedToMove;
}
public Faction getFaction() {
return faction;
}
}

View File

@@ -0,0 +1,38 @@
package netwerkprog.game.util.graphics;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.Disposable;
public class TextRenderer implements Disposable {
private BitmapFont font;
private SpriteBatch batch;
private OrthographicCamera cam;
public TextRenderer() {
font = new BitmapFont();
batch = new SpriteBatch();
cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}
@Override
public void dispose() {
font.dispose();
batch.dispose();
}
public void resize(int screenWidth, int screenHeight) {
cam = new OrthographicCamera(screenWidth, screenHeight);
cam.translate(screenWidth / 2, screenHeight / 2);
cam.update();
batch.setProjectionMatrix(cam.combined);
}
public void render(String text, float x, float y) {
batch.begin();
font.draw(batch, text, x, y);
batch.end();
}
}

View File

@@ -1,7 +1,5 @@
package netwerkprog.game.util.tree;
import java.util.*;
public class BST<E extends Comparable<E>> extends AbstractTree<E> {
protected TreeNode<E> root;
protected int size = 0;