Network now runs on it's own thread.
Network now sends Disconnect message when game is terminated.
This commit is contained in:
@@ -18,6 +18,7 @@ public:
|
|||||||
Client();
|
Client();
|
||||||
~Client();
|
~Client();
|
||||||
void Start();
|
void Start();
|
||||||
|
void Close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Threaded
|
// Threaded
|
||||||
@@ -27,6 +28,7 @@ private:
|
|||||||
|
|
||||||
int Receive(char* data, size_t length);
|
int Receive(char* data, size_t length);
|
||||||
int CreateMessage(MessageType type, std::string message, char* data);
|
int CreateMessage(MessageType type, std::string message, char* data);
|
||||||
|
void Disconnect();
|
||||||
void MoveMessageHead(char*& data, size_t& length, size_t stepSize);
|
void MoveMessageHead(char*& data, size_t& length, size_t stepSize);
|
||||||
void ParseMessageType(char* data, size_t length);
|
void ParseMessageType(char* data, size_t length);
|
||||||
void ParseEventMessage(char* data, size_t length);
|
void ParseEventMessage(char* data, size_t length);
|
||||||
@@ -51,6 +53,7 @@ private:
|
|||||||
double m_DurationOfPingTime;
|
double m_DurationOfPingTime;
|
||||||
bool m_ShouldDrawGameBoard = true;
|
bool m_ShouldDrawGameBoard = true;
|
||||||
std::string m_PlayerName;
|
std::string m_PlayerName;
|
||||||
|
bool m_ThreadIsRunning = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
#include "Core/InputManager.h"
|
#include "Core/InputManager.h"
|
||||||
#include "GUI/Frame.h"
|
#include "GUI/Frame.h"
|
||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
|
// Network
|
||||||
|
#include <boost/thread.hpp>
|
||||||
|
#include "Network/Client.h"
|
||||||
|
|
||||||
class Game
|
class Game
|
||||||
{
|
{
|
||||||
@@ -26,6 +29,13 @@ private:
|
|||||||
InputManager* m_InputManager;
|
InputManager* m_InputManager;
|
||||||
GUI::Frame* m_FrameStack;
|
GUI::Frame* m_FrameStack;
|
||||||
World* m_World;
|
World* m_World;
|
||||||
|
// Network viriables
|
||||||
|
boost::thread m_NetworkThread;
|
||||||
|
Client m_Client;
|
||||||
|
|
||||||
|
// Network methods
|
||||||
|
void NetworkFunction();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ void Client::Start()
|
|||||||
threads.join_all();
|
threads.join_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::Close()
|
||||||
|
{
|
||||||
|
Disconnect();
|
||||||
|
m_ThreadIsRunning = false;
|
||||||
|
}
|
||||||
|
|
||||||
void Client::InputLoop()
|
void Client::InputLoop()
|
||||||
{
|
{
|
||||||
int intervallMs = 33; // ~30 times per second
|
int intervallMs = 33; // ~30 times per second
|
||||||
@@ -56,7 +62,7 @@ void Client::InputLoop()
|
|||||||
std::clock_t previousInputTime = std::clock();
|
std::clock_t previousInputTime = std::clock();
|
||||||
std::clock_t previousCommandTime = std::clock();
|
std::clock_t previousCommandTime = std::clock();
|
||||||
|
|
||||||
while (true) {
|
while (m_ThreadIsRunning) {
|
||||||
|
|
||||||
std::clock_t currentTime = std::clock();
|
std::clock_t currentTime = std::clock();
|
||||||
int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC);
|
int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC);
|
||||||
@@ -77,7 +83,7 @@ void Client::InputLoop()
|
|||||||
|
|
||||||
void Client::DisplayLoop()
|
void Client::DisplayLoop()
|
||||||
{
|
{
|
||||||
while (true) {
|
while (m_ThreadIsRunning) {
|
||||||
// Update gameboard
|
// Update gameboard
|
||||||
for (size_t i = 0; i < BOARDSIZE; i++) {
|
for (size_t i = 0; i < BOARDSIZE; i++) {
|
||||||
for (size_t j = 0; j < BOARDSIZE; j++) {
|
for (size_t j = 0; j < BOARDSIZE; j++) {
|
||||||
@@ -95,7 +101,7 @@ void Client::ReadFromServer()
|
|||||||
int bytesRead = -1;
|
int bytesRead = -1;
|
||||||
char readBuf[1024] = { 0 };
|
char readBuf[1024] = { 0 };
|
||||||
|
|
||||||
for (;;) {
|
while (m_ThreadIsRunning) {
|
||||||
if (m_Socket.available()) {
|
if (m_Socket.available()) {
|
||||||
bytesRead = Receive(readBuf, INPUTSIZE);
|
bytesRead = Receive(readBuf, INPUTSIZE);
|
||||||
ParseMessageType(readBuf, bytesRead);
|
ParseMessageType(readBuf, bytesRead);
|
||||||
@@ -244,6 +250,16 @@ int Client::CreateMessage(MessageType type, std::string message, char* data)
|
|||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::Disconnect()
|
||||||
|
{
|
||||||
|
char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled
|
||||||
|
int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage);
|
||||||
|
m_Socket.send_to(boost::asio::buffer(
|
||||||
|
dataPackage,
|
||||||
|
len),
|
||||||
|
m_ReceiverEndpoint, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize)
|
void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize)
|
||||||
{
|
{
|
||||||
data += stepSize;
|
data += stepSize;
|
||||||
@@ -310,11 +326,7 @@ void Client::SendInput()
|
|||||||
m_ReceiverEndpoint, 0);
|
m_ReceiverEndpoint, 0);
|
||||||
}
|
}
|
||||||
if (GetAsyncKeyState('V')) {
|
if (GetAsyncKeyState('V')) {
|
||||||
int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage);
|
Disconnect();
|
||||||
m_Socket.send_to(boost::asio::buffer(
|
|
||||||
dataPackage,
|
|
||||||
len),
|
|
||||||
m_ReceiverEndpoint, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(dataPackage, 0, INPUTSIZE);
|
memset(dataPackage, 0, INPUTSIZE);
|
||||||
|
|||||||
+12
-8
@@ -1,6 +1,5 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "HardcodedTestWorld.h"
|
#include "HardcodedTestWorld.h"
|
||||||
#include "Network/Client.h"
|
|
||||||
|
|
||||||
Game::Game(int argc, char* argv[])
|
Game::Game(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
@@ -38,13 +37,7 @@ Game::Game(int argc, char* argv[])
|
|||||||
m_World = new HardcodedTestWorld();
|
m_World = new HardcodedTestWorld();
|
||||||
|
|
||||||
// TEMP: Invoke network
|
// TEMP: Invoke network
|
||||||
std::string inputMessage;
|
boost::thread workerThread(&Game::NetworkFunction, this);
|
||||||
std::cout << "Start client or server? (c/s)" << std::endl;
|
|
||||||
std::cin >> inputMessage;
|
|
||||||
if (inputMessage == "c" || inputMessage == "C") {
|
|
||||||
Client client;
|
|
||||||
client.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_LastTime = glfwGetTime();
|
m_LastTime = glfwGetTime();
|
||||||
}
|
}
|
||||||
@@ -53,6 +46,7 @@ Game::~Game()
|
|||||||
{
|
{
|
||||||
delete m_FrameStack;
|
delete m_FrameStack;
|
||||||
delete m_EventBroker;
|
delete m_EventBroker;
|
||||||
|
m_Client.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::Tick()
|
void Game::Tick()
|
||||||
@@ -75,3 +69,13 @@ void Game::Tick()
|
|||||||
|
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Game::NetworkFunction()
|
||||||
|
{
|
||||||
|
std::string inputMessage;
|
||||||
|
std::cout << "Start client or server? (c/s)" << std::endl;
|
||||||
|
std::cin >> inputMessage;
|
||||||
|
if (inputMessage == "c" || inputMessage == "C") {
|
||||||
|
m_Client.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user