19 Commits

Author SHA1 Message Date
MickWerf
15492cb91d Fixed test build issue 2020-06-06 16:50:32 +02:00
MickWerf
4b7eaaa641 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
2020-06-06 16:47:59 +02:00
MickWerf
9349e6ce48 Finished Server/Client registration and communications 2020-06-06 16:42:44 +02:00
SemvdH
c07c86098a Merge pull request #9 from SemvdH/characters-moving
Characters moving
2020-06-06 16:30:23 +02:00
Sem van der Hoeven
c8325ba55c optimize imports 2020-06-06 16:21:00 +02:00
Sem van der Hoeven
95a582b91e fixed memory leaks 2020-06-06 16:19:36 +02:00
Sem van der Hoeven
ab3d57bc7f made only possible to select own factions characters 2020-06-06 16:07:05 +02:00
MickWerf
3dbffa4ffb Finished server side registration. 2020-06-06 15:44:53 +02:00
Sem van der Hoeven
23cf4d120e made character only able to move in some position 2020-06-06 15:44:46 +02:00
Sem van der Hoeven
737e1ac1cb added character squares he can move 2020-06-06 15:35:01 +02:00
Sem van der Hoeven
3827098c42 added stuff 2020-06-06 15:27:22 +02:00
MickWerf
f942bbbc92 Connections, Applied Data objects, removed parsers and Made genereric data handling 2020-06-06 15:02:45 +02:00
Sem van der Hoeven
8b4538da39 add square to selected character 2020-06-06 14:40:22 +02:00
Sem van der Hoeven
f32a1b34c3 made compareto only use health 2020-06-02 23:44:14 +02:00
Sem van der Hoeven
1285e1ae82 update compareTo 2020-06-02 23:43:35 +02:00
Sem van der Hoeven
c9a6907fca added isDead method to team class 2020-06-02 23:42:51 +02:00
Sem van der Hoeven
be0703ba61 added health to characters 2020-06-02 23:40:25 +02:00
Sem van der Hoeven
087c3a7193 added team class that uses a tree 2020-06-02 23:35:28 +02:00
Sem van der Hoeven
42d88e434f added coordinates to characters 2020-05-27 23:34:16 +02:00
32 changed files with 713 additions and 326 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 80 KiB

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

@@ -1,104 +0,0 @@
package netwerkprog.game.client;
import netwerkprog.game.util.application.Controller;
import netwerkprog.game.util.data.Data;
import netwerkprog.game.util.data.ParserCallback;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Arrays;
public class Client extends Controller implements ParserCallback {
private final int port;
private final String hostname;
private final Parser parser;
private boolean isConnected = true;
private Socket socket;
private Thread receiveThread;
private DataOutputStream outputStream;
public Client(String hostname) {
this.port = Data.port();
this.hostname = hostname;
this.parser = new Parser(this);
}
/**
* Starts the client process.
*/
@Override
public void run() {
this.connect();
this.receiveThread.start();
}
/**
* Connects the client to the server.
*/
public void connect() {
System.out.println("[CLIENT] connecting to server on port " + this.port);
try {
this.socket = new Socket(this.hostname, this.port);
DataInputStream in = new DataInputStream(socket.getInputStream());
this.outputStream = new DataOutputStream(socket.getOutputStream());
this.receiveThread = new Thread( () -> receive(in));
} catch (IOException e) {
System.out.println("[CLIENT] there was an error connecting : " + e.getMessage());
StringBuilder sb = new StringBuilder(" Stacktrace : ");
Arrays.stream(e.getStackTrace()).forEach(n -> sb.append("\t\t").append(n).append("\n"));
System.out.println(sb.toString());
}
}
/**
* Sends a message to the server.
* @param message The message to send.
*/
public void send(String message) {
try {
this.outputStream.writeUTF(message);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Receives a message from the server.
* @param in The inputStream
*/
public void receive(DataInputStream in) {
while (isConnected) {
try {
this.parser.parse(in.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void disconnect() {
this.isConnected = false;
try {
this.receiveThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
send("Disconnect");
try {
this.socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onDataReceived(String data) {
System.out.println(data);
}
}

View File

@@ -3,23 +3,35 @@ 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.tree.BST;
import netwerkprog.game.util.graphics.TextRenderer;
public class MainGame extends ApplicationAdapter {
import java.awt.*;
public class MainGame extends ApplicationAdapter implements DataCallback {
SpriteBatch batch;
float screenWidth;
float screenHeight;
@@ -28,12 +40,17 @@ public class MainGame extends ApplicationAdapter {
private OrthographicCamera camera;
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;
private BST<GameCharacter> tree;
public GameCharacter testCharacter;
public AssetManager assets;
private static MainGame INSTANCE;
@@ -55,17 +72,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,28 +100,39 @@ public class MainGame extends ApplicationAdapter {
camera.viewportWidth = screenWidth / 2;
camera.viewportHeight = screenHeight / 2;
camera.update();
this.tree = new BST<>();
initCharacters();
setGamestate(GAMESTATE.SELECTING_FACTION);
// this.tree.insert(new Hacker(,new BodySwap()));
// playSong();
// connectToServer();
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.tree.insert(testCharacter);
// this.tree.insert(character2);
// this.tree.insert(new Agent(characters[2][0], new Implant("test")));
this.setSelectedCharacter(testCharacter);
mapRenderer.getGameTiles()[0][1].visit(testCharacter);
mapRenderer.getGameTiles()[0][2].visit(character2);
this.team = new Team();
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));
}
@@ -118,7 +149,7 @@ public class MainGame extends ApplicationAdapter {
private void connectToServer() {
client = new Thread(new Client("localhost"));
client = new Thread(new Client("localhost", this));
try {
client.start();
} catch (Exception e) {
@@ -131,12 +162,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);
}
/**
@@ -155,6 +210,7 @@ public class MainGame extends ApplicationAdapter {
screenWidth = width;
frameRate.resize(width, height);
mapRenderer.resize(width, height);
textRenderer.resize(width, height);
}
@Override
@@ -165,6 +221,8 @@ public class MainGame extends ApplicationAdapter {
@Override
public void dispose() {
batch.dispose();
textRenderer.dispose();
assets.dispose();
}
public float getScreenWidth() {
@@ -183,13 +241,27 @@ public class MainGame extends ApplicationAdapter {
return map.getWidth();
}
public BST<GameCharacter> getTree() {
return tree;
}
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() {
@@ -199,4 +271,13 @@ public class MainGame extends ApplicationAdapter {
public boolean hasCharacterSelected() {
return selectedCharacter != null;
}
public Team getTeam() {
return team;
}
@Override
public void onDataReceived(Data data) {
}
}

View File

@@ -1,15 +0,0 @@
package netwerkprog.game.client;
import netwerkprog.game.util.data.ParserCallback;
public class Parser {
private final ParserCallback callback;
public Parser(ParserCallback callback) {
this.callback = callback;
}
public void parse(String data) {
callback.onDataReceived(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

@@ -0,0 +1,64 @@
package netwerkprog.game.client.game.characters;
import netwerkprog.game.util.game.GameCharacter;
import netwerkprog.game.util.tree.BST;
public class Team {
private BST<GameCharacter> members;
public Team() {
this.members = new BST<>();
}
public Team(BST<GameCharacter> characters) {
this.members = characters;
}
public void addMember(GameCharacter gameCharacter) {
if (this.members.getSize() != 6)
this.members.insert(gameCharacter);
}
public BST<GameCharacter> getMembers() {
return this.members;
}
public void setMembers(BST<GameCharacter> members) {
this.members = members;
}
public void addMember(GameCharacter... characters) {
for (GameCharacter gameCharacter : characters) {
this.members.insert(gameCharacter);
}
}
public GameCharacter get(GameCharacter character) {
for (GameCharacter cur : this.members) {
if (cur.equals(character)) {
return cur;
}
}
return null;
}
public GameCharacter get(int position) {
if (position >= this.members.getSize()) {
throw new IndexOutOfBoundsException("position out of range");
}
int i = 0;
for (GameCharacter cur : this.members) {
if (i == position) return cur;
i++;
}
return null;
}
public boolean isDead() {
int dead = 0;
for (GameCharacter character : this.members) {
if (character.isDead()) dead++;
}
return dead >= this.members.getSize();
}
}

View File

@@ -0,0 +1,127 @@
package netwerkprog.game.client.game.connections;
import netwerkprog.game.util.application.Controller;
import netwerkprog.game.util.data.ConnectionData;
import netwerkprog.game.util.data.Data;
import netwerkprog.game.util.data.DataCallback;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Arrays;
public class Client extends Controller {
private final int port;
private final String hostname;
private boolean isConnected;
private Socket socket;
private Thread receiveThread;
private DataCallback callback;
private ObjectOutputStream outputStream;
private boolean connecting;
public Client(String hostname, DataCallback callback) {
this.port = Data.port();
this.hostname = hostname;
this.callback = callback;
}
/**
* Starts the client process.
*/
@Override
public void run() {
this.connect();
this.receiveThread.start();
}
/**
* Connects the client to the server.
*/
public void connect() {
System.out.println("[CLIENT] connecting to server on port " + this.port);
this.connecting = true;
try {
this.socket = new Socket(this.hostname, this.port);
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
this.outputStream = new ObjectOutputStream(socket.getOutputStream());
register(in);
this.receiveThread = new Thread( () -> receive(in));
} catch (IOException e) {
this.connecting = false;
System.out.println("[CLIENT] there was an error connecting : " + e.getMessage());
StringBuilder sb = new StringBuilder(" Stacktrace : ");
Arrays.stream(e.getStackTrace()).forEach(n -> sb.append("\t\t").append(n).append("\n"));
System.out.println(sb.toString());
}
}
public void register(ObjectInputStream in) {
while (connecting) {
String username = "DEV";
send(new ConnectionData("Connect", username));
try {
Object object = in.readObject();
if (object instanceof Data) {
Data data = (Data) object;
if (data.getPayload() instanceof ConnectionData) {
ConnectionData connectionData = (ConnectionData) data.getPayload();
if (connectionData.getAction().equals("Connect") && connectionData.getMessage().equals("Confirm")){
this.connecting = false;
this.isConnected = true;
}
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* Sends a message to the server.
* @param data The message to send.
*/
public void send(Data data) {
try {
this.outputStream.writeObject(data);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Receives a message from the server.
* @param in The inputStream
*/
public void receive(ObjectInputStream in) {
while (isConnected) {
try {
Object object = in.readObject();
if (object instanceof Data) {
callback.onDataReceived((Data) object);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public void disconnect() {
this.isConnected = false;
try {
this.receiveThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
send(new ConnectionData("Disconnect", "DEV"));
try {
this.socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

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

@@ -36,6 +36,8 @@ public class GameTile extends Rectangle {
public boolean visit(GameCharacter character) {
if (this.character != null) return false;
this.character = character;
this.character.setX(this.x);
this.character.setY(this.y);
return true;
}
@@ -61,6 +63,7 @@ public class GameTile extends Rectangle {
"symbol=" + symbol +
", x=" + x +
", y=" + y +
", character=" + this.character +
'}';
}

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

@@ -1,43 +0,0 @@
package netwerkprog.game.server;
import netwerkprog.game.client.game.characters.DevTest1;
import netwerkprog.game.client.game.characters.DevTest2;
import netwerkprog.game.client.game.characters.DevTest3;
import netwerkprog.game.server.controllers.DataController;
import netwerkprog.game.util.data.ParserCallback;
import java.util.Scanner;
public class Parser {
private final ParserCallback callback;
private Scanner scanner;
private final DataController dataController;
public Parser(ParserCallback callback) {
this.callback = callback;
this.dataController = new DataController();
this.dataController.addAllCharacters(new DevTest1(), new DevTest2(), new DevTest3());
}
public void parse(String request) {
String data = "";
this.scanner = new Scanner(request);
scanner.useDelimiter("~");
String type = scanner.next();
String name = scanner.next();
if (type.equals("character")) {
try {
data = dataController.getCharacter(name).toString();
} catch (IllegalArgumentException ex) {
data = ex.getMessage();
}
}
callback.onDataReceived(data);
}
}

View File

@@ -1,16 +1,19 @@
package netwerkprog.game.server;
import netwerkprog.game.server.controllers.DataController;
import netwerkprog.game.server.controllers.SessionController;
import java.util.HashMap;
public class Server {
private SessionController sessionController;
private DataController dataController;
private Thread sessionThread;
private HashMap<String, Thread> gameThreads;
public void start() {
this.sessionController = new SessionController();
this.sessionController = new SessionController(this);
this.dataController = new DataController();
this.gameThreads = new HashMap<>();
this.sessionThread = new Thread(sessionController);
@@ -32,4 +35,8 @@ public class Server {
// gameThreads.get(game).start();
// }
}
public DataController getDataController() {
return dataController;
}
}

View File

@@ -1,38 +1,35 @@
package netwerkprog.game.server;
import netwerkprog.game.server.controllers.DataController;
import netwerkprog.game.server.controllers.SessionController;
import netwerkprog.game.util.data.ParserCallback;
import netwerkprog.game.util.data.ConnectionData;
import netwerkprog.game.util.data.Data;
import netwerkprog.game.util.data.DataCallback;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ServerClient implements Runnable, ParserCallback {
private DataInputStream in;
private DataOutputStream out;
public class ServerClient implements Runnable {
private ObjectInputStream in;
private ObjectOutputStream out;
private final String name;
private final SessionController server;
private final Parser parser;
private final DataCallback callback;
private boolean isConnected;
public ServerClient(String name, Socket socket, SessionController server) {
public ServerClient(String name, ObjectInputStream in, ObjectOutputStream out, SessionController server, DataController dataController) {
this.name = name;
this.server = server;
this.parser = new Parser(this);
try {
this.in = new DataInputStream(socket.getInputStream());
this.out = new DataOutputStream(socket.getOutputStream());
this.isConnected = true;
} catch (IOException e) {
this.isConnected = false;
e.printStackTrace();
}
this.callback = dataController;
this.in = in;
this.out = out;
this.isConnected = true;
}
public void writeUTF(String text) {
public void writeData(Data data) {
try {
this.out.writeUTF(text);
this.out.writeObject(data);
} catch (IOException e) {
e.printStackTrace();
}
@@ -42,14 +39,26 @@ public class ServerClient implements Runnable, ParserCallback {
public void run() {
while (this.isConnected) {
try {
String received = this.in.readUTF();
this.parser.parse(received);
Object object = this.in.readObject();
if (object instanceof Data) {
Data data = (Data) object;
if (data.getPayload() instanceof ConnectionData) {
ConnectionData connectionData = (ConnectionData) data.getPayload();
if (connectionData.getAction().equals("Disconnect")) {
this.isConnected = false;
//todo properly remove thread.
}
} else {
callback.onDataReceived((Data) this.in.readObject());
}
}
} catch (IOException e) {
System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage());
System.out.println("[SERVERCLIENT] terminating failing connection...");
this.isConnected = false;
System.out.println("[SERVERCLIENT] done!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@@ -57,9 +66,4 @@ public class ServerClient implements Runnable, ParserCallback {
public String getName() {
return this.name;
}
@Override
public void onDataReceived(String data) {
writeUTF(data);
}
}

View File

@@ -1,11 +1,14 @@
package netwerkprog.game.server.controllers;
import netwerkprog.game.util.data.CharacterData;
import netwerkprog.game.util.data.Data;
import netwerkprog.game.util.data.DataCallback;
import netwerkprog.game.util.game.GameCharacter;
import java.util.Arrays;
import java.util.HashSet;
public class DataController {
public class DataController implements DataCallback {
private final HashSet<GameCharacter> gameCharacters;
public DataController() {
@@ -44,4 +47,15 @@ public class DataController {
}
throw new IllegalArgumentException("The character does not exist.");
}
@Override
public void onDataReceived(Data data) {
switch (data.getType()) {
case "Character" :
if (data.getPayload() instanceof CharacterData) {
}
break;
}
}
}

View File

@@ -1,11 +1,13 @@
package netwerkprog.game.server.controllers;
import netwerkprog.game.server.Server;
import netwerkprog.game.server.ServerClient;
import netwerkprog.game.util.application.Controller;
import netwerkprog.game.util.data.ConnectionData;
import netwerkprog.game.util.data.Data;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
@@ -17,12 +19,14 @@ import java.util.Set;
* The sessionController manages any connections from new clients and assigns individual threads to said clients.
*/
public class SessionController extends Controller {
private Server server;
private ServerSocket serverSocket;
private final ArrayList<ServerClient> clients = new ArrayList<>();
private final HashMap<String, Thread> clientThreads = new HashMap<>();
private boolean listening;
public SessionController() {
public SessionController(Server server) {
this.server = server;
this.listening = true;
}
@@ -59,43 +63,66 @@ public class SessionController extends Controller {
try {
System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress());
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
outputStream.writeUTF("Enter username: ");
String username = inputStream.readUTF();
String username = "";
boolean registering = true;
while (registering) {
outputStream.writeObject(new ConnectionData("Connect", "Please give a username"));
Object object = inputStream.readObject();
if (object instanceof Data) {
Data data = (Data) object;
if (data instanceof ConnectionData) {
ConnectionData connectionData = (ConnectionData) data.getPayload();
if (connectionData.getAction().equals("Connect")) {
username = connectionData.getMessage();
outputStream.writeObject(new ConnectionData("Connect", "Confirm"));
registering = false;
} else {
//todo error messaging.
}
} else {
//todo error messaging.
}
} else {
//todo error messaging.
}
}
System.out.println("[SERVER] got username " + username);
ServerClient serverClient = new ServerClient(username, socket, this);
ServerClient serverClient = new ServerClient(username, inputStream, outputStream, this, server.getDataController());
Thread t = new Thread(serverClient);
t.start();
this.clientThreads.put(username,t);
this.clients.add(serverClient);
} catch (IOException ex) {
} catch (IOException | ClassNotFoundException ex) {
ex.printStackTrace();
}
}
/**
* Sends a server message to all connected clients.
* @param text message.
* @param data message.
*/
public void serverMessage(String text) {
public void serverMessage(Data data) {
for (ServerClient serverClient : clients) {
serverClient.writeUTF(text);
serverClient.writeData(data);
}
}
/**
* Sends a message to a specific user.
* @param name user.
* @param text message.
* @param data message.
*/
public void personalMessage(String name, String text) {
public void personalMessage(String name, Data data) {
for (ServerClient serverClient : clients) {
if (serverClient.getName().equals(name)) {
serverClient.writeUTF(text);
serverClient.writeData(data);
break;
}
}
@@ -113,7 +140,7 @@ public class SessionController extends Controller {
e.printStackTrace();
}
this.clientThreads.remove(serverClient.getName());
this.serverMessage(serverClient.getName() + " left!");
//this.serverMessage(serverClient.getName() + " left!");
}
/**

View File

@@ -0,0 +1,17 @@
package netwerkprog.game.util.data;
import netwerkprog.game.util.game.GameCharacter;
import java.io.Serializable;
public class CharacterData extends Data implements Serializable {
private final String name;
private final GameCharacter character;
public CharacterData(String name, GameCharacter character) {
super("Character");
super.setPayload(this);
this.name = name;
this.character = character;
}
}

View File

@@ -0,0 +1,23 @@
package netwerkprog.game.util.data;
import java.io.Serializable;
public class ConnectionData extends Data implements Serializable {
private final String action;
private final String message;
public ConnectionData(String action, String message) {
super("Connection");
super.setPayload(this);
this.action = action;
this.message = message;
}
public String getAction() {
return action;
}
public String getMessage() {
return message;
}
}

View File

@@ -1,7 +1,32 @@
package netwerkprog.game.util.data;
public class Data {
import java.io.Serializable;
public class Data implements Serializable {
public static int port() {
return 8000;
}
private String objectType;
private Data payload;
public Data(String type) {
this.objectType = type;
}
public void setObjectType(String objectType) {
this.objectType = objectType;
}
public void setPayload(Data payload) {
this.payload = payload;
}
public String getType() {
return objectType;
}
public Data getPayload() {
return payload;
}
}

View File

@@ -0,0 +1,5 @@
package netwerkprog.game.util.data;
public interface DataCallback {
void onDataReceived(Data data);
}

View File

@@ -1,29 +1,35 @@
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.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> {
public abstract class GameCharacter extends Actor implements Comparable<GameCharacter>, Serializable {
protected String name;
protected Faction faction;
protected HashSet<Ability> abilities;
protected boolean override;
protected TextureRegion textureRegion;
protected int health;
protected List<GameTile> allowedToMove;
public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) {
super();
this.name = name;
this.faction = faction;
this.abilities = new HashSet<>(Arrays.asList(abilities));
this.override = false;
this.textureRegion = textureRegion;
this.health = 100;
this.allowedToMove = new ArrayList<>();
}
public String getName() {
@@ -38,6 +44,28 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
this.abilities.remove(ability);
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public void heal(int amount) {
this.health += amount;
if (this.health > 100) this.health = 100;
}
public void damage(int amount) {
this.health -= amount;
if (this.health < 0) this. health = 0;
}
public boolean isDead() {
return this.health <= 0;
}
public void changeControl() {
this.override = !this.override;
}
@@ -69,7 +97,7 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
@Override
public int compareTo(GameCharacter o) {
return this.name.compareTo(o.name);
return this.health - o.health;
}
@Override
@@ -77,6 +105,20 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
return "GameCharacter{" +
"name='" + name + '\'' +
", faction=" + faction +
", x=" + super.getX() +
", 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;

View File

@@ -8,7 +8,7 @@ public class RestartSessionControllerTest {
SessionController sessionController;
Thread sessionThread;
sessionController = new SessionController();
sessionController = new SessionController(null);
sessionThread = new Thread(sessionController);
sessionThread.start();