diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 0ddc03dc..5b2070d6 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -8,12 +8,14 @@ #include // For input event #include "Network/MessageType.h" -#include "Network/NetworkDefines.h" +#include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" +#include "Network/SnapshotDefinitions.h" #include "Network/WinLeakCheck.h" #include "Core/World.h" #include "Core/EventBroker.h" #include "Core/EKeyDown.h" +#include "Core/EKeyUp.h" class Client @@ -24,8 +26,8 @@ public: void Start(World* world, EventBroker* eventBroker); void Close(); private: - // Threaded void ReadFromServer(); + void SendToServer(); int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); @@ -50,6 +52,7 @@ private: int m_PlayerID = -1; glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; + SnapshotDefinitions m_NextSnapshot; std::clock_t m_StartPingTime; double m_DurationOfPingTime; std::string m_PlayerName; @@ -61,7 +64,9 @@ private: // Events EventBroker* m_EventBroker; EventRelay m_EKeyDown; - bool OnKeyDown(const Events::KeyDown &e); + bool OnKeyDown(const Events::KeyDown &e); + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &e); }; #endif diff --git a/include/Engine/Network/NetworkDefines.h b/include/Engine/Network/NetworkDefinitions.h similarity index 100% rename from include/Engine/Network/NetworkDefines.h rename to include/Engine/Network/NetworkDefinitions.h diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 9a971f4b..752edc6f 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -1,15 +1,17 @@ #ifndef Server_h__ #define Server_h__ + #include #include #include #include #include -#include "NetworkDefines.h" -#include "MessageType.h" -#include "Core/World.h" + +#include "Network/MessageType.h" +#include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" +#include "Core/World.h" class Server { diff --git a/include/Engine/Network/SnapshotDefinitions.h b/include/Engine/Network/SnapshotDefinitions.h new file mode 100644 index 00000000..7f9e4ce5 --- /dev/null +++ b/include/Engine/Network/SnapshotDefinitions.h @@ -0,0 +1,12 @@ +#ifndef SnapshotDefinitions_h__ +#define SnapshotDefinitions_h__ + +struct SnapshotDefinitions +{ + // "+Forward" is 8 characters * sizeof(char) = 8 + char* inputForward = new char[8]; + // "+Right" is 6 characters * sizeof(char) = 6 + char* inputRight = new char[6]; +}; + +#endif \ No newline at end of file diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index ac7e9ec2..9b81923e 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -1,8 +1,16 @@ [Debug] + LogLevel=1 + [Video] + Fullscreen=false + VSYNC=false + Width=1280 -Height=720 \ No newline at end of file + +Height=720 +[Networking] +StartNetwork=false \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 17bcde7e..0e13fb4c 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -17,12 +17,16 @@ Client::~Client() void Client::Start(World* world, EventBroker* eventBroker) { - // Subscribe to events m_WasStarted = true; m_EventBroker = eventBroker; m_World = world; + + // Subscribe to events m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EKeyDown); + m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Client::OnKeyUp, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EKeyUp); + std::cout << "Please enter you name: "; std::cin >> m_PlayerName; while (m_PlayerName.size() > 7) { @@ -48,11 +52,40 @@ void Client::ReadFromServer() int bytesRead = -1; char readBuf[1024] = { 0 }; + int snapshotInterval = 33; + std::clock_t previousSnapshotMessage = std::clock(); + while (m_ThreadIsRunning) { if (m_Socket.available()) { bytesRead = Receive(readBuf, INPUTSIZE); ParseMessageType(readBuf, bytesRead); } + std::clock_t currentTime = std::clock(); + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendToServer(); + previousSnapshotMessage = currentTime; + } + + } +} + +void Client::SendToServer() +{ + if (m_NextSnapshot.inputForward != "") { + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputForward, dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (m_NextSnapshot.inputRight != "") { + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputRight, dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); } } @@ -242,33 +275,18 @@ bool Client::OnKeyDown(const Events::KeyDown& event) { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled if (event.KeyCode == GLFW_KEY_W) { - int len = CreateMessage(MessageType::Event, "+Forward", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputForward = "+Forward"; } if (event.KeyCode == GLFW_KEY_A) { - int len = CreateMessage(MessageType::Event, "-Right", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputRight = "-Right"; } if (event.KeyCode == GLFW_KEY_S) { - int len = CreateMessage(MessageType::Event, "-Forward", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputForward = "-Forward"; } if (event.KeyCode == GLFW_KEY_D) { - int len = CreateMessage(MessageType::Event, "+Right", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputRight = "+Right"; } + if (event.KeyCode == GLFW_KEY_V) { Disconnect(); } @@ -283,6 +301,19 @@ bool Client::OnKeyDown(const Events::KeyDown& event) return true; } +bool Client::OnKeyUp(const Events::KeyUp & e) +{ + if (e.KeyCode == GLFW_KEY_W || e.KeyCode == GLFW_KEY_S) { + m_NextSnapshot.inputForward = ""; + return true; + } + if (e.KeyCode == GLFW_KEY_A || e.KeyCode == GLFW_KEY_D) { + m_NextSnapshot.inputRight = ""; + return true; + } + return false; +} + void Client::CreateNewPlayer(int i) { m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 4b928b15..c40aa10a 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -38,9 +38,10 @@ Game::Game(int argc, char* argv[]) // Create a TEST WORLD m_World = new HardcodedTestWorld(); - // TEMP: Invoke network - - boost::thread workerThread(&Game::NetworkFunction, this); + + // Invoke network + if(m_Config->Get("Networking.StartNetwork", false) == true) + boost::thread workerThread(&Game::NetworkFunction, this); m_LastTime = glfwGetTime(); }