Refactoring. Client and server has Update Loop that runs before any game logic each frame.
This commit is contained in:
@@ -25,6 +25,7 @@ public:
|
||||
Client();
|
||||
~Client();
|
||||
void Start(World* world, EventBroker* eventBroker);
|
||||
void Update();
|
||||
void Close();
|
||||
private:
|
||||
void ReadFromServer();
|
||||
@@ -56,6 +57,9 @@ private:
|
||||
unsigned int m_PreviousPacketID = 0;
|
||||
unsigned int m_SendPacketID = 0;
|
||||
|
||||
// Game Logic
|
||||
std::vector<unsigned int> m_PlayersToCreate;
|
||||
|
||||
World* m_World;
|
||||
int m_PlayerID = -1;
|
||||
glm::vec2 m_PlayerPositions[MAXCONNECTIONS];
|
||||
|
||||
@@ -21,6 +21,7 @@ public:
|
||||
Server();
|
||||
~Server();
|
||||
void Start(World* m_world, EventBroker *eventBroker);
|
||||
void Update();
|
||||
void Close();
|
||||
|
||||
private:
|
||||
@@ -35,6 +36,8 @@ private:
|
||||
// Game logic
|
||||
World* m_World;
|
||||
EventBroker* m_EventBroker;
|
||||
// size = players to create, stores playerID
|
||||
std::vector<unsigned int> m_PlayersToCreate;
|
||||
// Packet loss logic
|
||||
unsigned int m_PacketID;
|
||||
unsigned int m_PreviousPacketID;
|
||||
|
||||
@@ -50,6 +50,9 @@ private:
|
||||
|
||||
// Network methods
|
||||
void NetworkFunction();
|
||||
Client m_Client;
|
||||
Server m_Server;
|
||||
bool m_IsClient = false;
|
||||
|
||||
EventRelay<Game, Events::InputCommand> m_EInputCommand;
|
||||
bool debugOnInputCommand(const Events::InputCommand& e);
|
||||
|
||||
@@ -41,6 +41,17 @@ void Client::Start(World* world, EventBroker* eventBroker)
|
||||
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()
|
||||
{
|
||||
if (m_WasStarted) {
|
||||
@@ -210,6 +221,7 @@ void Client::ParseSnapshot(char* data, size_t length)
|
||||
// New player connected on the server side
|
||||
if (m_PlayerDefinitions[i].Name == "" && tempName != "") {
|
||||
//CreateNewPlayer(i);
|
||||
m_PlayersToCreate.push_back(i);
|
||||
} else if (m_PlayerDefinitions[i].Name != "" && tempName == "") {
|
||||
// Someone disconnected
|
||||
// TODO: Insert code here
|
||||
@@ -217,8 +229,10 @@ void Client::ParseSnapshot(char* data, size_t length)
|
||||
// Not a connected player
|
||||
break;
|
||||
}
|
||||
//m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos;
|
||||
m_PlayerDefinitions[i].Name = tempName;
|
||||
if (m_PlayerDefinitions[i].EntityID != -1) {
|
||||
m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos;
|
||||
m_PlayerDefinitions[i].Name = tempName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,20 @@ void Server::Start(World* world, EventBroker* eventBroker)
|
||||
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()
|
||||
{
|
||||
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
|
||||
MoveMessageHead(data, length, sizeof(int));
|
||||
//IdentifyPacketLoss();
|
||||
|
||||
switch (static_cast<MessageType>(messageType)) {
|
||||
case MessageType::Connect:
|
||||
ParseConnect(data, length);
|
||||
@@ -211,9 +224,10 @@ void Server::SendSnapshot()
|
||||
if (m_PlayerDefinitions[i].EntityID == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Pack player pos into data package
|
||||
//glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"];
|
||||
glm::vec3 playerPos = glm::vec3(1.0f);
|
||||
glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"];
|
||||
//glm::vec3 playerPos = glm::vec3(1.0f);
|
||||
package.AddPrimitive<float>(playerPos.x);
|
||||
package.AddPrimitive<float>(playerPos.y);
|
||||
package.AddPrimitive<float>(playerPos.z);
|
||||
@@ -282,29 +296,19 @@ void Server::ParseEvent(char * data, size_t length)
|
||||
if (i >= 8)
|
||||
return;
|
||||
|
||||
//unsigned int entityId = m_PlayerDefinitions[i].EntityID;
|
||||
//if ("+Forward" == std::string(data)) {
|
||||
// glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
||||
// temp.z -= 0.1f;
|
||||
// m_World->GetComponent(entityId, "Transform")["Position"] = temp;
|
||||
//}
|
||||
//if ("-Forward" == std::string(data)) {
|
||||
// glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"];
|
||||
// temp.z += 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;
|
||||
//}
|
||||
|
||||
//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;
|
||||
//}
|
||||
unsigned int entityId = m_PlayerDefinitions[i].EntityID;
|
||||
if ("+Forward" == std::string(data)) {
|
||||
m_World->GetComponent(entityId, "Player")["Forward"] = true;
|
||||
}
|
||||
if ("-Forward" == std::string(data)) {
|
||||
m_World->GetComponent(entityId, "Player")["Back"] = true;
|
||||
}
|
||||
if ("+Right" == std::string(data)) {
|
||||
m_World->GetComponent(entityId, "Player")["Right"] = true;
|
||||
}
|
||||
if ("-Right" == std::string(data)) {
|
||||
m_World->GetComponent(entityId, "Player")["Left"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Server::ParseConnect(char * data, size_t length)
|
||||
@@ -326,13 +330,9 @@ void Server::ParseConnect(char * data, size_t length)
|
||||
//e.world = m_World;
|
||||
//m_EventBroker->Publish(e);
|
||||
|
||||
//int entityID = m_World->CreateEntity();
|
||||
//ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform");
|
||||
//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);
|
||||
|
||||
// Create new player
|
||||
m_PlayersToCreate.push_back(i);
|
||||
|
||||
m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint;
|
||||
m_PlayerDefinitions[i].Name = std::string(data);
|
||||
// +1 is the null terminator
|
||||
|
||||
@@ -46,9 +46,11 @@ glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity)
|
||||
glm::quat orientation;
|
||||
|
||||
do {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
|
||||
entity = world->GetParent(entity);
|
||||
if (world->HasComponent(entity, "Transform")) {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
|
||||
entity = world->GetParent(entity);
|
||||
}
|
||||
} while (entity != 0);
|
||||
|
||||
return orientation;
|
||||
@@ -59,9 +61,11 @@ glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity)
|
||||
glm::vec3 scale(1.f);
|
||||
|
||||
do {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
scale *= (glm::vec3)transform["Scale"];
|
||||
entity = world->GetParent(entity);
|
||||
if (world->HasComponent(entity, "Transform")) {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
scale *= (glm::vec3)transform["Scale"];
|
||||
entity = world->GetParent(entity);
|
||||
}
|
||||
} while (entity != 0);
|
||||
|
||||
return scale;
|
||||
|
||||
+5
-2
@@ -89,6 +89,9 @@ void Game::Tick()
|
||||
m_InputProxy->Process();
|
||||
m_EventBroker->Swap();
|
||||
|
||||
// Update network
|
||||
m_IsClient ? m_Client.Update() : m_Server.Update();
|
||||
|
||||
// Iterate through systems and update world!
|
||||
m_SystemPipeline->Update(m_World, dt);
|
||||
debugTick(dt);
|
||||
@@ -135,11 +138,11 @@ void Game::NetworkFunction()
|
||||
std::cout << "Start client or server? (c/s)" << std::endl;
|
||||
std::cin >> inputMessage;
|
||||
if (inputMessage == "c" || inputMessage == "C") {
|
||||
Client m_Client;
|
||||
m_IsClient = true;
|
||||
m_Client.Start(m_World, m_EventBroker);
|
||||
}
|
||||
if (inputMessage == "s" || inputMessage == "S") {
|
||||
Server m_Server;
|
||||
m_IsClient = false;
|
||||
m_Server.Start(m_World, m_EventBroker);
|
||||
}
|
||||
}
|
||||
+14
-14
@@ -2,20 +2,20 @@
|
||||
|
||||
void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt)
|
||||
{
|
||||
//if (player["Forward"]) {
|
||||
// ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1;
|
||||
//}
|
||||
//if (player["Left"]) {
|
||||
// ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1;
|
||||
//}
|
||||
//if (player["Back"]) {
|
||||
// ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt);
|
||||
//}
|
||||
//if (player["Right"]) {
|
||||
// ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt);
|
||||
//}
|
||||
//ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform");
|
||||
//(glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"];
|
||||
if (player["Forward"]) {
|
||||
((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1;
|
||||
}
|
||||
if (player["Left"]) {
|
||||
((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1;
|
||||
}
|
||||
if (player["Back"]) {
|
||||
((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt);
|
||||
}
|
||||
if (player["Right"]) {
|
||||
((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt);
|
||||
}
|
||||
ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform");
|
||||
(glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"];
|
||||
|
||||
//m_EventBroker->Process<PlayerSystem>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user