Fixed bug where closing glwindow as client crashed.
Server bug is still present.
This commit is contained in:
@@ -23,7 +23,6 @@ public:
|
|||||||
~Client();
|
~Client();
|
||||||
void Start(World* world, EventBroker* eventBroker);
|
void Start(World* world, EventBroker* eventBroker);
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Threaded
|
// Threaded
|
||||||
void ReadFromServer();
|
void ReadFromServer();
|
||||||
@@ -50,12 +49,14 @@ private:
|
|||||||
World* m_World;
|
World* m_World;
|
||||||
int m_PlayerID = -1;
|
int m_PlayerID = -1;
|
||||||
glm::vec2 m_PlayerPositions[MAXCONNECTIONS];
|
glm::vec2 m_PlayerPositions[MAXCONNECTIONS];
|
||||||
//std::string m_PlayerNames[MAXCONNECTIONS];
|
|
||||||
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
||||||
std::clock_t m_StartPingTime;
|
std::clock_t m_StartPingTime;
|
||||||
double m_DurationOfPingTime;
|
double m_DurationOfPingTime;
|
||||||
std::string m_PlayerName;
|
std::string m_PlayerName;
|
||||||
bool m_ThreadIsRunning = true;
|
bool m_ThreadIsRunning = true;
|
||||||
|
// Use to check if we should send disconnect message
|
||||||
|
// if game is turned of by closing window.
|
||||||
|
bool m_WasStarted = false;
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
|
|||||||
@@ -18,10 +18,11 @@ Client::~Client()
|
|||||||
void Client::Start(World* world, EventBroker* eventBroker)
|
void Client::Start(World* world, EventBroker* eventBroker)
|
||||||
{
|
{
|
||||||
// Subscribe to events
|
// Subscribe to events
|
||||||
m_EventBroker = eventBroker;
|
m_WasStarted = true;
|
||||||
|
m_EventBroker = eventBroker;
|
||||||
m_World = world;
|
m_World = world;
|
||||||
m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1));
|
m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1));
|
||||||
m_EventBroker->Subscribe(m_EKeyDown);
|
m_EventBroker->Subscribe(m_EKeyDown);
|
||||||
std::cout << "Please enter you name: ";
|
std::cout << "Please enter you name: ";
|
||||||
std::cin >> m_PlayerName;
|
std::cin >> m_PlayerName;
|
||||||
while (m_PlayerName.size() > 7) {
|
while (m_PlayerName.size() > 7) {
|
||||||
@@ -30,15 +31,16 @@ void Client::Start(World* world, EventBroker* eventBroker)
|
|||||||
}
|
}
|
||||||
m_Socket.connect(m_ReceiverEndpoint);
|
m_Socket.connect(m_ReceiverEndpoint);
|
||||||
std::cout << "I am client. BIP BOP\n";
|
std::cout << "I am client. BIP BOP\n";
|
||||||
|
|
||||||
ReadFromServer();
|
ReadFromServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::Close()
|
void Client::Close()
|
||||||
{
|
{
|
||||||
Disconnect();
|
if (m_WasStarted) {
|
||||||
m_ThreadIsRunning = false;
|
Disconnect();
|
||||||
m_Socket.close();
|
m_ThreadIsRunning = false;
|
||||||
|
m_EventBroker->Unsubscribe(m_EKeyDown);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::ReadFromServer()
|
void Client::ReadFromServer()
|
||||||
|
|||||||
@@ -28,36 +28,11 @@ void Server::Start(World* world)
|
|||||||
|
|
||||||
void Server::DisplayLoop()
|
void Server::DisplayLoop()
|
||||||
{
|
{
|
||||||
int lengthOfMessage = -1;
|
|
||||||
std::clock_t previousePingMessage = std::clock();
|
|
||||||
std::clock_t previousSnapshotMessage = std::clock();
|
|
||||||
std::clock_t timOutTimer = std::clock();
|
|
||||||
int intervallMs = 1000;
|
|
||||||
int snapshotInterval = 50;
|
|
||||||
int timeToCheckTimeOutTime = 100;
|
|
||||||
char* data;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
std::clock_t currentTime = std::clock();
|
|
||||||
// int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC);
|
|
||||||
// Send snapshot
|
|
||||||
if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) {
|
|
||||||
SendSnapshot();
|
|
||||||
previousSnapshotMessage = currentTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send pings each
|
|
||||||
if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) {
|
|
||||||
SendPing();
|
|
||||||
previousePingMessage = currentTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Time out logic
|
|
||||||
if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) {
|
|
||||||
CheckForTimeOuts();
|
|
||||||
timOutTimer = currentTime;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,6 +40,14 @@ void Server::ReadFromClients()
|
|||||||
{
|
{
|
||||||
char readBuf[1024] = { 0 };
|
char readBuf[1024] = { 0 };
|
||||||
int bytesRead = 0;
|
int bytesRead = 0;
|
||||||
|
// time for previouse message
|
||||||
|
std::clock_t previousePingMessage = std::clock();
|
||||||
|
std::clock_t previousSnapshotMessage = std::clock();
|
||||||
|
std::clock_t timOutTimer = std::clock();
|
||||||
|
// How offen we send messages (milliseconds)
|
||||||
|
int intervallMs = 1000;
|
||||||
|
int snapshotInterval = 50;
|
||||||
|
int timeToCheckTimeOutTime = 100;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (m_Socket.available()) {
|
if (m_Socket.available()) {
|
||||||
@@ -77,6 +60,26 @@ void Server::ReadFromClients()
|
|||||||
std::cout << "Read from client crashed: " << err.what();
|
std::cout << "Read from client crashed: " << err.what();
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::clock_t currentTime = std::clock();
|
||||||
|
// int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC);
|
||||||
|
// Send snapshot
|
||||||
|
if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) {
|
||||||
|
SendSnapshot();
|
||||||
|
previousSnapshotMessage = currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send pings each
|
||||||
|
if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) {
|
||||||
|
SendPing();
|
||||||
|
previousePingMessage = currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Time out logic
|
||||||
|
if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) {
|
||||||
|
CheckForTimeOuts();
|
||||||
|
timOutTimer = currentTime;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,24 +302,24 @@ void Server::ParseEvent(char * data, size_t length)
|
|||||||
unsigned int entityId = m_PlayerDefinitions[i].EntityID;
|
unsigned int entityId = m_PlayerDefinitions[i].EntityID;
|
||||||
if ("+Forward" == std::string(data)) {
|
if ("+Forward" == std::string(data)) {
|
||||||
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
||||||
temp.z -= 0.5f;
|
temp.z -= 0.1f;
|
||||||
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
||||||
}
|
}
|
||||||
if ("-Forward" == std::string(data)) {
|
if ("-Forward" == std::string(data)) {
|
||||||
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
||||||
temp.z += 0.5f;
|
temp.z += 0.1f;
|
||||||
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("+Right" == std::string(data)) {
|
if ("+Right" == std::string(data)) {
|
||||||
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
||||||
temp.x += 0.5f;
|
temp.x += 0.1f;
|
||||||
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("-Right" == std::string(data)) {
|
if ("-Right" == std::string(data)) {
|
||||||
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
||||||
temp.x -= 0.5f;
|
temp.x -= 0.1f;
|
||||||
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -340,6 +343,7 @@ void Server::ParseConnect(char * data, size_t length)
|
|||||||
transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f);
|
transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f);
|
||||||
ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Model");
|
ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Model");
|
||||||
model["Resource"] = "Models/Core/UnitSphere.obj";
|
model["Resource"] = "Models/Core/UnitSphere.obj";
|
||||||
|
model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f);
|
||||||
|
|
||||||
m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint;
|
m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint;
|
||||||
m_PlayerDefinitions[i].Name = std::string(data);
|
m_PlayerDefinitions[i].Name = std::string(data);
|
||||||
|
|||||||
+3
-2
@@ -41,15 +41,16 @@ Game::Game(int argc, char* argv[])
|
|||||||
// TEMP: Invoke network
|
// TEMP: Invoke network
|
||||||
|
|
||||||
boost::thread workerThread(&Game::NetworkFunction, this);
|
boost::thread workerThread(&Game::NetworkFunction, this);
|
||||||
|
|
||||||
m_LastTime = glfwGetTime();
|
m_LastTime = glfwGetTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
Game::~Game()
|
Game::~Game()
|
||||||
{
|
{
|
||||||
|
// Call before to ensure that thread closes correctly.
|
||||||
|
m_Client.Close();
|
||||||
|
|
||||||
delete m_FrameStack;
|
delete m_FrameStack;
|
||||||
delete m_EventBroker;
|
delete m_EventBroker;
|
||||||
m_Client.Close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::Tick()
|
void Game::Tick()
|
||||||
|
|||||||
Reference in New Issue
Block a user