Refactoring. Client and server has Update Loop that runs before any game logic each frame.

This commit is contained in:
stiffly
2015-12-15 14:53:56 +01:00
parent 0a8a9e5099
commit 478c692315
8 changed files with 88 additions and 57 deletions
+4
View File
@@ -25,6 +25,7 @@ public:
Client(); Client();
~Client(); ~Client();
void Start(World* world, EventBroker* eventBroker); void Start(World* world, EventBroker* eventBroker);
void Update();
void Close(); void Close();
private: private:
void ReadFromServer(); void ReadFromServer();
@@ -56,6 +57,9 @@ private:
unsigned int m_PreviousPacketID = 0; unsigned int m_PreviousPacketID = 0;
unsigned int m_SendPacketID = 0; unsigned int m_SendPacketID = 0;
// Game Logic
std::vector<unsigned int> m_PlayersToCreate;
World* m_World; World* m_World;
int m_PlayerID = -1; int m_PlayerID = -1;
glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; glm::vec2 m_PlayerPositions[MAXCONNECTIONS];
+3
View File
@@ -21,6 +21,7 @@ public:
Server(); Server();
~Server(); ~Server();
void Start(World* m_world, EventBroker *eventBroker); void Start(World* m_world, EventBroker *eventBroker);
void Update();
void Close(); void Close();
private: private:
@@ -35,6 +36,8 @@ private:
// Game logic // Game logic
World* m_World; World* m_World;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
// size = players to create, stores playerID
std::vector<unsigned int> m_PlayersToCreate;
// Packet loss logic // Packet loss logic
unsigned int m_PacketID; unsigned int m_PacketID;
unsigned int m_PreviousPacketID; unsigned int m_PreviousPacketID;
+3
View File
@@ -50,6 +50,9 @@ private:
// Network methods // Network methods
void NetworkFunction(); void NetworkFunction();
Client m_Client;
Server m_Server;
bool m_IsClient = false;
EventRelay<Game, Events::InputCommand> m_EInputCommand; EventRelay<Game, Events::InputCommand> m_EInputCommand;
bool debugOnInputCommand(const Events::InputCommand& e); bool debugOnInputCommand(const Events::InputCommand& e);
+16 -2
View File
@@ -41,6 +41,17 @@ void Client::Start(World* world, EventBroker* eventBroker)
ReadFromServer(); ReadFromServer();
} }
void Client::Update()
{
while (m_PlayersToCreate.size() > 0) {
unsigned int i = m_PlayersToCreate.size() - 1;
m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = m_World->CreateEntity();
ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform");
ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Model");
model["Resource"] = "Models/Core/UnitSphere.obj";
}
}
void Client::Close() void Client::Close()
{ {
if (m_WasStarted) { if (m_WasStarted) {
@@ -210,6 +221,7 @@ void Client::ParseSnapshot(char* data, size_t length)
// New player connected on the server side // New player connected on the server side
if (m_PlayerDefinitions[i].Name == "" && tempName != "") { if (m_PlayerDefinitions[i].Name == "" && tempName != "") {
//CreateNewPlayer(i); //CreateNewPlayer(i);
m_PlayersToCreate.push_back(i);
} else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") {
// Someone disconnected // Someone disconnected
// TODO: Insert code here // TODO: Insert code here
@@ -217,8 +229,10 @@ void Client::ParseSnapshot(char* data, size_t length)
// Not a connected player // Not a connected player
break; break;
} }
//m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; if (m_PlayerDefinitions[i].EntityID != -1) {
m_PlayerDefinitions[i].Name = tempName; m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos;
m_PlayerDefinitions[i].Name = tempName;
}
} }
} }
+32 -32
View File
@@ -25,6 +25,20 @@ void Server::Start(World* world, EventBroker* eventBroker)
threads.join_all(); threads.join_all();
} }
void Server::Update()
{
while (m_PlayersToCreate.size() > 0) {
int i = m_PlayersToCreate.size() - 1;
m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = m_World->CreateEntity();
ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform");
transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f);
ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Model");
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_PlayersToCreate.pop_back();
}
}
void Server::Close() void Server::Close()
{ {
m_ThreadIsRunning = false; m_ThreadIsRunning = false;
@@ -124,7 +138,6 @@ void Server::ParseMessageType(char * data, size_t length)
memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id
MoveMessageHead(data, length, sizeof(int)); MoveMessageHead(data, length, sizeof(int));
//IdentifyPacketLoss(); //IdentifyPacketLoss();
switch (static_cast<MessageType>(messageType)) { switch (static_cast<MessageType>(messageType)) {
case MessageType::Connect: case MessageType::Connect:
ParseConnect(data, length); ParseConnect(data, length);
@@ -211,9 +224,10 @@ void Server::SendSnapshot()
if (m_PlayerDefinitions[i].EntityID == -1) { if (m_PlayerDefinitions[i].EntityID == -1) {
continue; continue;
} }
// Pack player pos into data package // Pack player pos into data package
//glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"];
glm::vec3 playerPos = glm::vec3(1.0f); //glm::vec3 playerPos = glm::vec3(1.0f);
package.AddPrimitive<float>(playerPos.x); package.AddPrimitive<float>(playerPos.x);
package.AddPrimitive<float>(playerPos.y); package.AddPrimitive<float>(playerPos.y);
package.AddPrimitive<float>(playerPos.z); package.AddPrimitive<float>(playerPos.z);
@@ -282,29 +296,19 @@ void Server::ParseEvent(char * data, size_t length)
if (i >= 8) if (i >= 8)
return; return;
//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"]; m_World->GetComponent(entityId, "Player")["Forward"] = true;
// temp.z -= 0.1f; }
// m_World->GetComponent(entityId, "Transform")["Position"] = temp; if ("-Forward" == std::string(data)) {
//} m_World->GetComponent(entityId, "Player")["Back"] = true;
//if ("-Forward" == std::string(data)) { }
// glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; if ("+Right" == std::string(data)) {
// temp.z += 0.1f; m_World->GetComponent(entityId, "Player")["Right"] = true;
// m_World->GetComponent(entityId, "Transform")["Position"] = temp; }
//} if ("-Right" == std::string(data)) {
m_World->GetComponent(entityId, "Player")["Left"] = true;
//if ("+Right" == std::string(data)) { }
// glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
// temp.x += 0.1f;
// m_World->GetComponent(entityId, "Transform")["Position"] = temp;
//}
//if ("-Right" == std::string(data)) {
// glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
// temp.x -= 0.1f;
// m_World->GetComponent(entityId, "Transform")["Position"] = temp;
//}
} }
void Server::ParseConnect(char * data, size_t length) void Server::ParseConnect(char * data, size_t length)
@@ -326,12 +330,8 @@ void Server::ParseConnect(char * data, size_t length)
//e.world = m_World; //e.world = m_World;
//m_EventBroker->Publish(e); //m_EventBroker->Publish(e);
//int entityID = m_World->CreateEntity(); // Create new player
//ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform"); m_PlayersToCreate.push_back(i);
//transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f);
//ComponentWrapper model = m_World->AttachComponent(entityID, "Model");
//model["Resource"] = "Models/Core/UnitSphere.obj";//modelPath; // You fix this :)
//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);
+10 -6
View File
@@ -46,9 +46,11 @@ glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity)
glm::quat orientation; glm::quat orientation;
do { do {
ComponentWrapper transform = world->GetComponent(entity, "Transform"); if (world->HasComponent(entity, "Transform")) {
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; ComponentWrapper transform = world->GetComponent(entity, "Transform");
entity = world->GetParent(entity); orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
entity = world->GetParent(entity);
}
} while (entity != 0); } while (entity != 0);
return orientation; return orientation;
@@ -59,9 +61,11 @@ glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity)
glm::vec3 scale(1.f); glm::vec3 scale(1.f);
do { do {
ComponentWrapper transform = world->GetComponent(entity, "Transform"); if (world->HasComponent(entity, "Transform")) {
scale *= (glm::vec3)transform["Scale"]; ComponentWrapper transform = world->GetComponent(entity, "Transform");
entity = world->GetParent(entity); scale *= (glm::vec3)transform["Scale"];
entity = world->GetParent(entity);
}
} while (entity != 0); } while (entity != 0);
return scale; return scale;
+5 -2
View File
@@ -89,6 +89,9 @@ void Game::Tick()
m_InputProxy->Process(); m_InputProxy->Process();
m_EventBroker->Swap(); m_EventBroker->Swap();
// Update network
m_IsClient ? m_Client.Update() : m_Server.Update();
// Iterate through systems and update world! // Iterate through systems and update world!
m_SystemPipeline->Update(m_World, dt); m_SystemPipeline->Update(m_World, dt);
debugTick(dt); debugTick(dt);
@@ -135,11 +138,11 @@ void Game::NetworkFunction()
std::cout << "Start client or server? (c/s)" << std::endl; std::cout << "Start client or server? (c/s)" << std::endl;
std::cin >> inputMessage; std::cin >> inputMessage;
if (inputMessage == "c" || inputMessage == "C") { if (inputMessage == "c" || inputMessage == "C") {
Client m_Client; m_IsClient = true;
m_Client.Start(m_World, m_EventBroker); m_Client.Start(m_World, m_EventBroker);
} }
if (inputMessage == "s" || inputMessage == "S") { if (inputMessage == "s" || inputMessage == "S") {
Server m_Server; m_IsClient = false;
m_Server.Start(m_World, m_EventBroker); m_Server.Start(m_World, m_EventBroker);
} }
} }
+14 -14
View File
@@ -2,20 +2,20 @@
void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt) void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt)
{ {
//if (player["Forward"]) { if (player["Forward"]) {
// ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1;
//} }
//if (player["Left"]) { if (player["Left"]) {
// ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1; ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1;
//} }
//if (player["Back"]) { if (player["Back"]) {
// ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt); ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt);
//} }
//if (player["Right"]) { if (player["Right"]) {
// ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt);
//} }
//ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform");
//(glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"];
//m_EventBroker->Process<PlayerSystem>(); //m_EventBroker->Process<PlayerSystem>();