mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 06:18:44 +00:00
Action packets now sent at regular 20ms intervals
#issue[38] #implement
This commit is contained in:
@@ -67,8 +67,6 @@ public class App extends Application {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage primaryStage) throws Exception {
|
public void start(Stage primaryStage) throws Exception {
|
||||||
PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv"));
|
|
||||||
|
|
||||||
Parent root = FXMLLoader.load(getClass().getResource("/views/StartScreenView.fxml"));
|
Parent root = FXMLLoader.load(getClass().getResource("/views/StartScreenView.fxml"));
|
||||||
primaryStage.setTitle("RaceVision");
|
primaryStage.setTitle("RaceVision");
|
||||||
Scene scene = new Scene(root, 1530, 960);
|
Scene scene = new Scene(root, 1530, 960);
|
||||||
|
|||||||
@@ -49,10 +49,8 @@ public class GameState implements Runnable {
|
|||||||
players = new ArrayList<>();
|
players = new ArrayList<>();
|
||||||
currentStage = GameStages.LOBBYING;
|
currentStage = GameStages.LOBBYING;
|
||||||
isRaceStarted = false;
|
isRaceStarted = false;
|
||||||
yachts = new HashMap<>();
|
|
||||||
//set this when game stage changes to prerace
|
//set this when game stage changes to prerace
|
||||||
previousUpdateTime = System.currentTimeMillis();
|
previousUpdateTime = System.currentTimeMillis();
|
||||||
yachts = new HashMap<>();
|
|
||||||
|
|
||||||
new Thread(this).start();
|
new Thread(this).start();
|
||||||
}
|
}
|
||||||
@@ -67,7 +65,8 @@ public class GameState implements Runnable {
|
|||||||
|
|
||||||
public static void addPlayer(Player player) {
|
public static void addPlayer(Player player) {
|
||||||
players.add(player);
|
players.add(player);
|
||||||
String playerText = player.getYacht().getSourceId() + " " + player.getYacht().getBoatName() + " " + player.getYacht().getCountry();
|
String playerText = player.getYacht().getSourceId() + " " + player.getYacht().getBoatName()
|
||||||
|
+ " " + player.getYacht().getCountry();
|
||||||
playerStringMap.put(player, playerText);
|
playerStringMap.put(player, playerText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class HeartbeatThread extends Thread{
|
|||||||
*/
|
*/
|
||||||
private void sendHeartbeatToAllPlayers(){
|
private void sendHeartbeatToAllPlayers(){
|
||||||
Message heartbeat = new Heartbeat(seqNum);
|
Message heartbeat = new Heartbeat(seqNum);
|
||||||
|
System.out.println(GameState.getPlayers());
|
||||||
for (Player player : GameState.getPlayers()){
|
for (Player player : GameState.getPlayers()){
|
||||||
if (!player.getSocket().isConnected()) {
|
if (!player.getSocket().isConnected()) {
|
||||||
playerLostConnection(player);
|
playerLostConnection(player);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.util.Observable;
|
|||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
import seng302.model.Player;
|
import seng302.model.Player;
|
||||||
|
import seng302.model.PolarTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class describing the overall server, which creates and collects server threads for each client
|
* A class describing the overall server, which creates and collects server threads for each client
|
||||||
@@ -31,7 +32,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
serverLog("IO error in server thread handler upon trying to make new server socket", 0);
|
serverLog("IO error in server thread handler upon trying to make new server socket", 0);
|
||||||
}
|
}
|
||||||
|
PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv"));
|
||||||
terminated = false;
|
terminated = false;
|
||||||
thread = new Thread(this);
|
thread = new Thread(this);
|
||||||
thread.start();
|
thread.start();
|
||||||
|
|||||||
@@ -71,8 +71,6 @@ public final class PolarTable {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.out.println("[PolarTable] IO exception");
|
System.out.println("[PolarTable] IO exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -155,7 +153,6 @@ public final class PolarTable {
|
|||||||
public static Double getClosestWindSpeedInPolar(Double thisWindSpeed) {
|
public static Double getClosestWindSpeedInPolar(Double thisWindSpeed) {
|
||||||
Double smallestDif = Double.POSITIVE_INFINITY;
|
Double smallestDif = Double.POSITIVE_INFINITY;
|
||||||
Double closestWind = 0d;
|
Double closestWind = 0d;
|
||||||
|
|
||||||
for (Double polarWindSpeed : polarTable.keySet()) {
|
for (Double polarWindSpeed : polarTable.keySet()) {
|
||||||
Double difference = Math.abs(polarWindSpeed - thisWindSpeed);
|
Double difference = Math.abs(polarWindSpeed - thisWindSpeed);
|
||||||
if (difference < smallestDif) {
|
if (difference < smallestDif) {
|
||||||
|
|||||||
@@ -1,24 +1,18 @@
|
|||||||
package seng302.visualiser.ClientToServerTests;
|
package seng302.visualiser.ClientToServerTests;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.util.ArrayList;
|
||||||
import javafx.application.Platform;
|
import org.junit.After;
|
||||||
import javafx.scene.Scene;
|
|
||||||
import javafx.scene.input.KeyCode;
|
|
||||||
import javafx.scene.input.KeyEvent;
|
|
||||||
import javafx.scene.layout.Pane;
|
|
||||||
import javafx.stage.Stage;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.FixMethodOrder;
|
import org.junit.FixMethodOrder;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runners.MethodSorters;
|
import org.junit.runners.MethodSorters;
|
||||||
import org.testfx.api.FxToolkit;
|
|
||||||
import seng302.gameServer.GameStages;
|
import seng302.gameServer.GameStages;
|
||||||
import seng302.gameServer.GameState;
|
import seng302.gameServer.GameState;
|
||||||
import seng302.gameServer.MainServerThread;
|
import seng302.gameServer.MainServerThread;
|
||||||
|
import seng302.gameServer.server.messages.BoatActionType;
|
||||||
import seng302.model.Yacht;
|
import seng302.model.Yacht;
|
||||||
import seng302.visualiser.ClientToServerThread;
|
import seng302.visualiser.ClientToServerThread;
|
||||||
import seng302.visualiser.GameClient;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test for checking how regularly packets are sent from ClientToServer Thread.
|
* Test for checking how regularly packets are sent from ClientToServer Thread.
|
||||||
@@ -27,87 +21,59 @@ import seng302.visualiser.GameClient;
|
|||||||
public class RegularPacketsTest {
|
public class RegularPacketsTest {
|
||||||
|
|
||||||
private MainServerThread serverThread;
|
private MainServerThread serverThread;
|
||||||
private GameClient gameClient;
|
private ClientToServerThread clientThread;
|
||||||
private Pane pane;
|
|
||||||
private Scene scene;
|
|
||||||
private Stage stage;
|
|
||||||
|
|
||||||
// @BeforeClass
|
|
||||||
// public static void preSetup() throws Exception {
|
|
||||||
// FxToolkit toolkit = FxToolkit.registerPrimaryStage();
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
stage = FxToolkit.registerPrimaryStage();
|
new GameState("localhost");
|
||||||
Platform.runLater(() -> {
|
serverThread = new MainServerThread();
|
||||||
pane = new Pane();
|
clientThread = new ClientToServerThread("localhost", 4942);
|
||||||
scene = new Scene(pane);
|
|
||||||
stage.setScene(scene);
|
|
||||||
});
|
|
||||||
while (stage != null && pane != null && scene != null && stage.getScene() != null);
|
|
||||||
gameClient = new GameClient(pane);
|
|
||||||
gameClient.runAsHost("localhost", 4942);
|
|
||||||
Field server = gameClient.getClass().getDeclaredField("server");
|
|
||||||
server.setAccessible(true);
|
|
||||||
serverThread = (MainServerThread) server.get(gameClient);
|
|
||||||
GameState.setCurrentStage(GameStages.RACING);
|
GameState.setCurrentStage(GameStages.RACING);
|
||||||
serverThread.startGame();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void Test1PacketsSentAtRegularIntervals () throws Exception {
|
public void Test1PacketsSentAtRegularIntervals () throws Exception {
|
||||||
Yacht yacht = GameState.getYachts().get(0);
|
final double TEST_DISTANCE = 10.0;
|
||||||
|
serverThread.startGame();
|
||||||
|
SleepThreadMaxDelay();
|
||||||
|
Yacht yacht = new ArrayList<>(GameState.getYachts().values()).get(0);
|
||||||
double startAngle = yacht.getHeading();
|
double startAngle = yacht.getHeading();
|
||||||
KeyEvent keyPress = new KeyEvent(null, scene,
|
|
||||||
KeyEvent.KEY_PRESSED, "page_up", "page_up", KeyCode.PAGE_UP,
|
|
||||||
false, false, false, false
|
|
||||||
);
|
|
||||||
KeyEvent keyRelease = new KeyEvent(null, scene,
|
|
||||||
KeyEvent.KEY_RELEASED, "page_up", "page_up", KeyCode.PAGE_UP,
|
|
||||||
false, false, false, false
|
|
||||||
);
|
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
pane.fireEvent(keyPress);
|
clientThread.sendBoatEvent(BoatActionType.UPWIND);
|
||||||
while (yacht.getHeading() - startAngle > 100);
|
Thread.sleep(200);
|
||||||
pane.fireEvent(keyRelease);
|
while (Math.abs(yacht.getHeading() - startAngle) < TEST_DISTANCE) {
|
||||||
|
//Wait for yacht to move
|
||||||
|
}
|
||||||
|
clientThread.sendBoatEvent(BoatActionType.MAINTAIN_HEADING);
|
||||||
long endTime = System.currentTimeMillis();
|
long endTime = System.currentTimeMillis();
|
||||||
SleepThreadMaxDelay(); //Allowed to be two loops of delay due to loop delay and processing delay at client + server ends.
|
SleepThreadMaxDelay();
|
||||||
Assert.assertEquals(100 / Yacht.TURN_STEP * ClientToServerThread.PACKET_SENDING_INTERVAL_MS,
|
//Allowed to be two loops of delay due to loop delay and processing delay at client + server ends.
|
||||||
endTime - startTime / (100 / Yacht.TURN_STEP), 2 * ClientToServerThread.PACKET_SENDING_INTERVAL_MS);
|
Assert.assertEquals(TEST_DISTANCE / Yacht.TURN_STEP * ClientToServerThread.PACKET_SENDING_INTERVAL_MS,
|
||||||
|
(endTime - startTime), 2 * ClientToServerThread.PACKET_SENDING_INTERVAL_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void Test2ArbitraryPacketSentOnRelease() throws Exception {
|
public void Test2ArbitraryPacketSentOnRelease() throws Exception {
|
||||||
KeyEvent keyPress = new KeyEvent(null, scene,
|
serverThread.startGame();
|
||||||
KeyEvent.KEY_PRESSED, "shift", "shift", KeyCode.SHIFT,
|
SleepThreadMaxDelay();
|
||||||
false, false, false, false
|
Yacht yacht = new ArrayList<>(GameState.getYachts().values()).get(0);
|
||||||
);
|
|
||||||
KeyEvent keyRelease = new KeyEvent(null, scene,
|
|
||||||
KeyEvent.KEY_RELEASED, "shift", "shift", KeyCode.SHIFT,
|
|
||||||
false, false, false, false
|
|
||||||
);
|
|
||||||
Yacht yacht = GameState.getYachts().get(0);
|
|
||||||
boolean startState = yacht.getSailIn();
|
boolean startState = yacht.getSailIn();
|
||||||
pane.fireEvent(keyPress);
|
clientThread.sendBoatEvent(BoatActionType.SAILS_IN);
|
||||||
pane.fireEvent(keyRelease);
|
|
||||||
SleepThreadMaxDelay();
|
SleepThreadMaxDelay();
|
||||||
Assert.assertEquals(startState, !yacht.getSailIn());
|
Assert.assertEquals(startState, !yacht.getSailIn());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void Test3ArbitraryPacketSentOnPress() throws Exception {
|
public void Test3ArbitraryPacketSentOnPress() throws Exception {
|
||||||
KeyEvent keyPress = new KeyEvent(null, scene,
|
serverThread.startGame();
|
||||||
KeyEvent.KEY_PRESSED, "space", "space", KeyCode.SPACE,
|
SleepThreadMaxDelay();
|
||||||
false, false, false, false
|
Yacht yacht = new ArrayList<>(GameState.getYachts().values()).get(0);
|
||||||
);
|
|
||||||
Yacht yacht = GameState.getYachts().get(0);
|
|
||||||
double heading = yacht.getHeading();
|
double heading = yacht.getHeading();
|
||||||
double windDirection = GameState.getWindDirection();
|
double windDirection = GameState.getWindDirection();
|
||||||
Yacht testYacht = new Yacht("", 0, "", "", "", "");
|
Yacht testYacht = new Yacht("", 0, "", "", "", "");
|
||||||
testYacht.setHeading(heading);
|
testYacht.setHeading(heading);
|
||||||
testYacht.tackGybe(windDirection);
|
testYacht.tackGybe(windDirection);
|
||||||
pane.fireEvent(keyPress);
|
clientThread.sendBoatEvent(BoatActionType.TACK_GYBE);
|
||||||
SleepThreadMaxDelay();
|
SleepThreadMaxDelay();
|
||||||
Assert.assertEquals(testYacht.getHeading(), yacht.getHeading(), 1);
|
Assert.assertEquals(testYacht.getHeading(), yacht.getHeading(), 1);
|
||||||
}
|
}
|
||||||
@@ -120,4 +86,11 @@ public class RegularPacketsTest {
|
|||||||
private void SleepThreadMaxDelay() throws Exception {
|
private void SleepThreadMaxDelay() throws Exception {
|
||||||
Thread.sleep(200);
|
Thread.sleep(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void teardown () {
|
||||||
|
serverThread.terminate();
|
||||||
|
clientThread.setSocketToClose();
|
||||||
|
GameState.setCurrentStage(GameStages.LOBBYING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user