Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f89dbbb6b3 |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,102 +0,0 @@
|
|||||||
info face="Arcade Rounded" size=32 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2
|
|
||||||
common lineHeight=41 base=29 scaleW=512 scaleH=512 pages=1 packed=0
|
|
||||||
page id=0 file="custom.png"
|
|
||||||
chars count=97
|
|
||||||
char id=0 x=0 y=0 width=25 height=30 xoffset=3 yoffset=0 xadvance=31 page=0 chnl=0
|
|
||||||
char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0
|
|
||||||
char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=31 page=0 chnl=0
|
|
||||||
char id=33 x=494 y=30 width=10 height=29 xoffset=8 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=34 x=0 y=88 width=22 height=17 xoffset=4 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=35 x=453 y=59 width=22 height=21 xoffset=4 yoffset=5 xadvance=31 page=0 chnl=0
|
|
||||||
char id=36 x=305 y=59 width=22 height=29 xoffset=4 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=37 x=327 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=38 x=357 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=39 x=22 y=88 width=10 height=17 xoffset=4 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=40 x=119 y=59 width=18 height=29 xoffset=4 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=41 x=137 y=59 width=18 height=29 xoffset=7 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=42 x=475 y=59 width=22 height=21 xoffset=4 yoffset=5 xadvance=31 page=0 chnl=0
|
|
||||||
char id=43 x=431 y=59 width=22 height=21 xoffset=4 yoffset=5 xadvance=31 page=0 chnl=0
|
|
||||||
char id=44 x=497 y=59 width=10 height=18 xoffset=4 yoffset=12 xadvance=31 page=0 chnl=0
|
|
||||||
char id=45 x=110 y=88 width=22 height=6 xoffset=4 yoffset=12 xadvance=31 page=0 chnl=0
|
|
||||||
char id=46 x=54 y=88 width=10 height=10 xoffset=4 yoffset=20 xadvance=31 page=0 chnl=0
|
|
||||||
char id=47 x=215 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=48 x=60 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=49 x=289 y=30 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=50 x=315 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=51 x=345 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=52 x=375 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=53 x=405 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=54 x=434 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=55 x=464 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=56 x=0 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=57 x=30 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=58 x=387 y=59 width=10 height=25 xoffset=4 yoffset=5 xadvance=31 page=0 chnl=0
|
|
||||||
char id=59 x=500 y=0 width=10 height=29 xoffset=4 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=60 x=397 y=59 width=17 height=21 xoffset=4 yoffset=5 xadvance=31 page=0 chnl=0
|
|
||||||
char id=61 x=32 y=88 width=22 height=14 xoffset=4 yoffset=8 xadvance=31 page=0 chnl=0
|
|
||||||
char id=62 x=414 y=59 width=17 height=21 xoffset=8 yoffset=5 xadvance=31 page=0 chnl=0
|
|
||||||
char id=63 x=90 y=59 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=64 x=245 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=65 x=25 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=66 x=55 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=67 x=85 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=68 x=115 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=69 x=145 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=70 x=175 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=71 x=205 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=72 x=235 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=73 x=265 y=0 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=74 x=291 y=0 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=75 x=320 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=76 x=350 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=77 x=380 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=78 x=410 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=79 x=440 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=80 x=470 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=81 x=0 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=82 x=30 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=83 x=60 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=84 x=89 y=30 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=85 x=115 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=86 x=144 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=87 x=173 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=88 x=203 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=89 x=233 y=30 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=90 x=259 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=91 x=155 y=59 width=14 height=29 xoffset=8 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=92 x=275 y=59 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=93 x=169 y=59 width=14 height=29 xoffset=8 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=94 x=74 y=88 width=14 height=9 xoffset=8 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=95 x=132 y=88 width=30 height=6 xoffset=0 yoffset=24 xadvance=31 page=0 chnl=0
|
|
||||||
char id=96 x=64 y=88 width=10 height=9 xoffset=11 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=97 x=25 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=98 x=55 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=99 x=85 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=100 x=115 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=101 x=145 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=102 x=175 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=103 x=205 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=104 x=235 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=105 x=265 y=0 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=106 x=291 y=0 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=107 x=320 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=108 x=350 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=109 x=380 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=110 x=410 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=111 x=440 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=112 x=470 y=0 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=113 x=0 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=114 x=30 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=115 x=60 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=116 x=89 y=30 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=117 x=115 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=118 x=144 y=30 width=29 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=119 x=173 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=120 x=203 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=121 x=233 y=30 width=26 height=29 xoffset=3 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=122 x=259 y=30 width=30 height=29 xoffset=0 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=123 x=183 y=59 width=16 height=29 xoffset=6 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=124 x=504 y=30 width=6 height=29 xoffset=12 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=125 x=199 y=59 width=16 height=29 xoffset=8 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
char id=126 x=88 y=88 width=22 height=9 xoffset=4 yoffset=1 xadvance=31 page=0 chnl=0
|
|
||||||
kernings count=0
|
|
||||||
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 913 B |
|
Before Width: | Height: | Size: 907 B |
104
core/src/netwerkprog/game/client/Client.java
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,53 +1,45 @@
|
|||||||
package netwerkprog.game.client;
|
package netwerkprog.game.client;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.ApplicationAdapter;
|
||||||
import com.badlogic.gdx.Files;
|
import com.badlogic.gdx.Files;
|
||||||
import com.badlogic.gdx.Game;
|
|
||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
|
||||||
import com.badlogic.gdx.audio.Music;
|
import com.badlogic.gdx.audio.Music;
|
||||||
import com.badlogic.gdx.graphics.GL20;
|
import com.badlogic.gdx.graphics.GL20;
|
||||||
import com.badlogic.gdx.graphics.OrthographicCamera;
|
import com.badlogic.gdx.graphics.OrthographicCamera;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
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.SpriteBatch;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
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.Hacker;
|
||||||
import netwerkprog.game.client.game.characters.Team;
|
|
||||||
import netwerkprog.game.client.game.characters.abilities.BodySwap;
|
import netwerkprog.game.client.game.characters.abilities.BodySwap;
|
||||||
import netwerkprog.game.client.game.connections.Client;
|
|
||||||
import netwerkprog.game.client.game.connections.ClientCallback;
|
|
||||||
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.Map;
|
||||||
import netwerkprog.game.client.game.map.MapRenderer;
|
import netwerkprog.game.client.game.map.MapRenderer;
|
||||||
import netwerkprog.game.util.data.Data;
|
import netwerkprog.game.client.game.map.GameInputProcessor;
|
||||||
import netwerkprog.game.util.data.character.DamageData;
|
|
||||||
import netwerkprog.game.util.data.character.MoveData;
|
|
||||||
import netwerkprog.game.util.data.connection.NameData;
|
|
||||||
import netwerkprog.game.util.data.connection.PlayerConnectData;
|
|
||||||
import netwerkprog.game.util.data.connection.TeamData;
|
|
||||||
import netwerkprog.game.util.data.connection.TurnData;
|
|
||||||
import netwerkprog.game.util.game.Faction;
|
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
import netwerkprog.game.util.graphics.FrameRate;
|
import netwerkprog.game.util.graphics.FrameRate;
|
||||||
import netwerkprog.game.util.graphics.TextRenderer;
|
import netwerkprog.game.util.tree.BST;
|
||||||
|
|
||||||
import java.awt.*;
|
public class MainGame extends ApplicationAdapter {
|
||||||
|
SpriteBatch batch;
|
||||||
|
float screenWidth;
|
||||||
|
float screenHeight;
|
||||||
|
private FrameRate frameRate;
|
||||||
|
private Thread client;
|
||||||
|
private OrthographicCamera camera;
|
||||||
|
private GameInputProcessor gameInputProcessor;
|
||||||
|
private GameCharacter selectedCharacter;
|
||||||
|
|
||||||
|
private Map map;
|
||||||
|
public MapRenderer mapRenderer;
|
||||||
|
|
||||||
|
private BST<GameCharacter> tree;
|
||||||
|
public GameCharacter testCharacter;
|
||||||
|
|
||||||
/**
|
|
||||||
* Main game class
|
|
||||||
*/
|
|
||||||
public class MainGame extends Game implements ClientCallback {
|
|
||||||
private static MainGame INSTANCE;
|
private static MainGame INSTANCE;
|
||||||
|
|
||||||
/**
|
private MainGame() {
|
||||||
* return the instance of the main game.
|
}
|
||||||
*
|
|
||||||
* @return the main game
|
|
||||||
*/
|
|
||||||
public static MainGame getInstance() {
|
public static MainGame getInstance() {
|
||||||
if (INSTANCE == null) {
|
if (INSTANCE == null) {
|
||||||
INSTANCE = new MainGame();
|
INSTANCE = new MainGame();
|
||||||
@@ -55,69 +47,28 @@ public class MainGame extends Game implements ClientCallback {
|
|||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private GAMESTATE gamestate;
|
|
||||||
private Client client;
|
|
||||||
private FrameRate frameRate;
|
|
||||||
private OrthographicCamera camera;
|
|
||||||
private GameInputProcessor gameInputProcessor;
|
|
||||||
private SpriteBatch batch;
|
|
||||||
private BitmapFont font;
|
|
||||||
private GlyphLayout layout;
|
|
||||||
private TextRenderer textRenderer;
|
|
||||||
private Map map;
|
|
||||||
public MapRenderer mapRenderer; //todo public?
|
|
||||||
public AssetManager assets; //todo public?
|
|
||||||
private Faction chosenFaction;
|
|
||||||
private Team team;
|
|
||||||
private Team enemyTeam;
|
|
||||||
private GameCharacter selectedCharacter;
|
|
||||||
private float screenWidth;
|
|
||||||
private float screenHeight;
|
|
||||||
private String username;
|
|
||||||
private int turn;
|
|
||||||
private boolean playersTurn;
|
|
||||||
private boolean ready;
|
|
||||||
private boolean enemyReady;
|
|
||||||
private boolean gameOver;
|
|
||||||
private boolean otherPlayerConnected;
|
|
||||||
|
|
||||||
private MainGame() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create() {
|
public void create() {
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init() {
|
|
||||||
batch = new SpriteBatch();
|
batch = new SpriteBatch();
|
||||||
screenWidth = Gdx.graphics.getWidth();
|
screenWidth = Gdx.graphics.getWidth();
|
||||||
screenHeight = Gdx.graphics.getHeight();
|
screenHeight = Gdx.graphics.getHeight();
|
||||||
frameRate = new FrameRate();
|
frameRate = new FrameRate();
|
||||||
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
|
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[]{
|
String[] strings = new String[]{
|
||||||
"#########################",
|
"#########################",
|
||||||
"#xxxx # #",
|
"#xxxx #",
|
||||||
"# x # #",
|
"# x #",
|
||||||
"# xxxx #xxxx #",
|
"# xxxx #",
|
||||||
"# xxxx #xxxx #",
|
"# xx #",
|
||||||
"# xxxx #x xx #",
|
"# x #",
|
||||||
"# x #xxxx #",
|
"# x #",
|
||||||
"# # x #xxx # #",
|
"# x #",
|
||||||
"# # x # # #",
|
"# x #",
|
||||||
"# # x#xxxx # #",
|
"# xxxxxx #",
|
||||||
"# # #",
|
"# x #",
|
||||||
"# x xxxx x x #",
|
|
||||||
"# x xxxx x x #",
|
|
||||||
"# x xxxx x x #",
|
|
||||||
"# x xxxx x x #",
|
|
||||||
"# ## x ## xxxx x x #",
|
|
||||||
"# x #### xxxx x x #",
|
|
||||||
"# x xxxx x x #",
|
"# x xxxx x x #",
|
||||||
"#########################"
|
"#########################"
|
||||||
};
|
};
|
||||||
@@ -129,175 +80,72 @@ public class MainGame extends Game implements ClientCallback {
|
|||||||
camera.viewportWidth = screenWidth / 2;
|
camera.viewportWidth = screenWidth / 2;
|
||||||
camera.viewportHeight = screenHeight / 2;
|
camera.viewportHeight = screenHeight / 2;
|
||||||
camera.update();
|
camera.update();
|
||||||
otherPlayerConnected = false;
|
this.tree = new BST<>();
|
||||||
gameOver = false;
|
initCharacters();
|
||||||
ready = false;
|
// this.tree.insert(new Hacker(,new BodySwap()));
|
||||||
enemyReady = false;
|
|
||||||
playersTurn = true;
|
|
||||||
turn = 0;
|
|
||||||
chosenFaction = null;
|
|
||||||
setGamestate(GAMESTATE.SELECTING_FACTION);
|
|
||||||
connectToServer();
|
|
||||||
// playSong();
|
// playSong();
|
||||||
|
|
||||||
|
|
||||||
|
// connectToServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private void initCharacters() {
|
||||||
* initialize all characters.
|
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", Texture.class);
|
|
||||||
TextureRegion[][] characters = TextureRegion.split(texture, 32, 32);
|
TextureRegion[][] characters = TextureRegion.split(texture, 32, 32);
|
||||||
this.team = new Team();
|
this.testCharacter = new Hacker("harry",characters[1][0], new BodySwap("test"));
|
||||||
this.enemyTeam = new Team();
|
GameCharacter character2 = new Hacker("test2",characters[2][0], new BodySwap("test"));
|
||||||
for (int i = 1; i <= 5; i++) {
|
// this.tree.insert(testCharacter);
|
||||||
GameCharacter temp = new Hacker("hacker" + i, characters[5][0], new BodySwap("test"));
|
// this.tree.insert(character2);
|
||||||
mapRenderer.getGameTiles()[1][i].visit(temp);
|
// 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);
|
||||||
|
|
||||||
GameCharacter temp2 = new Agent("Agent" + i, characters[11][0], new BodySwap("Test"));
|
|
||||||
int width = mapRenderer.getGameTiles()[0].length;
|
|
||||||
mapRenderer.getGameTiles()[1][width - (i + 1)].visit(temp2);
|
|
||||||
|
|
||||||
if (chosenFaction == Faction.HACKER) {
|
|
||||||
this.team.addMember(temp);
|
|
||||||
this.enemyTeam.addMember(temp2);
|
|
||||||
}
|
|
||||||
if (chosenFaction == Faction.MEGACORPORATION) {
|
|
||||||
this.team.addMember(temp2);
|
|
||||||
this.enemyTeam.addMember(temp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setSelectedCharacter(this.team.get(0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void playSong() {
|
private void playSong() {
|
||||||
// play music
|
// play music
|
||||||
Music music = Gdx.audio.newMusic(Gdx.files.getFileHandle("core/assets/sound/beat.mp3", Files.FileType.Internal));
|
Music music = Gdx.audio.newMusic(Gdx.files.getFileHandle("core/assets/music.mp3", Files.FileType.Internal));
|
||||||
music.setVolume(.1f);
|
music.setVolume(.1f);
|
||||||
music.play();
|
music.play();
|
||||||
music.setLooping(true);
|
music.setLooping(true);
|
||||||
|
|
||||||
|
connectToServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void connectToServer() {
|
private void connectToServer() {
|
||||||
client = new Client("localhost", this);
|
client = new Thread(new Client("localhost"));
|
||||||
Thread t = new Thread(client);
|
|
||||||
try {
|
try {
|
||||||
t.start();
|
client.start();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
System.out.println("There was an error connecting : " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearRender() {
|
|
||||||
clearRender(0, 0, 0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void clearRender(float r, float g, float b, float alpha) {
|
|
||||||
Gdx.gl.glClearColor(r / 255f, g / 255f, b / 255f, alpha);
|
|
||||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* render method that is called after the update method
|
* render method that is called after the update method
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void render() {
|
public void render() {
|
||||||
if (this.gamestate == GAMESTATE.PLAYING) {
|
update();
|
||||||
update();
|
// clear screen
|
||||||
// clear screen
|
Gdx.gl.glClearColor(0, 0, 0, 1);
|
||||||
clearRender();
|
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
|
||||||
mapRenderer.render();
|
mapRenderer.render();
|
||||||
frameRate.render();
|
frameRate.render();
|
||||||
renderText();
|
|
||||||
renderTurnText();
|
|
||||||
} else if (this.gamestate == GAMESTATE.SELECTING_FACTION) {
|
|
||||||
clearRender(67, 168, 186, 1);
|
|
||||||
String text = "";
|
|
||||||
if (otherPlayerConnected) {
|
|
||||||
text = username == null ? "Connecting to server..." : "FACTION SELECT\nYou are: " + username + "\nPress 1 for mega corporation, press 2 for hackers";
|
|
||||||
text += "\n\n\nHOW TO PLAY:\nUse WASD to move the camera, and scroll to zoom.\nClick on one of your characters to select them, and click on one of the available surrounding squares to move.\n" +
|
|
||||||
"Click on an enemy when he is in range to attack him.\nFirst to kill the other's team wins!\n\n\nGood luck!";
|
|
||||||
} else text = "Waiting for other player...";
|
|
||||||
renderString(text, Gdx.graphics.getWidth() / 2f, Gdx.graphics.getHeight() / 2f);
|
|
||||||
if (this.ready && this.enemyReady) {
|
|
||||||
if (this.chosenFaction == Faction.HACKER) {
|
|
||||||
chooseHacker();
|
|
||||||
} else if (this.chosenFaction == Faction.MEGACORPORATION) {
|
|
||||||
chooseMegaCorp();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (this.gamestate == GAMESTATE.ENDED) {
|
|
||||||
clearRender(67, 168, 186, 1);
|
|
||||||
String text = "Game ended!\n";
|
|
||||||
if (this.enemyTeam.isDead()) {
|
|
||||||
text += "Congratulations! You won!";
|
|
||||||
} else if (this.team.isDead()) {
|
|
||||||
text += "Too bad! You lost!";
|
|
||||||
}
|
|
||||||
text += "\nPress ESC to exit the game, or ENTER to start a new game";
|
|
||||||
renderString(text, Gdx.graphics.getWidth() / 2f, Gdx.graphics.getHeight() / 2f);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void renderText() {
|
|
||||||
String text = "FACTION: " + 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void renderTurnText() {
|
|
||||||
String text = playersTurn ? "Your turn, moves left: " + (3 - this.turn) : "Other player's turn";
|
|
||||||
layout.setText(font, text);
|
|
||||||
textRenderer.render(text, (Gdx.graphics.getWidth() / 2f) - layout.width / 2f, Gdx.graphics.getHeight() - 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update method that does all calculation before something is being drawn
|
* update method that does all calculation before something is being drawn
|
||||||
*/
|
*/
|
||||||
public void update() {
|
public void update() {
|
||||||
|
|
||||||
frameRate.update();
|
frameRate.update();
|
||||||
camera.update();
|
camera.update();
|
||||||
this.gameInputProcessor.update();
|
this.gameInputProcessor.update();
|
||||||
|
|
||||||
if (this.team.isDead() || this.enemyTeam.isDead()) {
|
|
||||||
this.setGameOver(true);
|
|
||||||
}
|
|
||||||
if (this.isGameOver()) {
|
|
||||||
this.setGamestate(GAMESTATE.ENDED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selectedCharacter.isDead()) {
|
|
||||||
nextCharacter(selectedCharacter);
|
|
||||||
}
|
|
||||||
this.team.update(Gdx.graphics.getDeltaTime());
|
|
||||||
this.enemyTeam.update(Gdx.graphics.getDeltaTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void nextCharacter(GameCharacter c) {
|
|
||||||
for (GameCharacter character : this.team.getMembers()) {
|
|
||||||
if (!character.equals(c)) this.setSelectedCharacter(character);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -307,7 +155,6 @@ public class MainGame extends Game implements ClientCallback {
|
|||||||
screenWidth = width;
|
screenWidth = width;
|
||||||
frameRate.resize(width, height);
|
frameRate.resize(width, height);
|
||||||
mapRenderer.resize(width, height);
|
mapRenderer.resize(width, height);
|
||||||
textRenderer.resize(width, height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -318,10 +165,6 @@ public class MainGame extends Game implements ClientCallback {
|
|||||||
@Override
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
batch.dispose();
|
batch.dispose();
|
||||||
textRenderer.dispose();
|
|
||||||
assets.dispose();
|
|
||||||
textRenderer.dispose();
|
|
||||||
mapRenderer.dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getScreenWidth() {
|
public float getScreenWidth() {
|
||||||
@@ -340,35 +183,13 @@ public class MainGame extends Game implements ClientCallback {
|
|||||||
return map.getWidth();
|
return map.getWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void exit() {
|
public BST<GameCharacter> getTree() {
|
||||||
client.disconnect();
|
return tree;
|
||||||
dispose();
|
|
||||||
Gdx.app.exit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSelectedCharacter(GameCharacter character) {
|
public void setSelectedCharacter(GameCharacter character) {
|
||||||
if (!character.isDead()) {
|
this.selectedCharacter = 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() {
|
public GameCharacter getSelectedCharacter() {
|
||||||
@@ -378,123 +199,4 @@ public class MainGame extends Game implements ClientCallback {
|
|||||||
public boolean hasCharacterSelected() {
|
public boolean hasCharacterSelected() {
|
||||||
return selectedCharacter != null;
|
return selectedCharacter != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Team getTeam() {
|
|
||||||
return team;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGameOver(boolean gameOver) {
|
|
||||||
this.gameOver = gameOver;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isGameOver() {
|
|
||||||
return gameOver;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isOtherPlayerConnected() {
|
|
||||||
return otherPlayerConnected;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void increaseTurn() {
|
|
||||||
this.turn++;
|
|
||||||
if (turn == 3) {
|
|
||||||
this.turn = 0;
|
|
||||||
this.setPlayersTurn(false);
|
|
||||||
send(new TurnData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isPlayersTurn() {
|
|
||||||
return this.playersTurn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPlayersTurn(boolean playersTurn) {
|
|
||||||
this.playersTurn = playersTurn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void send(Data data) {
|
|
||||||
this.client.writeData(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDataReceived(Data data) {
|
|
||||||
if (data instanceof NameData) {
|
|
||||||
this.username = ((NameData) data).getName();
|
|
||||||
send(new PlayerConnectData(username));
|
|
||||||
} else if (data instanceof TeamData) {
|
|
||||||
// check if it is not our own message
|
|
||||||
if (!((TeamData) data).getUsername().equals(this.username)) {
|
|
||||||
// if we have not yet chosen a faction, select the opposing faction
|
|
||||||
TeamData teamData = (TeamData) data;
|
|
||||||
Faction enemyFaction = teamData.getFaction();
|
|
||||||
if (this.chosenFaction == null) {
|
|
||||||
if (enemyFaction == Faction.HACKER) {
|
|
||||||
this.chosenFaction = Faction.MEGACORPORATION;
|
|
||||||
} else {
|
|
||||||
this.chosenFaction = Faction.HACKER;
|
|
||||||
}
|
|
||||||
this.enemyReady = true;
|
|
||||||
this.ready = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (data instanceof MoveData) {
|
|
||||||
MoveData moveData = (MoveData) data;
|
|
||||||
if (!moveData.getUsername().equals(this.username)) {
|
|
||||||
GameTile tile = mapRenderer.getGameTile(moveData.getPos());
|
|
||||||
GameCharacter character = enemyTeam.get(moveData.getCharacterName());
|
|
||||||
mapRenderer.removeCharacterFromTile(character);
|
|
||||||
tile.visit(character);
|
|
||||||
}
|
|
||||||
} else if (data instanceof DamageData) {
|
|
||||||
DamageData damageData = (DamageData) data;
|
|
||||||
team.get(damageData.getName()).damage(10);
|
|
||||||
} else if (data instanceof TurnData) {
|
|
||||||
this.playersTurn = !this.playersTurn;
|
|
||||||
} else if (data instanceof PlayerConnectData) {
|
|
||||||
if (!((PlayerConnectData) data).getUsername().equals(this.username) && !this.otherPlayerConnected) {
|
|
||||||
otherPlayerConnected = true;
|
|
||||||
send(new PlayerConnectData(username));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void chooseHacker() {
|
|
||||||
setChosenFaction(Faction.HACKER);
|
|
||||||
send(new TeamData(Faction.MEGACORPORATION, getUsername()));
|
|
||||||
|
|
||||||
initCharacters();
|
|
||||||
camera.translate(-400, 0);
|
|
||||||
|
|
||||||
this.playersTurn = true;
|
|
||||||
setGamestate(GAMESTATE.PLAYING);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void chooseMegaCorp() {
|
|
||||||
setChosenFaction(Faction.MEGACORPORATION);
|
|
||||||
send(new TeamData(Faction.MEGACORPORATION, getUsername()));
|
|
||||||
initCharacters();
|
|
||||||
this.playersTurn = false;
|
|
||||||
setGamestate(GAMESTATE.PLAYING);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEnemyReady() {
|
|
||||||
return enemyReady;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isReady() {
|
|
||||||
return ready;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReady(boolean ready) {
|
|
||||||
this.ready = ready;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEnemyReady(boolean enemyReady) {
|
|
||||||
this.enemyReady = enemyReady;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
15
core/src/netwerkprog/game/client/Parser.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package netwerkprog.game.client.game;
|
|
||||||
|
|
||||||
public enum GAMESTATE {
|
|
||||||
PLAYING,
|
|
||||||
SELECTING_FACTION,
|
|
||||||
ENDED
|
|
||||||
}
|
|
||||||
15
core/src/netwerkprog/game/client/game/Game.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package netwerkprog.game.client.game;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.application.Controller;
|
||||||
|
|
||||||
|
public class Game extends Controller {
|
||||||
|
|
||||||
|
|
||||||
|
public Game() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
14
core/src/netwerkprog/game/client/game/Graphics.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package netwerkprog.game.client.game;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.application.Controller;
|
||||||
|
|
||||||
|
public class Graphics extends Controller {
|
||||||
|
public Graphics() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ import netwerkprog.game.util.game.Faction;
|
|||||||
import netwerkprog.game.util.game.GameCharacter;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
public class Agent extends GameCharacter {
|
public class Agent extends GameCharacter {
|
||||||
public Agent(String name, TextureRegion textureRegion, Ability... abilities) {
|
public Agent(TextureRegion textureRegion, Ability... abilities) {
|
||||||
super(name, Faction.MEGACORPORATION, textureRegion, abilities);
|
super("Agent", Faction.MEGACORPORATION, textureRegion, abilities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
public class DevTest1 extends GameCharacter {
|
||||||
|
public DevTest1() {
|
||||||
|
super("DevTest1", Faction.HACKER, new TextureRegion());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package netwerkprog.game.client.game.characters;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
import netwerkprog.game.util.game.Faction;
|
||||||
|
|
||||||
|
public class DevTest2 extends GameCharacter {
|
||||||
|
public DevTest2() {
|
||||||
|
super("DevTest2", Faction.MEGACORPORATION, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package netwerkprog.game.client.game.characters;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
import netwerkprog.game.util.game.Faction;
|
||||||
|
|
||||||
|
public class DevTest3 extends GameCharacter {
|
||||||
|
public DevTest3() {
|
||||||
|
super("DevTest3", Faction.AI, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
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<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* create a new team with the given characters
|
|
||||||
* @param characters the characters
|
|
||||||
*/
|
|
||||||
public Team(BST<GameCharacter> characters) {
|
|
||||||
this.members = characters;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* add new member
|
|
||||||
* @param gameCharacter the member to add
|
|
||||||
*/
|
|
||||||
public void addMember(GameCharacter gameCharacter) {
|
|
||||||
if (this.members.getSize() != 6)
|
|
||||||
this.members.insert(gameCharacter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get members
|
|
||||||
* @return the members
|
|
||||||
*/
|
|
||||||
public BST<GameCharacter> getMembers() {
|
|
||||||
return this.members;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set members
|
|
||||||
* @param members the members to set
|
|
||||||
*/
|
|
||||||
public void setMembers(BST<GameCharacter> members) {
|
|
||||||
this.members = members;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* add members
|
|
||||||
* @param characters the members to add
|
|
||||||
*/
|
|
||||||
public void addMember(GameCharacter... characters) {
|
|
||||||
for (GameCharacter gameCharacter : characters) {
|
|
||||||
this.members.insert(gameCharacter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the specific character
|
|
||||||
* @param character the character to get
|
|
||||||
* @return the character, null if it doesnt exist
|
|
||||||
*/
|
|
||||||
public GameCharacter get(GameCharacter character) {
|
|
||||||
for (GameCharacter cur : this.members) {
|
|
||||||
if (cur.equals(character)) {
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the character with the specified username
|
|
||||||
* @param username the username of the character
|
|
||||||
* @return the character, null if it doesnt exist
|
|
||||||
*/
|
|
||||||
public GameCharacter get(String username) {
|
|
||||||
for (GameCharacter cur : this.members) {
|
|
||||||
if (cur.getName().equals(username)) {
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the character at the specified position
|
|
||||||
* @param position the position of the character
|
|
||||||
* @return the character, null if it can't be found
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* update all characters
|
|
||||||
* @param deltaTime the time between the last frame
|
|
||||||
*/
|
|
||||||
public void update(double deltaTime) {
|
|
||||||
for (GameCharacter character : this.members) {
|
|
||||||
character.update(deltaTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check if all players are dead
|
|
||||||
* @return true if all players are dead
|
|
||||||
*/
|
|
||||||
public boolean isDead() {
|
|
||||||
int dead = 0;
|
|
||||||
for (GameCharacter character : this.members) {
|
|
||||||
if (character.isDead()) dead++;
|
|
||||||
}
|
|
||||||
return dead >= this.members.getSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Team{" +
|
|
||||||
"members=" + members +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
package netwerkprog.game.client.game.connections;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
import netwerkprog.game.util.data.connection.ConnectionData;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.ObjectInputStream;
|
|
||||||
import java.io.ObjectOutputStream;
|
|
||||||
import java.net.Socket;
|
|
||||||
|
|
||||||
public class Client implements Runnable {
|
|
||||||
private final int port;
|
|
||||||
private final String hostname;
|
|
||||||
private final ClientCallback callback;
|
|
||||||
private Socket socket;
|
|
||||||
private ObjectOutputStream outputStream;
|
|
||||||
private Thread receiveThread;
|
|
||||||
private boolean connecting;
|
|
||||||
private boolean isConnected;
|
|
||||||
|
|
||||||
public Client(String hostname, ClientCallback callback) {
|
|
||||||
this.port = Data.port();
|
|
||||||
this.hostname = hostname;
|
|
||||||
this.callback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the client process.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
this.connect();
|
|
||||||
try {
|
|
||||||
if (this.receiveThread != null){
|
|
||||||
this.receiveThread.start();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connects the client to the server.
|
|
||||||
*/
|
|
||||||
public void connect() {
|
|
||||||
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;
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void register(ObjectInputStream in) {
|
|
||||||
while (connecting) {
|
|
||||||
writeData(new ConnectionData("Connect", "Request"));
|
|
||||||
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 writeData(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();
|
|
||||||
}
|
|
||||||
writeData(new ConnectionData("Disconnect", "Request"));
|
|
||||||
try {
|
|
||||||
this.socket.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package netwerkprog.game.client.game.connections;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public interface ClientCallback {
|
|
||||||
void onDataReceived(Data data);
|
|
||||||
}
|
|
||||||
15
core/src/netwerkprog/game/client/game/logic/Logic.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package netwerkprog.game.client.game.logic;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.application.Controller;
|
||||||
|
|
||||||
|
public class Logic extends Controller {
|
||||||
|
|
||||||
|
public Logic() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,11 +8,7 @@ import com.badlogic.gdx.math.MathUtils;
|
|||||||
import com.badlogic.gdx.math.Vector3;
|
import com.badlogic.gdx.math.Vector3;
|
||||||
import com.badlogic.gdx.utils.TimeUtils;
|
import com.badlogic.gdx.utils.TimeUtils;
|
||||||
import netwerkprog.game.client.MainGame;
|
import netwerkprog.game.client.MainGame;
|
||||||
import netwerkprog.game.client.game.GAMESTATE;
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
import netwerkprog.game.util.data.character.DamageData;
|
|
||||||
import netwerkprog.game.util.data.character.MoveData;
|
|
||||||
import netwerkprog.game.util.data.connection.TeamData;
|
|
||||||
import netwerkprog.game.util.game.Faction;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@@ -48,7 +44,6 @@ public class GameInputProcessor implements InputProcessor {
|
|||||||
|
|
||||||
camera.zoom = MathUtils.clamp(camera.zoom, 1.5f, 1.8f);
|
camera.zoom = MathUtils.clamp(camera.zoom, 1.5f, 1.8f);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWPressed() {
|
public boolean isWPressed() {
|
||||||
@@ -93,45 +88,26 @@ public class GameInputProcessor implements InputProcessor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean keyUp(int keycode) {
|
public boolean keyUp(int keycode) {
|
||||||
if (mainGame.getGamestate() == GAMESTATE.PLAYING) {
|
// System.out.println(camera.position.x + " , " + camera.position.y);
|
||||||
|
if (keysList.contains(keycode)) {
|
||||||
if (keysList.contains(keycode)) {
|
if (keycode == keysList.get(0)) {
|
||||||
if (keycode == keysList.get(0)) {
|
this.isWPressed = false;
|
||||||
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;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (mainGame.getGamestate() == GAMESTATE.SELECTING_FACTION && mainGame.isOtherPlayerConnected()) {
|
if (keycode == keysList.get(1)) {
|
||||||
if (keycode == Input.Keys.NUM_1) {
|
this.isAPressed = false;
|
||||||
mainGame.send(new TeamData(Faction.MEGACORPORATION, mainGame.getUsername()));
|
return true;
|
||||||
mainGame.chooseMegaCorp();
|
|
||||||
}
|
}
|
||||||
if (keycode == Input.Keys.NUM_2) {
|
if (keycode == keysList.get(2)) {
|
||||||
mainGame.send(new TeamData(Faction.HACKER, mainGame.getUsername()));
|
this.isSPressed = false;
|
||||||
mainGame.chooseHacker();
|
return true;
|
||||||
|
}
|
||||||
|
if (keycode == keysList.get(3)) {
|
||||||
|
this.isDPressed = false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (mainGame.getGamestate() == GAMESTATE.ENDED) {
|
return true;
|
||||||
if (keycode == Input.Keys.ESCAPE) {
|
|
||||||
mainGame.exit();
|
|
||||||
} else if (keycode == Input.Keys.ENTER) {
|
|
||||||
mainGame.dispose();
|
|
||||||
mainGame.init();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -146,58 +122,25 @@ public class GameInputProcessor implements InputProcessor {
|
|||||||
|
|
||||||
Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
|
Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
|
||||||
camera.unproject(touchPoint);
|
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) {
|
|
||||||
|
|
||||||
// moving selected character
|
for (int row = 0; row < mainGame.mapRenderer.getGameTiles().length; row++) {
|
||||||
if (mainGame.isPlayersTurn()) {
|
for (int col = 0; col < mainGame.mapRenderer.getGameTiles()[0].length; col++) {
|
||||||
|
GameTile gameTile = mainGame.mapRenderer.getGameTiles()[row][col];
|
||||||
if (mainGame.hasCharacterSelected() && !gameTile.containsCharacter()) {
|
if (gameTile.contains(touchPoint.x, touchPoint.y)) {
|
||||||
|
if (button == Input.Buttons.LEFT) {
|
||||||
if (gameTile.getSymbol() != '#' && mainGame.mapRenderer.getSurroundedTilesOfCurrentCharacter().contains(gameTile)) {
|
// System.out.println(gameTile + " row: " + row + ", col: " + col);
|
||||||
mainGame.mapRenderer.removeCharacterFromTile(mainGame.getSelectedCharacter());
|
if (mainGame.hasCharacterSelected() && !gameTile.containsCharacter()) {
|
||||||
gameTile.visit(mainGame.getSelectedCharacter());
|
// System.out.println(mainGame.getSelectedCharacter());
|
||||||
mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row);
|
removeCharacterFromTile(mainGame.getSelectedCharacter());
|
||||||
mainGame.increaseTurn();
|
gameTile.visit(mainGame.getSelectedCharacter());
|
||||||
mainGame.send(new MoveData(mainGame.getUsername(), mainGame.getSelectedCharacter().getName(), mainGame.mapRenderer.getPos(gameTile)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// clicking on enemy
|
|
||||||
if (mainGame.hasCharacterSelected() && gameTile.containsCharacter() && gameTile.getCharacter().getFaction() != mainGame.getChosenFaction()) {
|
|
||||||
if (mainGame.mapRenderer.getSurroundedTilesOfCurrentCharacter().contains(gameTile)) {
|
|
||||||
if (!gameTile.getCharacter().isDead()) {
|
|
||||||
gameTile.getCharacter().damage(gameTile.getCharacter().getDamageAmount());
|
|
||||||
mainGame.increaseTurn();
|
|
||||||
mainGame.send(new DamageData(gameTile.getCharacter().getName()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// set selected character
|
|
||||||
if (!mainGame.hasCharacterSelected() && gameTile.containsCharacter()) {
|
|
||||||
if (gameTile.getCharacter().getFaction() == mainGame.getChosenFaction()) {
|
|
||||||
if (!gameTile.getCharacter().isDead()) {
|
|
||||||
mainGame.setSelectedCharacter(gameTile.getCharacter());
|
|
||||||
mainGame.mapRenderer.setSurroundedTilesOfCurrentCharacter(col, row);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// switch character
|
|
||||||
if (gameTile.containsCharacter()
|
|
||||||
&& !mainGame.getSelectedCharacter().equals(gameTile.getCharacter())
|
|
||||||
&& gameTile.getCharacter().getFaction() == mainGame.getChosenFaction()) {
|
|
||||||
if (!gameTile.getCharacter().isDead()) {
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,7 +148,18 @@ public class GameInputProcessor implements InputProcessor {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeCharacterFromTile(GameCharacter character) {
|
||||||
|
rowLoop:
|
||||||
|
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.containsCharacter() && gameTile.getCharacter().equals(character)) {
|
||||||
|
gameTile.removeCharacter();
|
||||||
|
break rowLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
|
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ public class GameTile extends Rectangle {
|
|||||||
super.height = textureRegion.getRegionHeight();
|
super.height = textureRegion.getRegionHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public GameCharacter getCharacter() {
|
public GameCharacter getCharacter() {
|
||||||
return character;
|
return character;
|
||||||
}
|
}
|
||||||
@@ -38,8 +36,6 @@ public class GameTile extends Rectangle {
|
|||||||
public boolean visit(GameCharacter character) {
|
public boolean visit(GameCharacter character) {
|
||||||
if (this.character != null) return false;
|
if (this.character != null) return false;
|
||||||
this.character = character;
|
this.character = character;
|
||||||
this.character.setX(this.x);
|
|
||||||
this.character.setY(this.y);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +61,6 @@ public class GameTile extends Rectangle {
|
|||||||
"symbol=" + symbol +
|
"symbol=" + symbol +
|
||||||
", x=" + x +
|
", x=" + x +
|
||||||
", y=" + y +
|
", y=" + y +
|
||||||
", character=" + this.character +
|
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package netwerkprog.game.client.game.map;
|
package netwerkprog.game.client.game.map;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map class to hold a 2d array of tiles which will specify the map
|
* Map class to hold a 2d array of tiles which will specify the map
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,14 +4,9 @@ import com.badlogic.gdx.Gdx;
|
|||||||
import com.badlogic.gdx.graphics.OrthographicCamera;
|
import com.badlogic.gdx.graphics.OrthographicCamera;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
|
||||||
import netwerkprog.game.client.MainGame;
|
import netwerkprog.game.client.MainGame;
|
||||||
import netwerkprog.game.util.game.GameCharacter;
|
|
||||||
import netwerkprog.game.util.graphics.Renderable;
|
import netwerkprog.game.util.graphics.Renderable;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import java.awt.*;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class MapRenderer implements Renderable {
|
public class MapRenderer implements Renderable {
|
||||||
private final OrthographicCamera camera;
|
private final OrthographicCamera camera;
|
||||||
@@ -24,19 +19,14 @@ public class MapRenderer implements Renderable {
|
|||||||
private static int y = 0;
|
private static int y = 0;
|
||||||
|
|
||||||
private MainGame mainGame;
|
private MainGame mainGame;
|
||||||
private Texture square;
|
|
||||||
private Texture square2;
|
|
||||||
private Texture hitMarker;
|
|
||||||
private Texture tombStone;
|
|
||||||
|
|
||||||
public static TextureRegion FLOOR_TILE;
|
public static TextureRegion FLOOR_TILE;
|
||||||
public static TextureRegion WALL_TILE;
|
public static TextureRegion WALL_TILE;
|
||||||
public static TextureRegion PATH_TILE;
|
public static TextureRegion PATH_TILE;
|
||||||
|
|
||||||
private GameTile[][] gameTiles;
|
private GameTile[][] gameTiles;
|
||||||
private List<GameTile> surroundedTilesOfCurrentCharacter;
|
|
||||||
|
|
||||||
public static int[][] directions = new int[][]{{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* makea a new mapRenderer object
|
* makea a new mapRenderer object
|
||||||
@@ -60,29 +50,15 @@ public class MapRenderer implements Renderable {
|
|||||||
* loads all the images for the tiles and adds all the tiles to the array
|
* loads all the images for the tiles and adds all the tiles to the array
|
||||||
*/
|
*/
|
||||||
private void makeTiles() {
|
private void makeTiles() {
|
||||||
mainGame.assets.load("square.png", Texture.class);
|
Texture texture = new Texture(Gdx.files.internal(tilePath));
|
||||||
mainGame.assets.load("square2.png", Texture.class);
|
|
||||||
mainGame.assets.load(tilePath, Texture.class);
|
|
||||||
mainGame.assets.load("hit.png", Texture.class);
|
|
||||||
mainGame.assets.load("dead.png", Texture.class);
|
|
||||||
mainGame.assets.finishLoading();
|
|
||||||
square = mainGame.assets.get("square.png");
|
|
||||||
square2 = mainGame.assets.get("square2.png");
|
|
||||||
hitMarker = mainGame.assets.get("hit.png");
|
|
||||||
tombStone = mainGame.assets.get("dead.png");
|
|
||||||
|
|
||||||
// load the texture file
|
|
||||||
Texture texture = mainGame.assets.get(tilePath);
|
|
||||||
TextureRegion[][] tileTextures = TextureRegion.split(texture, 32, 32);
|
TextureRegion[][] tileTextures = TextureRegion.split(texture, 32, 32);
|
||||||
|
|
||||||
FLOOR_TILE = tileTextures[1][6];
|
FLOOR_TILE = tileTextures[1][6];
|
||||||
WALL_TILE = tileTextures[0][4];
|
WALL_TILE = tileTextures[0][4];
|
||||||
PATH_TILE = tileTextures[4][6];
|
PATH_TILE = tileTextures[4][6];
|
||||||
|
|
||||||
// init the array
|
|
||||||
this.gameTiles = new GameTile[map.getHeight()][map.getWidth()];
|
this.gameTiles = new GameTile[map.getHeight()][map.getWidth()];
|
||||||
|
|
||||||
// for each game tile, put the corresponding tile image in the array
|
|
||||||
for (int row = map.getHeight(); row >= 0; row--) {
|
for (int row = map.getHeight(); row >= 0; row--) {
|
||||||
y += 32;
|
y += 32;
|
||||||
x = 0;
|
x = 0;
|
||||||
@@ -115,9 +91,6 @@ public class MapRenderer implements Renderable {
|
|||||||
this.map = map;
|
this.map = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* method that renders the whole map
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void render() {
|
public void render() {
|
||||||
batch.begin();
|
batch.begin();
|
||||||
@@ -126,136 +99,24 @@ public class MapRenderer implements Renderable {
|
|||||||
for (GameTile[] gameTileRow : gameTiles) {
|
for (GameTile[] gameTileRow : gameTiles) {
|
||||||
for (int col = 0; col < gameTiles[0].length; col++) {
|
for (int col = 0; col < gameTiles[0].length; col++) {
|
||||||
GameTile cur = gameTileRow[col];
|
GameTile cur = gameTileRow[col];
|
||||||
//draw each tile
|
|
||||||
batch.draw(cur.getTextureRegion(), cur.x, cur.y);
|
batch.draw(cur.getTextureRegion(), cur.x, cur.y);
|
||||||
if (cur.containsCharacter()) {
|
if (cur.containsCharacter()) {
|
||||||
//draw each character on a tile
|
batch.draw(cur.getCharacter().getTextureRegion(), cur.x, cur.y);
|
||||||
GameCharacter character = cur.getCharacter();
|
// System.out.println("drawing character at " + cur.x + " " + cur.y);
|
||||||
if (!character.isDead()) {
|
|
||||||
batch.draw(character.getTextureRegion(), cur.x, cur.y);
|
|
||||||
//if he's showing an animation, draw the hitmarker.
|
|
||||||
if (character.isShowingAnimation())
|
|
||||||
batch.draw(hitMarker, cur.x, cur.y);
|
|
||||||
// if hes selected, draw the green square
|
|
||||||
if (character.equals(mainGame.getSelectedCharacter()))
|
|
||||||
batch.draw(square, cur.x, cur.y);
|
|
||||||
} else {
|
|
||||||
// if hes dead, draw a tombstone
|
|
||||||
batch.draw(tombStone, cur.x, cur.y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (surroundedTilesOfCurrentCharacter != null && !surroundedTilesOfCurrentCharacter.isEmpty()) {
|
|
||||||
for (GameTile gameTile : surroundedTilesOfCurrentCharacter) {
|
|
||||||
batch.draw(square2, gameTile.x, gameTile.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
batch.end();
|
batch.end();
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(double deltaTime) {
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gets the 8 surrounding tiles of the character, to see where he can move.
|
|
||||||
* @param x the x position of the character
|
|
||||||
* @param y the y position of the character
|
|
||||||
*/
|
|
||||||
public void setSurroundedTilesOfCurrentCharacter(int x, int y) {
|
|
||||||
List<GameTile> 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gets the game tile of the character.
|
|
||||||
* @param character the character
|
|
||||||
* @return the game tile of the character, null if it is not found
|
|
||||||
*/
|
|
||||||
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 void dispose() {
|
|
||||||
tombStone.dispose();
|
|
||||||
square.dispose();
|
|
||||||
square2.dispose();
|
|
||||||
hitMarker.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gets the position of the specified tile.
|
|
||||||
* @param tile the tile to get the position of
|
|
||||||
* @return the position of the tile, a point of -1,-1 if the tile is not found
|
|
||||||
*/
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gets the game tile at the specified position.
|
|
||||||
* @param pos the position of the tile
|
|
||||||
* @return the game tile on the position, <code>null</code> if it is not found
|
|
||||||
*/
|
|
||||||
public GameTile getGameTile(Point pos) {
|
|
||||||
for (int row = 0; row < this.gameTiles.length; row++) {
|
|
||||||
for (int col = 0; col < this.gameTiles[0].length; col++) {
|
|
||||||
if (row == pos.y && col == pos.x) {
|
|
||||||
return this.gameTiles[row][col];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* remove character from tile
|
|
||||||
* @param character the character to remove
|
|
||||||
*/
|
|
||||||
public void removeCharacterFromTile(GameCharacter character) {
|
|
||||||
rowLoop:
|
|
||||||
for (int row = 0; row < getGameTiles().length; row++) {
|
|
||||||
for (int col = 0; col < getGameTiles()[0].length; col++) {
|
|
||||||
GameTile gameTile = getGameTiles()[row][col];
|
|
||||||
if (gameTile.containsCharacter() && gameTile.getCharacter().equals(character)) {
|
|
||||||
gameTile.removeCharacter();
|
|
||||||
break rowLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* resize the screen
|
|
||||||
* @param screenWidth the width of the screen
|
|
||||||
* @param screenHeight the height of the screen
|
|
||||||
*/
|
|
||||||
public void resize(int screenWidth, int screenHeight) {
|
public void resize(int screenWidth, int screenHeight) {
|
||||||
cam = new OrthographicCamera(screenWidth, screenHeight);
|
cam = new OrthographicCamera(screenWidth, screenHeight);
|
||||||
cam.translate(screenWidth / 2f, screenHeight / 2f);
|
cam.translate(screenWidth / 2f, screenHeight / 2f);
|
||||||
@@ -263,20 +124,7 @@ public class MapRenderer implements Renderable {
|
|||||||
batch.setProjectionMatrix(cam.combined);
|
batch.setProjectionMatrix(cam.combined);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* return the game tiles
|
|
||||||
* @return the game tiles.
|
|
||||||
*/
|
|
||||||
public GameTile[][] getGameTiles() {
|
public GameTile[][] getGameTiles() {
|
||||||
return gameTiles;
|
return gameTiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* get the surrounding tiles of character
|
|
||||||
* @return the surrounding tiles of character
|
|
||||||
*/
|
|
||||||
public List<GameTile> getSurroundedTilesOfCurrentCharacter() {
|
|
||||||
return surroundedTilesOfCurrentCharacter;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
package netwerkprog.game.server;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public interface DataCallback {
|
|
||||||
void onDataReceived(Data data, DataSource source);
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package netwerkprog.game.server;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public interface DataSource {
|
|
||||||
void writeData(Data data);
|
|
||||||
String getName();
|
|
||||||
}
|
|
||||||
43
core/src/netwerkprog/game/server/Parser.java
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,35 @@
|
|||||||
package netwerkprog.game.server;
|
package netwerkprog.game.server;
|
||||||
|
|
||||||
|
import netwerkprog.game.server.controllers.SessionController;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class Server {
|
public class Server {
|
||||||
|
private SessionController sessionController;
|
||||||
private Thread sessionThread;
|
private Thread sessionThread;
|
||||||
|
private HashMap<String, Thread> gameThreads;
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
SessionController sessionController = new SessionController();
|
this.sessionController = new SessionController();
|
||||||
|
|
||||||
|
this.gameThreads = new HashMap<>();
|
||||||
this.sessionThread = new Thread(sessionController);
|
this.sessionThread = new Thread(sessionController);
|
||||||
|
|
||||||
run();
|
run();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void run() {
|
private void run() {
|
||||||
|
setTestGames();
|
||||||
this.sessionThread.start();
|
this.sessionThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setTestGames() {
|
||||||
|
// for (int i = 0; i < 10; i++) {
|
||||||
|
// gameThreads.put("game " + i, new Thread(new GameController(i)));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// for (String game : gameThreads.keySet()) {
|
||||||
|
// gameThreads.get(game).start();
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,38 +1,40 @@
|
|||||||
package netwerkprog.game.server;
|
package netwerkprog.game.server;
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
import netwerkprog.game.server.controllers.SessionController;
|
||||||
import netwerkprog.game.util.data.connection.ConnectionData;
|
import netwerkprog.game.util.data.ParserCallback;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.net.Socket;
|
||||||
import java.io.ObjectOutputStream;
|
|
||||||
|
|
||||||
public class ServerClient implements Runnable, DataSource {
|
public class ServerClient implements Runnable, ParserCallback {
|
||||||
|
private DataInputStream in;
|
||||||
|
private DataOutputStream out;
|
||||||
private final String name;
|
private final String name;
|
||||||
private final SessionController server;
|
private final SessionController server;
|
||||||
private final DataCallback callback;
|
private final Parser parser;
|
||||||
private final ObjectInputStream in;
|
|
||||||
private final ObjectOutputStream out;
|
|
||||||
private boolean isConnected;
|
private boolean isConnected;
|
||||||
|
|
||||||
public ServerClient(String name, SessionController server, DataCallback callback, ObjectInputStream in, ObjectOutputStream out) {
|
public ServerClient(String name, Socket socket, SessionController server) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.callback = callback;
|
this.parser = new Parser(this);
|
||||||
this.in = in;
|
try {
|
||||||
this.out = out;
|
this.in = new DataInputStream(socket.getInputStream());
|
||||||
this.isConnected = true;
|
this.out = new DataOutputStream(socket.getOutputStream());
|
||||||
|
this.isConnected = true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
this.isConnected = false;
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public void writeUTF(String text) {
|
||||||
* Writes data to the connected client.
|
|
||||||
* @param data The data object to write.
|
|
||||||
*/
|
|
||||||
public void writeData(Data data) {
|
|
||||||
try {
|
try {
|
||||||
this.out.writeObject(data);
|
this.out.writeUTF(text);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.out.println("Connection suddenly terminated!");
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,23 +42,14 @@ public class ServerClient implements Runnable, DataSource {
|
|||||||
public void run() {
|
public void run() {
|
||||||
while (this.isConnected) {
|
while (this.isConnected) {
|
||||||
try {
|
try {
|
||||||
Object object = this.in.readObject();
|
String received = this.in.readUTF();
|
||||||
if (object instanceof Data) {
|
this.parser.parse(received);
|
||||||
Data data = (Data) object;
|
|
||||||
if (data.getPayload() instanceof ConnectionData) {
|
|
||||||
ConnectionData connectionData = (ConnectionData) data.getPayload();
|
|
||||||
if (connectionData.getAction().equals("Disconnect")) {
|
|
||||||
this.isConnected = false;
|
|
||||||
this.server.disconnect(this);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
callback.onDataReceived(data, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage());
|
||||||
|
System.out.println("[SERVERCLIENT] terminating failing connection...");
|
||||||
this.isConnected = false;
|
this.isConnected = false;
|
||||||
} catch (ClassNotFoundException e) {
|
System.out.println("[SERVERCLIENT] done!");
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,4 +57,9 @@ public class ServerClient implements Runnable, DataSource {
|
|||||||
public String getName() {
|
public String getName() {
|
||||||
return this.name;
|
return this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDataReceived(String data) {
|
||||||
|
writeUTF(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
package netwerkprog.game.server;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
import netwerkprog.game.util.data.connection.ConnectionData;
|
|
||||||
import netwerkprog.game.util.data.connection.NameData;
|
|
||||||
import netwerkprog.game.util.data.connection.PlayerConnectData;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.ObjectInputStream;
|
|
||||||
import java.io.ObjectOutputStream;
|
|
||||||
import java.net.ServerSocket;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The sessionController manages any connections from new clients and assigns individual threads to said clients.
|
|
||||||
*/
|
|
||||||
public class SessionController implements DataCallback, Runnable {
|
|
||||||
private ServerSocket serverSocket;
|
|
||||||
private final ArrayList<ServerClient> clients;
|
|
||||||
private boolean listening;
|
|
||||||
|
|
||||||
public SessionController() {
|
|
||||||
this.clients = new ArrayList<>();
|
|
||||||
this.listening = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thread run method.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
this.listening = true;
|
|
||||||
while (listening) {
|
|
||||||
listen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Listens for any new clients.
|
|
||||||
*/
|
|
||||||
public void listen() {
|
|
||||||
try {
|
|
||||||
this.serverSocket = new ServerSocket(Data.port());
|
|
||||||
registerClient(serverSocket.accept());
|
|
||||||
this.serverSocket.close();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a client to the server.
|
|
||||||
* @param socket The socket used for the client connections.
|
|
||||||
*/
|
|
||||||
public void registerClient(Socket socket) {
|
|
||||||
try {
|
|
||||||
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
|
|
||||||
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
|
|
||||||
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")) {
|
|
||||||
outputStream.writeObject(new ConnectionData("Connect", "Confirm"));
|
|
||||||
registering = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
username = "player" + (this.clients.size() + 1);
|
|
||||||
ServerClient serverClient = new ServerClient(username, this, this, inputStream, outputStream);
|
|
||||||
Thread t = new Thread(serverClient);
|
|
||||||
t.start();
|
|
||||||
serverClient.writeData(new NameData(username));
|
|
||||||
this.clients.add(serverClient);
|
|
||||||
} catch (IOException | ClassNotFoundException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shuts down the sessionController.
|
|
||||||
*/
|
|
||||||
public void shutdown() {
|
|
||||||
this.listening = false;
|
|
||||||
try {
|
|
||||||
serverSocket.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disconnects the client from the server list.
|
|
||||||
* @param client The Client to disconnect.
|
|
||||||
*/
|
|
||||||
public void disconnect(ServerClient client) {
|
|
||||||
this.clients.remove(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDataReceived(Data data, DataSource source) {
|
|
||||||
for (ServerClient client: clients) {
|
|
||||||
if (!client.getName().equals(source.getName())){
|
|
||||||
client.writeData(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package netwerkprog.game.server.controllers;
|
||||||
|
|
||||||
|
import netwerkprog.game.util.game.GameCharacter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
public class DataController {
|
||||||
|
private final HashSet<GameCharacter> gameCharacters;
|
||||||
|
|
||||||
|
public DataController() {
|
||||||
|
gameCharacters = new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCharacter(GameCharacter gameCharacter) {
|
||||||
|
this.gameCharacters.add(gameCharacter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAllCharacters(GameCharacter... gameCharacters) {
|
||||||
|
this.gameCharacters.addAll(Arrays.asList(gameCharacters));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCharacter(String name) {
|
||||||
|
this.gameCharacters.removeIf(character -> character.getName().equals(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCharacter(GameCharacter character) {
|
||||||
|
this.gameCharacters.remove(character);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearCharacters() {
|
||||||
|
this.gameCharacters.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashSet<GameCharacter> getGameCharacters() {
|
||||||
|
return gameCharacters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameCharacter getCharacter(String name) throws IllegalArgumentException {
|
||||||
|
for (GameCharacter character : gameCharacters) {
|
||||||
|
if (character.getName().equals(name)) {
|
||||||
|
return character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("The character does not exist.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
package netwerkprog.game.server.controllers;
|
||||||
|
|
||||||
|
import netwerkprog.game.server.ServerClient;
|
||||||
|
import netwerkprog.game.util.application.Controller;
|
||||||
|
import netwerkprog.game.util.data.Data;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
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 ServerSocket serverSocket;
|
||||||
|
private final ArrayList<ServerClient> clients = new ArrayList<>();
|
||||||
|
private final HashMap<String, Thread> clientThreads = new HashMap<>();
|
||||||
|
private boolean listening;
|
||||||
|
|
||||||
|
public SessionController() {
|
||||||
|
this.listening = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thread run method.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
this.listening = true;
|
||||||
|
while (listening) {
|
||||||
|
listen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listens for any new clients.
|
||||||
|
*/
|
||||||
|
public void listen() {
|
||||||
|
try {
|
||||||
|
this.serverSocket = new ServerSocket(Data.port());
|
||||||
|
System.out.println("[SERVER] listening on port " + Data.port());
|
||||||
|
registerClient(serverSocket.accept());
|
||||||
|
this.serverSocket.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a client to the server.
|
||||||
|
* @param socket The socket used for the client connections.
|
||||||
|
*/
|
||||||
|
public void registerClient(Socket socket) {
|
||||||
|
try {
|
||||||
|
System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress());
|
||||||
|
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
|
||||||
|
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
|
||||||
|
|
||||||
|
outputStream.writeUTF("Enter username: ");
|
||||||
|
String username = inputStream.readUTF();
|
||||||
|
|
||||||
|
System.out.println("[SERVER] got username " + username);
|
||||||
|
ServerClient serverClient = new ServerClient(username, socket, this);
|
||||||
|
|
||||||
|
Thread t = new Thread(serverClient);
|
||||||
|
t.start();
|
||||||
|
|
||||||
|
this.clientThreads.put(username,t);
|
||||||
|
this.clients.add(serverClient);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a server message to all connected clients.
|
||||||
|
* @param text message.
|
||||||
|
*/
|
||||||
|
public void serverMessage(String text) {
|
||||||
|
for (ServerClient serverClient : clients) {
|
||||||
|
serverClient.writeUTF(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a message to a specific user.
|
||||||
|
* @param name user.
|
||||||
|
* @param text message.
|
||||||
|
*/
|
||||||
|
public void personalMessage(String name, String text) {
|
||||||
|
for (ServerClient serverClient : clients) {
|
||||||
|
if (serverClient.getName().equals(name)) {
|
||||||
|
serverClient.writeUTF(text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a client from the server.
|
||||||
|
* @param serverClient The client to remove.
|
||||||
|
*/
|
||||||
|
public void removeClient(ServerClient serverClient) {
|
||||||
|
this.clients.remove(serverClient);
|
||||||
|
try {
|
||||||
|
this.clientThreads.get(serverClient.getName()).join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
this.clientThreads.remove(serverClient.getName());
|
||||||
|
this.serverMessage(serverClient.getName() + " left!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a list of all connected users.
|
||||||
|
* @return Set of all connected users.
|
||||||
|
*/
|
||||||
|
public Set<String> getUsernames() {
|
||||||
|
return this.clientThreads.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shuts down the sessionController.
|
||||||
|
*/
|
||||||
|
public void shutdown() {
|
||||||
|
this.listening = false;
|
||||||
|
try {
|
||||||
|
serverSocket.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println("[SERVER] networking shutdown ");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package netwerkprog.game.util.application;
|
||||||
|
|
||||||
|
public abstract class Controller implements Runnable {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -6,6 +6,36 @@ import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
|
|||||||
* custom application config class for the game
|
* custom application config class for the game
|
||||||
*/
|
*/
|
||||||
public class GameApplicationConfiguration extends LwjglApplicationConfiguration {
|
public class GameApplicationConfiguration extends LwjglApplicationConfiguration {
|
||||||
|
/**
|
||||||
|
* makes a new configuration with the given parameters
|
||||||
|
* @param width the width (in pixels)
|
||||||
|
* @param height the height (in pixels)
|
||||||
|
* @param fullscreen whether the app should run in fullscreen
|
||||||
|
*/
|
||||||
|
public GameApplicationConfiguration(int width, int height, boolean fullscreen) {
|
||||||
|
super();
|
||||||
|
super.width = width;
|
||||||
|
super.height = height;
|
||||||
|
super.fullscreen = fullscreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* makes a new configuration with the given parameters.
|
||||||
|
* No fullscreen
|
||||||
|
* @param width the width (in pixels)
|
||||||
|
* @param height the height (in pixels)
|
||||||
|
*/
|
||||||
|
public GameApplicationConfiguration(int width, int height) {
|
||||||
|
this(width,height,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* makes a new configuration with standard full hd width and height
|
||||||
|
*/
|
||||||
|
public GameApplicationConfiguration() {
|
||||||
|
this(1920,1080,false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a new configuration with the given parameters
|
* Makes a new configuration with the given parameters
|
||||||
* @param title the title of the window
|
* @param title the title of the window
|
||||||
@@ -31,4 +61,13 @@ public class GameApplicationConfiguration extends LwjglApplicationConfiguration
|
|||||||
public GameApplicationConfiguration(String title, int width, int height) {
|
public GameApplicationConfiguration(String title, int width, int height) {
|
||||||
this(title,width,height,false);
|
this(title,width,height,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes a new configuration with the given title
|
||||||
|
* the window will be 1920 x 1080 and fullscreen will be off
|
||||||
|
* @param title the window title
|
||||||
|
*/
|
||||||
|
public GameApplicationConfiguration(String title) {
|
||||||
|
this(title, 1920,1080);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
102
core/src/netwerkprog/game/util/application/Timer.java
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
package netwerkprog.game.util.application;
|
||||||
|
|
||||||
|
public class Timer implements Updatable {
|
||||||
|
private double wait;
|
||||||
|
private double time;
|
||||||
|
private boolean loop;
|
||||||
|
private int timeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* makes a new timer that doesnt start automatically and doesnt loop
|
||||||
|
* @param wait the time in ms to wait
|
||||||
|
*/
|
||||||
|
public Timer(double wait) {
|
||||||
|
this(wait, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* makes a new timer with the given parameters
|
||||||
|
* @param wait the wait time in ms
|
||||||
|
* @param autoStart whether the timer should start automatically
|
||||||
|
*/
|
||||||
|
public Timer(double wait, boolean autoStart) {
|
||||||
|
this(wait, autoStart, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* makes a new timer with the given parameters
|
||||||
|
* @param wait the wait time in ms
|
||||||
|
* @param autoStart wether the timer should start automatically
|
||||||
|
* @param loop if this timer should loop
|
||||||
|
*/
|
||||||
|
public Timer(double wait, boolean autoStart, boolean loop) {
|
||||||
|
this.wait = wait;
|
||||||
|
this.loop = loop;
|
||||||
|
this.time = 0.0;
|
||||||
|
this.timeout = autoStart ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
this.timeout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
this.timeout = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get whether the timer has timed out.
|
||||||
|
* Timeouts will stack and will not be reset when this method has been called,
|
||||||
|
* instead the timeout will decrease by one.
|
||||||
|
*
|
||||||
|
* @return timeout occurred
|
||||||
|
*/
|
||||||
|
public boolean timeout() {
|
||||||
|
if (this.timeout == -1) {
|
||||||
|
// timeout has occurred and is not looped
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.timeout - 1 < 0) {
|
||||||
|
// timeout has not occurred
|
||||||
|
this.timeout = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.loop) {
|
||||||
|
// when looped, decrease by one
|
||||||
|
this.timeout -= 1;
|
||||||
|
} else {
|
||||||
|
// else abort the timer
|
||||||
|
this.timeout = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the time until the timeout.
|
||||||
|
* @param wait the new timeout time
|
||||||
|
*/
|
||||||
|
public void setWait(double wait) {
|
||||||
|
this.wait = wait;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public double getWait() {
|
||||||
|
return this.wait;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(double deltaTime) {
|
||||||
|
if (this.timeout != -1) {
|
||||||
|
// Only update when timer is not aborted
|
||||||
|
this.time += deltaTime;
|
||||||
|
if (this.time >= this.wait) {
|
||||||
|
// timeout occurred
|
||||||
|
this.time -= this.wait;
|
||||||
|
this.timeout++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package netwerkprog.game.util.application;
|
||||||
|
|
||||||
|
public interface Updatable {
|
||||||
|
void update(double deltaTime);
|
||||||
|
}
|
||||||
@@ -1,31 +1,7 @@
|
|||||||
package netwerkprog.game.util.data;
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
import java.io.Serializable;
|
public class Data {
|
||||||
|
|
||||||
public class Data implements Serializable {
|
|
||||||
public static int port() {
|
public static int port() {
|
||||||
return 8000;
|
return 8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final String objectType;
|
|
||||||
private Data payload;
|
|
||||||
|
|
||||||
public Data(String type) {
|
|
||||||
this.objectType = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPayload(Data payload) {
|
|
||||||
this.payload = payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Data getPayload() {
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Data{" +
|
|
||||||
"objectType='" + objectType + '\'' +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
4
core/src/netwerkprog/game/util/data/Event.java
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
|
public class Event {
|
||||||
|
}
|
||||||
5
core/src/netwerkprog/game/util/data/ParserCallback.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package netwerkprog.game.util.data;
|
||||||
|
|
||||||
|
public interface ParserCallback {
|
||||||
|
void onDataReceived(String data);
|
||||||
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.character;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public class DamageData extends Data {
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
public DamageData(String name) {
|
|
||||||
super("Damage");
|
|
||||||
super.setPayload(this);
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.character;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
|
|
||||||
public class MoveData extends Data {
|
|
||||||
private final String username;
|
|
||||||
private final String characterName;
|
|
||||||
private final Point pos;
|
|
||||||
|
|
||||||
public MoveData(String username, String characterName, Point pos) {
|
|
||||||
super("Move");
|
|
||||||
super.setPayload(this);
|
|
||||||
this.username = username;
|
|
||||||
this.characterName = characterName;
|
|
||||||
this.pos = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCharacterName() {
|
|
||||||
return characterName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point getPos() {
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.connection;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.connection;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public class NameData extends Data {
|
|
||||||
private final String name;
|
|
||||||
public NameData(String name) {
|
|
||||||
super("name");
|
|
||||||
super.setPayload(this);
|
|
||||||
this.name = name;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.connection;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public class PlayerConnectData extends Data {
|
|
||||||
private String username;
|
|
||||||
public PlayerConnectData(String username) {
|
|
||||||
super("player-connect");
|
|
||||||
this.username = username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.connection;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
import netwerkprog.game.util.game.Faction;
|
|
||||||
|
|
||||||
public class TeamData extends Data {
|
|
||||||
private final Faction faction;
|
|
||||||
private final String username;
|
|
||||||
|
|
||||||
public TeamData(Faction faction, String username) {
|
|
||||||
super("Team");
|
|
||||||
super.setPayload(this);
|
|
||||||
this.faction = faction;
|
|
||||||
this.username = username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Faction getFaction() {
|
|
||||||
return faction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
package netwerkprog.game.util.data.connection;
|
|
||||||
|
|
||||||
import netwerkprog.game.util.data.Data;
|
|
||||||
|
|
||||||
public class TurnData extends Data {
|
|
||||||
public TurnData() {
|
|
||||||
super("turn");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +1,29 @@
|
|||||||
package netwerkprog.game.util.game;
|
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.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
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.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public abstract class GameCharacter extends Actor implements Comparable<GameCharacter>, Serializable {
|
public abstract class GameCharacter extends Actor implements Comparable<GameCharacter> {
|
||||||
protected String name;
|
protected String name;
|
||||||
protected Faction faction;
|
protected Faction faction;
|
||||||
protected HashSet<Ability> abilities;
|
protected HashSet<Ability> abilities;
|
||||||
protected boolean override;
|
protected boolean override;
|
||||||
protected TextureRegion textureRegion;
|
protected TextureRegion textureRegion;
|
||||||
protected int health;
|
|
||||||
protected List<GameTile> allowedToMove;
|
|
||||||
protected boolean damageAnimation;
|
|
||||||
protected double hitTimout = 0;
|
|
||||||
|
|
||||||
public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) {
|
public GameCharacter(String name, Faction faction, TextureRegion textureRegion, Ability... abilities) {
|
||||||
super();
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.faction = faction;
|
this.faction = faction;
|
||||||
this.abilities = new HashSet<>(Arrays.asList(abilities));
|
this.abilities = new HashSet<>(Arrays.asList(abilities));
|
||||||
this.override = false;
|
this.override = false;
|
||||||
this.textureRegion = textureRegion;
|
this.textureRegion = textureRegion;
|
||||||
this.health = 100;
|
|
||||||
this.damageAnimation = false;
|
|
||||||
this.allowedToMove = new ArrayList<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
@@ -46,35 +38,6 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
this.abilities.remove(ability);
|
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 = 10;
|
|
||||||
}
|
|
||||||
public int getDamageAmount() {
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void damage(int amount) {
|
|
||||||
this.health -= amount;
|
|
||||||
if (this.health < 0) {
|
|
||||||
this.health = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.damageAnimation = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDead() {
|
|
||||||
return this.health <= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void changeControl() {
|
public void changeControl() {
|
||||||
this.override = !this.override;
|
this.override = !this.override;
|
||||||
}
|
}
|
||||||
@@ -99,17 +62,6 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
Objects.equals(abilities, character.abilities);
|
Objects.equals(abilities, character.abilities);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update(double deltaTime) {
|
|
||||||
if (this.damageAnimation) {
|
|
||||||
this.hitTimout += deltaTime;
|
|
||||||
}
|
|
||||||
if (this.hitTimout >= 0.4) {
|
|
||||||
this.damageAnimation = false;
|
|
||||||
this.hitTimout = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(name, faction, abilities, override);
|
return Objects.hash(name, faction, abilities, override);
|
||||||
@@ -117,7 +69,7 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(GameCharacter o) {
|
public int compareTo(GameCharacter o) {
|
||||||
return (this.health - o.health) + this.name.compareTo(o.name) + this.faction.compareTo(o.faction);
|
return this.name.compareTo(o.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -125,28 +77,6 @@ public abstract class GameCharacter extends Actor implements Comparable<GameChar
|
|||||||
return "GameCharacter{" +
|
return "GameCharacter{" +
|
||||||
"name='" + name + '\'' +
|
"name='" + name + '\'' +
|
||||||
", faction=" + faction +
|
", 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isShowingAnimation() {
|
|
||||||
return this.damageAnimation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setShowingDamageAnimation(boolean damageAnimation) {
|
|
||||||
this.damageAnimation = damageAnimation;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ public class FrameRate implements Disposable{
|
|||||||
long lastTimeCounted;
|
long lastTimeCounted;
|
||||||
private float sinceChange;
|
private float sinceChange;
|
||||||
private float frameRate;
|
private float frameRate;
|
||||||
private final BitmapFont font;
|
private BitmapFont font;
|
||||||
private final SpriteBatch batch;
|
private SpriteBatch batch;
|
||||||
private OrthographicCamera cam;
|
private OrthographicCamera cam;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package netwerkprog.game.util.graphics;
|
package netwerkprog.game.util.graphics;
|
||||||
|
|
||||||
public interface Renderable {
|
import netwerkprog.game.util.application.Updatable;
|
||||||
|
|
||||||
|
public interface Renderable extends Updatable {
|
||||||
void render();
|
void render();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
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 final BitmapFont font;
|
|
||||||
private final 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() {
|
|
||||||
try {
|
|
||||||
batch.dispose();
|
|
||||||
font.dispose();
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
System.out.println("There was an error disposing textRenderer: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +1,19 @@
|
|||||||
package netwerkprog.game.util.tree;
|
package netwerkprog.game.util.tree;
|
||||||
|
|
||||||
public abstract class AbstractTree<E> implements Tree<E> {
|
public abstract class AbstractTree<E> implements Tree<E> {
|
||||||
@Override /* Inorder traversal from the root*/
|
@Override /** Inorder traversal from the root*/
|
||||||
public void inorder() {
|
public void inorder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override /* Post order traversal from the root */
|
@Override /** Postorder traversal from the root */
|
||||||
public void postOrder() {
|
public void postorder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override /* Preorder traversal from the root */
|
@Override /** Preorder traversal from the root */
|
||||||
public void preorder() {
|
public void preorder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override /* Return true if the tree is empty */
|
@Override /** Return true if the tree is empty */
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return getSize() == 0;
|
return getSize() == 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,112 +1,117 @@
|
|||||||
package netwerkprog.game.util.tree;
|
package netwerkprog.game.util.tree;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
|
|
||||||
public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
||||||
protected TreeNode<E> root;
|
protected TreeNode<E> root;
|
||||||
protected int size = 0;
|
protected int size = 0;
|
||||||
|
|
||||||
|
// Helper methode
|
||||||
public int sum() {
|
public int sum () {
|
||||||
return this.sum(this.getRoot());
|
return this.sum(this.getRoot());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sum(TreeNode<E> node) {
|
// Opgave 1b (10 punten): Maak de recursieve methode sum af in de klasse bst.BST. Deze methode telt de getallen
|
||||||
|
// van alle elementen van de binaire zoekboom bij elkaar op. De methode geeft de totale som terug van alle getallen
|
||||||
|
// in de boom.
|
||||||
|
public int sum( TreeNode<E> node ) {
|
||||||
|
// Schrijf hier jouw code...
|
||||||
if (node == null) {
|
if (node == null) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nodeValue = (Integer) node.element;
|
int nodeValue = (Integer) node.element; // Tip, omdat E nog onbekend is doen we het zo (niet helemaal netjes)
|
||||||
return sum(node.left) + sum(node.right);
|
return sum(node.left) + sum(node.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper methode
|
||||||
public int totalLeaves() {
|
public int totalLeaves () {
|
||||||
return this.totalLeaves(this.getRoot());
|
return this.totalLeaves(this.getRoot());
|
||||||
}
|
}
|
||||||
|
// Opgave 1c (10 punten): Maak de methode totalLeaves af om de klasse bst.BST. Deze methode telt het aantal
|
||||||
public int totalLeaves(TreeNode<E> node) {
|
// bladeren (leaves) van de gegeven binaire zoekboom en geeft deze terug. Je hoeft deze methode niet recursief te
|
||||||
if (node == null) {
|
// implementeren. Het mag wel.
|
||||||
return 0;
|
public int totalLeaves ( TreeNode<E> node ) {
|
||||||
}
|
if (node == null) {
|
||||||
if (node.left == null && node.right == null) {
|
return 0;
|
||||||
return 1;
|
}
|
||||||
}
|
if (node.left == null && node.right == null) {
|
||||||
return totalLeaves(node.left) + totalLeaves(node.right);
|
return 1;
|
||||||
|
}
|
||||||
|
return totalLeaves(node.left) + totalLeaves(node.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Create a default binary tree */
|
||||||
* Create a default binary tree
|
|
||||||
*/
|
|
||||||
public BST() {
|
public BST() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Create a binary tree from an array of objects */
|
||||||
* Create a binary tree from an array of objects
|
|
||||||
*/
|
|
||||||
public BST(E[] objects) {
|
public BST(E[] objects) {
|
||||||
for (E object : objects) insert(object);
|
for (int i = 0; i < objects.length; i++)
|
||||||
|
insert(objects[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Returns true if the element is in the tree */
|
||||||
* Returns true if the element is in the tree
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean search(E e) {
|
public boolean search(E e) {
|
||||||
return search(e, root);
|
return search(e, root);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean search(E e, TreeNode<E> tree) {
|
private boolean search(E e, TreeNode<E> tree)
|
||||||
|
{
|
||||||
// nog niet correct
|
// nog niet correct
|
||||||
if (tree == null) {
|
if (tree == null)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (e.compareTo(tree.element) == 0) {
|
if (e.compareTo(tree.element) == 0)
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (e.compareTo(tree.element) < 0) {
|
if (e.compareTo(tree.element) < 0)
|
||||||
|
{
|
||||||
return search(e, tree.left);
|
return search(e, tree.left);
|
||||||
} else // (e.compareTo(tree.element) > 0)
|
}
|
||||||
|
|
||||||
|
else // (e.compareTo(tree.element) > 0)
|
||||||
{
|
{
|
||||||
return search(e, tree.right);
|
return search(e, tree.right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Insert element o into the binary tree
|
||||||
* Insert element o into the binary tree
|
* Return true if the element is inserted successfully */
|
||||||
* Return true if the element is inserted successfully
|
public boolean insert(E e) {
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void insert(E e) {
|
|
||||||
if (root == null) {
|
if (root == null) {
|
||||||
root = createNewNode(e); // Create a new root
|
root = createNewNode(e); // Create a new root
|
||||||
size++;
|
size++;
|
||||||
} else {
|
return true;
|
||||||
insert(e, root);
|
}
|
||||||
|
else {
|
||||||
|
return insert(e, root);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Insert element o into the binary tree
|
||||||
* Insert element o into the binary tree
|
|
||||||
* Return true if the element is inserted successfully
|
* Return true if the element is inserted successfully
|
||||||
* pre: root != null
|
pre: root != null
|
||||||
*/
|
*/
|
||||||
public boolean insert(E e, TreeNode<E> tree) {
|
public boolean insert(E e, TreeNode<E> tree) {
|
||||||
if (e.compareTo(tree.element) == 0) {
|
if (e.compareTo(tree.element) == 0) {
|
||||||
return false; // Duplicate node not inserted
|
return false; // Duplicate node not inserted
|
||||||
} else if (e.compareTo(tree.element) < 0 && tree.left != null)
|
}
|
||||||
|
else if (e.compareTo(tree.element) < 0 && tree.left != null)
|
||||||
return insert(e, tree.left);
|
return insert(e, tree.left);
|
||||||
|
|
||||||
else if (e.compareTo(tree.element) > 0 && tree.right != null)
|
else if (e.compareTo(tree.element) > 0 && tree.right != null)
|
||||||
return insert(e, tree.right);
|
return insert(e, tree.right);
|
||||||
|
|
||||||
// Create the new node and attach it to the parent node
|
// Create the new node and attach it to the parent node
|
||||||
else {
|
else {
|
||||||
if (e.compareTo(tree.element) < 0) {
|
if (e.compareTo(tree.element) < 0) {
|
||||||
tree.left = createNewNode(e);
|
tree.left = createNewNode(e);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
tree.right = createNewNode(e);
|
tree.right = createNewNode(e);
|
||||||
}
|
}
|
||||||
size++;
|
size++;
|
||||||
@@ -116,64 +121,50 @@ public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
|||||||
|
|
||||||
|
|
||||||
protected TreeNode<E> createNewNode(E e) {
|
protected TreeNode<E> createNewNode(E e) {
|
||||||
return new TreeNode<>(e);
|
return new TreeNode<E>(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Inorder traversal from the root*/
|
||||||
* Inorder traversal from the root
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void inorder() {
|
public void inorder() {
|
||||||
inorder(root);
|
inorder(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Inorder traversal from a subtree */
|
||||||
* Inorder traversal from a subtree
|
|
||||||
*/
|
|
||||||
protected void inorder(TreeNode<E> root) {
|
protected void inorder(TreeNode<E> root) {
|
||||||
if (root == null) return;
|
if (root == null) return;
|
||||||
inorder(root.left);
|
inorder(root.left);
|
||||||
|
System.out.print(root.element + " ");
|
||||||
inorder(root.right);
|
inorder(root.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Postorder traversal from the root */
|
||||||
* Post order traversal from the root
|
public void postorder() {
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void postOrder() {
|
|
||||||
postorder(root);
|
postorder(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Postorder traversal from a subtree */
|
||||||
* Post order traversal from a subtree
|
|
||||||
*/
|
|
||||||
protected void postorder(TreeNode<E> root) {
|
protected void postorder(TreeNode<E> root) {
|
||||||
if (root == null) return;
|
if (root == null) return;
|
||||||
postorder(root.left);
|
postorder(root.left);
|
||||||
postorder(root.right);
|
postorder(root.right);
|
||||||
|
System.out.print(root.element + " ");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Preorder traversal from the root */
|
||||||
* Preorder traversal from the root
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void preorder() {
|
public void preorder() {
|
||||||
preorder(root);
|
preorder(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Preorder traversal from a subtree */
|
||||||
* Preorder traversal from a subtree
|
|
||||||
*/
|
|
||||||
protected void preorder(TreeNode<E> root) {
|
protected void preorder(TreeNode<E> root) {
|
||||||
if (root == null) return;
|
if (root == null) return;
|
||||||
|
System.out.print(root.element + " ");
|
||||||
preorder(root.left);
|
preorder(root.left);
|
||||||
preorder(root.right);
|
preorder(root.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** This inner class is static, because it does not access
|
||||||
* This inner class is static, because it does not access
|
any instance members defined in its outer class */
|
||||||
* any instance members defined in its outer class
|
|
||||||
*/
|
|
||||||
public static class TreeNode<E extends Comparable<E>> {
|
public static class TreeNode<E extends Comparable<E>> {
|
||||||
protected E element;
|
protected E element;
|
||||||
protected TreeNode<E> left;
|
protected TreeNode<E> left;
|
||||||
@@ -184,49 +175,41 @@ public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Get the number of nodes in the tree */
|
||||||
* Get the number of nodes in the tree
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
public int getSize() {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Returns the root of the tree */
|
||||||
* Returns the root of the tree
|
|
||||||
*/
|
|
||||||
public TreeNode<E> getRoot() {
|
public TreeNode<E> getRoot() {
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Returns a path from the root leading to the specified element */
|
||||||
* Returns a path from the root leading to the specified element
|
public java.util.ArrayList<TreeNode<E>> path(E e) {
|
||||||
*/
|
java.util.ArrayList<TreeNode<E>> list =
|
||||||
public ArrayList<TreeNode<E>> path(E e) {
|
new java.util.ArrayList<TreeNode<E>>();
|
||||||
ArrayList<TreeNode<E>> list =
|
|
||||||
new ArrayList<>();
|
|
||||||
TreeNode<E> current = root; // Start from the root
|
TreeNode<E> current = root; // Start from the root
|
||||||
|
|
||||||
while (current != null) {
|
while (current != null) {
|
||||||
list.add(current); // Add the node to the list
|
list.add(current); // Add the node to the list
|
||||||
if (e.compareTo(current.element) < 0) {
|
if (e.compareTo(current.element) < 0) {
|
||||||
current = current.left;
|
current = current.left;
|
||||||
} else if (e.compareTo(current.element) > 0) {
|
}
|
||||||
|
else if (e.compareTo(current.element) > 0) {
|
||||||
current = current.right;
|
current = current.right;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return list; // Return an array list of nodes
|
return list; // Return an array list of nodes
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Delete an element from the binary tree.
|
||||||
* Delete an element from the binary tree.
|
|
||||||
* Return true if the element is deleted successfully
|
* Return true if the element is deleted successfully
|
||||||
* Return false if the element is not in the tree
|
* Return false if the element is not in the tree */
|
||||||
*/
|
public boolean delete(E e) {
|
||||||
@Override
|
|
||||||
public void delete(E e) {
|
|
||||||
// Locate the node to be deleted and also locate its parent node
|
// Locate the node to be deleted and also locate its parent node
|
||||||
TreeNode<E> parent = null;
|
TreeNode<E> parent = null;
|
||||||
TreeNode<E> current = root;
|
TreeNode<E> current = root;
|
||||||
@@ -234,28 +217,32 @@ public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
|||||||
if (e.compareTo(current.element) < 0) {
|
if (e.compareTo(current.element) < 0) {
|
||||||
parent = current;
|
parent = current;
|
||||||
current = current.left;
|
current = current.left;
|
||||||
} else if (e.compareTo(current.element) > 0) {
|
}
|
||||||
|
else if (e.compareTo(current.element) > 0) {
|
||||||
parent = current;
|
parent = current;
|
||||||
current = current.right;
|
current = current.right;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
break; // Element is in the tree pointed at by current
|
break; // Element is in the tree pointed at by current
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current == null)
|
if (current == null)
|
||||||
return; // Element is not in the tree
|
return false; // Element is not in the tree
|
||||||
|
|
||||||
// Case 1: current has no left child
|
// Case 1: current has no left child
|
||||||
if (current.left == null) {
|
if (current.left == null) {
|
||||||
// Connect the parent with the right child of the current node
|
// Connect the parent with the right child of the current node
|
||||||
if (parent == null) {
|
if (parent == null) {
|
||||||
root = current.right;
|
root = current.right;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (e.compareTo(parent.element) < 0)
|
if (e.compareTo(parent.element) < 0)
|
||||||
parent.left = current.right;
|
parent.left = current.right;
|
||||||
else
|
else
|
||||||
parent.right = current.right;
|
parent.right = current.right;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
// Case 2: The current node has a left child
|
// Case 2: The current node has a left child
|
||||||
// Locate the rightmost node in the left subtree of
|
// Locate the rightmost node in the left subtree of
|
||||||
// the current node and also its parent
|
// the current node and also its parent
|
||||||
@@ -274,17 +261,15 @@ public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
|||||||
if (parentOfRightMost.right == rightMost)
|
if (parentOfRightMost.right == rightMost)
|
||||||
parentOfRightMost.right = rightMost.left;
|
parentOfRightMost.right = rightMost.left;
|
||||||
else
|
else
|
||||||
// Special case: parentOfRightMost == current
|
// Special case: parentOfRightMost == current
|
||||||
parentOfRightMost.left = rightMost.left;
|
parentOfRightMost.left = rightMost.left;
|
||||||
}
|
}
|
||||||
|
|
||||||
size--;
|
size--;
|
||||||
|
return true; // Element deleted successfully
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Obtain an iterator. Use inorder. */
|
||||||
* Obtain an iterator. Use inorder.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public java.util.Iterator<E> iterator() {
|
public java.util.Iterator<E> iterator() {
|
||||||
return new InorderIterator();
|
return new InorderIterator();
|
||||||
}
|
}
|
||||||
@@ -292,51 +277,41 @@ public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
|||||||
// Inner class InorderIterator
|
// Inner class InorderIterator
|
||||||
private class InorderIterator implements java.util.Iterator<E> {
|
private class InorderIterator implements java.util.Iterator<E> {
|
||||||
// Store the elements in a list
|
// Store the elements in a list
|
||||||
private final java.util.ArrayList<E> list =
|
private java.util.ArrayList<E> list =
|
||||||
new java.util.ArrayList<>();
|
new java.util.ArrayList<E>();
|
||||||
private int current = 0; // Point to the current element in list
|
private int current = 0; // Point to the current element in list
|
||||||
|
|
||||||
public InorderIterator() {
|
public InorderIterator() {
|
||||||
inorder(); // Traverse binary tree and store elements in list
|
inorder(); // Traverse binary tree and store elements in list
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Inorder traversal from the root*/
|
||||||
* Inorder traversal from the root
|
|
||||||
*/
|
|
||||||
private void inorder() {
|
private void inorder() {
|
||||||
inorder(root);
|
inorder(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Inorder traversal from a subtree */
|
||||||
* Inorder traversal from a subtree
|
|
||||||
*/
|
|
||||||
private void inorder(TreeNode<E> root) {
|
private void inorder(TreeNode<E> root) {
|
||||||
if (root == null) return;
|
if (root == null)return;
|
||||||
inorder(root.left);
|
inorder(root.left);
|
||||||
list.add(root.element);
|
list.add(root.element);
|
||||||
inorder(root.right);
|
inorder(root.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** More elements for traversing? */
|
||||||
* More elements for traversing?
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return current < list.size();
|
if (current < list.size())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Get the current element and move to the next */
|
||||||
* Get the current element and move to the next
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public E next() {
|
public E next() {
|
||||||
return list.get(current++);
|
return list.get(current++);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override /** Remove the current element */
|
||||||
* Remove the current element
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void remove() {
|
public void remove() {
|
||||||
delete(list.get(current)); // Delete the current element
|
delete(list.get(current)); // Delete the current element
|
||||||
list.clear(); // Clear the list
|
list.clear(); // Clear the list
|
||||||
@@ -344,24 +319,23 @@ public class BST<E extends Comparable<E>> extends AbstractTree<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Remove all elements from the tree */
|
||||||
* Remove all elements from the tree
|
|
||||||
*/
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
root = null;
|
root = null;
|
||||||
size = 0;
|
size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// if (tree == null) {
|
||||||
public String toString() {
|
// return false;
|
||||||
StringBuilder res = new StringBuilder();
|
// }
|
||||||
for (E e : this) {
|
// else if (e.compareTo(tree.element) > 0) {
|
||||||
res.append(e.toString());
|
// return search(e, tree.right);
|
||||||
}
|
// }
|
||||||
return "BST{" +
|
// else if (e.compareTo(tree.element) < 0) {
|
||||||
"root=" + root +
|
// return search(e, tree.left);
|
||||||
", size=" + size +
|
// }
|
||||||
", " + res +
|
// else {
|
||||||
'}';
|
// return true;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,17 +6,17 @@ public interface Tree<E> extends Iterable<E> {
|
|||||||
|
|
||||||
/** Insert element o into the binary tree
|
/** Insert element o into the binary tree
|
||||||
* Return true if the element is inserted successfully */
|
* Return true if the element is inserted successfully */
|
||||||
public void insert(E e);
|
public boolean insert(E e);
|
||||||
|
|
||||||
/** Delete the specified element from the tree
|
/** Delete the specified element from the tree
|
||||||
* Return true if the element is deleted successfully */
|
* Return true if the element is deleted successfully */
|
||||||
public void delete(E e);
|
public boolean delete(E e);
|
||||||
|
|
||||||
/** Inorder traversal from the root*/
|
/** Inorder traversal from the root*/
|
||||||
public void inorder();
|
public void inorder();
|
||||||
|
|
||||||
/** Postorder traversal from the root */
|
/** Postorder traversal from the root */
|
||||||
public void postOrder();
|
public void postorder();
|
||||||
|
|
||||||
/** Preorder traversal from the root */
|
/** Preorder traversal from the root */
|
||||||
public void preorder();
|
public void preorder();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import netwerkprog.game.server.SessionController;
|
import netwerkprog.game.server.controllers.SessionController;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class RestartSessionControllerTest {
|
public class RestartSessionControllerTest {
|
||||||
@@ -23,6 +23,7 @@ public class RestartSessionControllerTest {
|
|||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
System.out.println(sessionThread.getState());
|
||||||
sessionThread = new Thread(sessionController);
|
sessionThread = new Thread(sessionController);
|
||||||
sessionThread.start();
|
sessionThread.start();
|
||||||
}
|
}
|
||||||
|
|||||||