From 3f2fcdf9e17e95f8290d4d87149b90d3cdb79769 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 24 Jun 2013 16:15:48 +1000 Subject: [PATCH] Players are being added in the client The client sends a debug player to the server, with a constant movement to show that the new client _is_ connecting. The next thing to add is the sync system, so that the clients know what the server looks like when they first join. --- client/in_world.cpp | 87 ++++++++++++++++++++++++----------- client/in_world.hpp | 14 ++++-- client/lobby.cpp | 14 +++--- libs/common/packet.hpp | 2 + server/server_application.cpp | 31 ++++++++----- server/server_application.hpp | 2 +- 6 files changed, 101 insertions(+), 49 deletions(-) diff --git a/client/in_world.cpp b/client/in_world.cpp index 5646413..d3b0740 100644 --- a/client/in_world.cpp +++ b/client/in_world.cpp @@ -35,7 +35,16 @@ InWorld::InWorld() { #endif cout << "Client Index: " << infoMgr->GetClientIndex() << endl; font.SetSurface(surfaceMgr->Get("font")); - pc.GetSprite()->SetSurface(surfaceMgr->Get("elliot"), 32, 48); + + //debugging + Packet::Packet p; + p.meta.type = Packet::Type::PLAYER_NEW; + snprintf(p.playerNew.handle, PACKET_STRING_SIZE, "%s", configUtil->CString("handle")); + snprintf(p.playerNew.avatar, PACKET_STRING_SIZE, "%s", configUtil->CString("avatar")); + p.playerNew.position = {0, 50}; + p.playerNew.motion = {140, 0}; + + netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet::Packet)); } InWorld::~InWorld() { @@ -54,7 +63,10 @@ void InWorld::FrameStart() { void InWorld::Update(double delta) { while(HandlePacket(popNetworkPacket())); - pc.Update(delta); + + for (map::iterator it = playerCharacters.begin(); it != playerCharacters.end(); it++) { + it->second.Update(delta); + } } void InWorld::FrameEnd() { @@ -64,7 +76,9 @@ void InWorld::FrameEnd() { void InWorld::Render(SDL_Surface* const screen) { ClockFrameRate(); - pc.DrawTo(screen); + for (map::iterator it = playerCharacters.begin(); it != playerCharacters.end(); it++) { + it->second.DrawTo(screen); + } //since we're using this twice, make a tmp var string fps = itos(GetFrameRate()); @@ -99,16 +113,16 @@ void InWorld::KeyDown(SDL_KeyboardEvent const& key) { ExitGame(); break; case SDLK_w: - pc.MoveDirection(CardinalDirection::NORTH); + //up break; case SDLK_s: - pc.MoveDirection(CardinalDirection::SOUTH); + //down break; case SDLK_a: - pc.MoveDirection(CardinalDirection::EAST); + //left break; case SDLK_d: - pc.MoveDirection(CardinalDirection::WEST); + //right break; } } @@ -117,16 +131,16 @@ void InWorld::KeyUp(SDL_KeyboardEvent const& key) { //reversed switch(key.keysym.sym) { case SDLK_w: - pc.MoveDirection(CardinalDirection::SOUTH); + // break; case SDLK_s: - pc.MoveDirection(CardinalDirection::NORTH); + // break; case SDLK_a: - pc.MoveDirection(CardinalDirection::WEST); + // break; case SDLK_d: - pc.MoveDirection(CardinalDirection::EAST); + // break; } } @@ -149,33 +163,33 @@ int InWorld::HandlePacket(Packet::Packet p) { case Packet::Type::PONG: // break; -// case PacketType::BROADCAST_REQUEST: +// case Packet::Type::BROADCAST_REQUEST: // // // break; -// case PacketType::BROADCAST_RESPONSE: +// case Packet::Type::BROADCAST_RESPONSE: // // // break; -// case PacketType::JOIN_REQUEST: +// case Packet::Type::JOIN_REQUEST: // // // break; -// case PacketType::JOIN_RESPONSE: +// case Packet::Type::JOIN_RESPONSE: // // // break; case Packet::Type::DISCONNECT: HandleDisconnection(p.disconnect); break; -// case PacketType::SYNCHRONIZE: -// // -// break; -// case PacketType::PLAYER_NEW: -// // -// break; -// case PacketType::PLAYER_DELETE: -// // -// break; -// case PacketType::PLAYER_MOVE: +// case Packet::Type::SYNCHRONIZE: // // // break; + case Packet::Type::PLAYER_NEW: + AddPlayer(p.playerNew); + break; + case Packet::Type::PLAYER_DELETE: + RemovePlayer(p.playerDelete); + break; + case Packet::Type::PLAYER_UPDATE: + UpdatePlayer(p.playerUpdate); + break; default: throw(runtime_error("Failed to recognize the packet type: " + itos(int(p.meta.type)))); } @@ -189,7 +203,6 @@ void InWorld::Disconnect() { p.disconnect.clientIndex = infoMgr->GetClientIndex(); netUtil->Send(GAME_CHANNEL, reinterpret_cast(&p), sizeof(Packet::Packet)); netUtil->Unbind(GAME_CHANNEL); - endQueueThread(); //reset the client infoMgr->ResetClientIndex(); @@ -198,11 +211,33 @@ void InWorld::Disconnect() { void InWorld::ExitGame() { Disconnect(); SetNextScene(SceneList::MAINMENU); + endQueueThread(); cout << "The game session has ended" << endl; } void InWorld::HandleDisconnection(Packet::Disconnect& disconnect) { Disconnect(); SetNextScene(SceneList::MAINMENU); + endQueueThread(); cout << "You have been disconnected" << endl; } + +void InWorld::AddPlayer(Packet::PlayerNew& p) { + //sprite + playerCharacters[p.playerIndex].GetSprite()->SetSurface(surfaceMgr->Get(p.avatar), 32, 48); + + //pos + playerCharacters[p.playerIndex].SetPosition(p.position); + playerCharacters[p.playerIndex].SetMotion(p.motion); + + //debugging + cout << "New player, index " << p.playerIndex << endl; +} + +void InWorld::RemovePlayer(Packet::PlayerDelete& p) { + // +} + +void InWorld::UpdatePlayer(Packet::PlayerUpdate& p) { + // +} diff --git a/client/in_world.hpp b/client/in_world.hpp index c3e9b45..f5c681f 100644 --- a/client/in_world.hpp +++ b/client/in_world.hpp @@ -23,12 +23,14 @@ #define INWORLD_HPP_ #include "base_scene.hpp" + #include "utilities.hpp" #include "defines.hpp" #include "singleton.hpp" #include "packet.hpp" #include "network_queue.hpp" #include "information_manager.hpp" +#include "player_character.hpp" #include "config_utility.hpp" #include "surface_manager.hpp" @@ -37,8 +39,7 @@ #include "raster_font.hpp" #include "frame_rate.hpp" -//debugging -#include "player_character.hpp" +#include class InWorld : public BaseScene { public: @@ -62,11 +63,16 @@ protected: void KeyUp(SDL_KeyboardEvent const&); //Utilities - int HandlePacket(Packet::Packet p); + int HandlePacket(Packet::Packet); void Disconnect(); void ExitGame(); + void HandleDisconnection(Packet::Disconnect&); + void AddPlayer(Packet::PlayerNew&); + void RemovePlayer(Packet::PlayerDelete&); + void UpdatePlayer(Packet::PlayerUpdate&); + //services ConfigUtility* configUtil = Singleton::Get(); SurfaceManager* surfaceMgr = Singleton::Get(); @@ -75,7 +81,7 @@ protected: //members RasterFont font; - PlayerCharacter pc; + std::map playerCharacters; }; #endif diff --git a/client/lobby.cpp b/client/lobby.cpp index 0e36a80..8122421 100644 --- a/client/lobby.cpp +++ b/client/lobby.cpp @@ -169,31 +169,31 @@ int Lobby::HandlePacket(Packet::Packet p) { case Packet::Type::PONG: // break; -// case PacketType::BROADCAST_REQUEST: +// case Packet::Type::BROADCAST_REQUEST: // // // break; case Packet::Type::BROADCAST_RESPONSE: PushServer(p.broadcastResponse); break; -// case PacketType::JOIN_REQUEST: +// case Packet::Type::JOIN_REQUEST: // // // break; case Packet::Type::JOIN_RESPONSE: BeginGame(p.joinResponse); break; -// case PacketType::DISCONNECT: +// case Packet::Type::DISCONNECT: // // // break; -// case PacketType::SYNCHRONIZE: +// case Packet::Type::SYNCHRONIZE: // // // break; -// case PacketType::PLAYER_NEW: +// case Packet::Type::PLAYER_NEW: // // // break; -// case PacketType::PLAYER_DELETE: +// case Packet::Type::PLAYER_DELETE: // // // break; -// case PacketType::PLAYER_MOVE: +// case Packet::Type::PLAYER_UPDATE: // // // break; default: diff --git a/libs/common/packet.hpp b/libs/common/packet.hpp index 1309922..d640f74 100644 --- a/libs/common/packet.hpp +++ b/libs/common/packet.hpp @@ -98,6 +98,8 @@ struct PlayerNew { int clientIndex; char handle[PACKET_STRING_SIZE]; char avatar[PACKET_STRING_SIZE]; + Vector2 position; + Vector2 motion; //TODO Playerdata }; diff --git a/server/server_application.cpp b/server/server_application.cpp index 054e68c..187c5b5 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -129,7 +129,16 @@ void ServerApplication::Quit() { //------------------------- void ServerApplication::UpdateWorld(double delta) { - // + //the recalc here each loop is a stopgap, see issue #9 for details + for (map::iterator it = players.begin(); it != players.end(); it++) { + if (it->second.motion.x != 0 && it->second.motion.y != 0) { + constexpr double d = 1.0/sqrt(2); + it->second.position += it->second.motion * delta * d; + } + else { + it->second.position += it->second.motion * delta; + } + } } //------------------------- @@ -173,7 +182,7 @@ int ServerApplication::HandlePacket(Packet::Packet p) { RelayPacket(p); break; case Packet::Type::PLAYER_DELETE: - DeletePlayer(p.playerDelete); + RemovePlayer(p.playerDelete); RelayPacket(p); break; case Packet::Type::PLAYER_UPDATE: @@ -239,31 +248,31 @@ void ServerApplication::HandleDisconnection(Packet::Disconnect& disconnect) { cout << "number of clients: " << clients.size() << endl; } -void ServerApplication::AddPlayer(Packet::PlayerNew& playerNew) { +void ServerApplication::AddPlayer(Packet::PlayerNew& p) { //add the player PlayerEntry newPlayer = { uniqueIndex++, - playerNew.clientIndex, - playerNew.handle, - playerNew.avatar, - {0,0}, - {0,0} + p.clientIndex, + p.handle, + p.avatar, + p.position, + p.motion }; players[newPlayer.index] = newPlayer; //prep for relay - playerNew.playerIndex = newPlayer.index; + p.playerIndex = newPlayer.index; //debugging cout << "New player " << newPlayer.handle << "Has joined the game" << endl; cout << "Number of players: " << players.size() << endl; } -void ServerApplication::DeletePlayer(Packet::PlayerDelete& playerDelete) { +void ServerApplication::RemovePlayer(Packet::PlayerDelete& p) { //TODO remove a player } -void ServerApplication::UpdatePlayer(Packet::PlayerUpdate& playerUpdate) { +void ServerApplication::UpdatePlayer(Packet::PlayerUpdate& p) { //TODO update a player } diff --git a/server/server_application.hpp b/server/server_application.hpp index c5166c9..cb0391b 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -63,7 +63,7 @@ private: void HandleDisconnection(Packet::Disconnect&); void AddPlayer(Packet::PlayerNew&); - void DeletePlayer(Packet::PlayerDelete&); + void RemovePlayer(Packet::PlayerDelete&); void UpdatePlayer(Packet::PlayerUpdate&); //services