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.
This commit is contained in:
Kayne Ruse
2013-06-24 16:15:48 +10:00
parent 2235f307e7
commit 3f2fcdf9e1
6 changed files with 101 additions and 49 deletions
+61 -26
View File
@@ -35,7 +35,16 @@ InWorld::InWorld() {
#endif #endif
cout << "Client Index: " << infoMgr->GetClientIndex() << endl; cout << "Client Index: " << infoMgr->GetClientIndex() << endl;
font.SetSurface(surfaceMgr->Get("font")); 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() { InWorld::~InWorld() {
@@ -54,7 +63,10 @@ void InWorld::FrameStart() {
void InWorld::Update(double delta) { void InWorld::Update(double delta) {
while(HandlePacket(popNetworkPacket())); while(HandlePacket(popNetworkPacket()));
pc.Update(delta);
for (map<int,PlayerCharacter>::iterator it = playerCharacters.begin(); it != playerCharacters.end(); it++) {
it->second.Update(delta);
}
} }
void InWorld::FrameEnd() { void InWorld::FrameEnd() {
@@ -64,7 +76,9 @@ void InWorld::FrameEnd() {
void InWorld::Render(SDL_Surface* const screen) { void InWorld::Render(SDL_Surface* const screen) {
ClockFrameRate(); ClockFrameRate();
pc.DrawTo(screen); for (map<int,PlayerCharacter>::iterator it = playerCharacters.begin(); it != playerCharacters.end(); it++) {
it->second.DrawTo(screen);
}
//since we're using this twice, make a tmp var //since we're using this twice, make a tmp var
string fps = itos(GetFrameRate()); string fps = itos(GetFrameRate());
@@ -99,16 +113,16 @@ void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
ExitGame(); ExitGame();
break; break;
case SDLK_w: case SDLK_w:
pc.MoveDirection(CardinalDirection::NORTH); //up
break; break;
case SDLK_s: case SDLK_s:
pc.MoveDirection(CardinalDirection::SOUTH); //down
break; break;
case SDLK_a: case SDLK_a:
pc.MoveDirection(CardinalDirection::EAST); //left
break; break;
case SDLK_d: case SDLK_d:
pc.MoveDirection(CardinalDirection::WEST); //right
break; break;
} }
} }
@@ -117,16 +131,16 @@ void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
//reversed //reversed
switch(key.keysym.sym) { switch(key.keysym.sym) {
case SDLK_w: case SDLK_w:
pc.MoveDirection(CardinalDirection::SOUTH); //
break; break;
case SDLK_s: case SDLK_s:
pc.MoveDirection(CardinalDirection::NORTH); //
break; break;
case SDLK_a: case SDLK_a:
pc.MoveDirection(CardinalDirection::WEST); //
break; break;
case SDLK_d: case SDLK_d:
pc.MoveDirection(CardinalDirection::EAST); //
break; break;
} }
} }
@@ -149,33 +163,33 @@ int InWorld::HandlePacket(Packet::Packet p) {
case Packet::Type::PONG: case Packet::Type::PONG:
// //
break; break;
// case PacketType::BROADCAST_REQUEST: // case Packet::Type::BROADCAST_REQUEST:
// // // //
// break; // break;
// case PacketType::BROADCAST_RESPONSE: // case Packet::Type::BROADCAST_RESPONSE:
// // // //
// break; // break;
// case PacketType::JOIN_REQUEST: // case Packet::Type::JOIN_REQUEST:
// // // //
// break; // break;
// case PacketType::JOIN_RESPONSE: // case Packet::Type::JOIN_RESPONSE:
// // // //
// break; // break;
case Packet::Type::DISCONNECT: case Packet::Type::DISCONNECT:
HandleDisconnection(p.disconnect); HandleDisconnection(p.disconnect);
break; break;
// case PacketType::SYNCHRONIZE: // case Packet::Type::SYNCHRONIZE:
// //
// break;
// case PacketType::PLAYER_NEW:
// //
// break;
// case PacketType::PLAYER_DELETE:
// //
// break;
// case PacketType::PLAYER_MOVE:
// // // //
// break; // 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: default:
throw(runtime_error("Failed to recognize the packet type: " + itos(int(p.meta.type)))); 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(); p.disconnect.clientIndex = infoMgr->GetClientIndex();
netUtil->Send(GAME_CHANNEL, reinterpret_cast<void*>(&p), sizeof(Packet::Packet)); netUtil->Send(GAME_CHANNEL, reinterpret_cast<void*>(&p), sizeof(Packet::Packet));
netUtil->Unbind(GAME_CHANNEL); netUtil->Unbind(GAME_CHANNEL);
endQueueThread();
//reset the client //reset the client
infoMgr->ResetClientIndex(); infoMgr->ResetClientIndex();
@@ -198,11 +211,33 @@ void InWorld::Disconnect() {
void InWorld::ExitGame() { void InWorld::ExitGame() {
Disconnect(); Disconnect();
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
endQueueThread();
cout << "The game session has ended" << endl; cout << "The game session has ended" << endl;
} }
void InWorld::HandleDisconnection(Packet::Disconnect& disconnect) { void InWorld::HandleDisconnection(Packet::Disconnect& disconnect) {
Disconnect(); Disconnect();
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
endQueueThread();
cout << "You have been disconnected" << endl; 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) {
//
}
+10 -4
View File
@@ -23,12 +23,14 @@
#define INWORLD_HPP_ #define INWORLD_HPP_
#include "base_scene.hpp" #include "base_scene.hpp"
#include "utilities.hpp" #include "utilities.hpp"
#include "defines.hpp" #include "defines.hpp"
#include "singleton.hpp" #include "singleton.hpp"
#include "packet.hpp" #include "packet.hpp"
#include "network_queue.hpp" #include "network_queue.hpp"
#include "information_manager.hpp" #include "information_manager.hpp"
#include "player_character.hpp"
#include "config_utility.hpp" #include "config_utility.hpp"
#include "surface_manager.hpp" #include "surface_manager.hpp"
@@ -37,8 +39,7 @@
#include "raster_font.hpp" #include "raster_font.hpp"
#include "frame_rate.hpp" #include "frame_rate.hpp"
//debugging #include <map>
#include "player_character.hpp"
class InWorld : public BaseScene { class InWorld : public BaseScene {
public: public:
@@ -62,11 +63,16 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//Utilities //Utilities
int HandlePacket(Packet::Packet p); int HandlePacket(Packet::Packet);
void Disconnect(); void Disconnect();
void ExitGame(); void ExitGame();
void HandleDisconnection(Packet::Disconnect&); void HandleDisconnection(Packet::Disconnect&);
void AddPlayer(Packet::PlayerNew&);
void RemovePlayer(Packet::PlayerDelete&);
void UpdatePlayer(Packet::PlayerUpdate&);
//services //services
ConfigUtility* configUtil = Singleton<ConfigUtility>::Get(); ConfigUtility* configUtil = Singleton<ConfigUtility>::Get();
SurfaceManager* surfaceMgr = Singleton<SurfaceManager>::Get(); SurfaceManager* surfaceMgr = Singleton<SurfaceManager>::Get();
@@ -75,7 +81,7 @@ protected:
//members //members
RasterFont font; RasterFont font;
PlayerCharacter pc; std::map<int, PlayerCharacter> playerCharacters;
}; };
#endif #endif
+7 -7
View File
@@ -169,31 +169,31 @@ int Lobby::HandlePacket(Packet::Packet p) {
case Packet::Type::PONG: case Packet::Type::PONG:
// //
break; break;
// case PacketType::BROADCAST_REQUEST: // case Packet::Type::BROADCAST_REQUEST:
// // // //
// break; // break;
case Packet::Type::BROADCAST_RESPONSE: case Packet::Type::BROADCAST_RESPONSE:
PushServer(p.broadcastResponse); PushServer(p.broadcastResponse);
break; break;
// case PacketType::JOIN_REQUEST: // case Packet::Type::JOIN_REQUEST:
// // // //
// break; // break;
case Packet::Type::JOIN_RESPONSE: case Packet::Type::JOIN_RESPONSE:
BeginGame(p.joinResponse); BeginGame(p.joinResponse);
break; break;
// case PacketType::DISCONNECT: // case Packet::Type::DISCONNECT:
// // // //
// break; // break;
// case PacketType::SYNCHRONIZE: // case Packet::Type::SYNCHRONIZE:
// // // //
// break; // break;
// case PacketType::PLAYER_NEW: // case Packet::Type::PLAYER_NEW:
// // // //
// break; // break;
// case PacketType::PLAYER_DELETE: // case Packet::Type::PLAYER_DELETE:
// // // //
// break; // break;
// case PacketType::PLAYER_MOVE: // case Packet::Type::PLAYER_UPDATE:
// // // //
// break; // break;
default: default:
+2
View File
@@ -98,6 +98,8 @@ struct PlayerNew {
int clientIndex; int clientIndex;
char handle[PACKET_STRING_SIZE]; char handle[PACKET_STRING_SIZE];
char avatar[PACKET_STRING_SIZE]; char avatar[PACKET_STRING_SIZE];
Vector2 position;
Vector2 motion;
//TODO Playerdata //TODO Playerdata
}; };
+20 -11
View File
@@ -129,7 +129,16 @@ void ServerApplication::Quit() {
//------------------------- //-------------------------
void ServerApplication::UpdateWorld(double delta) { void ServerApplication::UpdateWorld(double delta) {
// //the recalc here each loop is a stopgap, see issue #9 for details
for (map<int, PlayerEntry>::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); RelayPacket(p);
break; break;
case Packet::Type::PLAYER_DELETE: case Packet::Type::PLAYER_DELETE:
DeletePlayer(p.playerDelete); RemovePlayer(p.playerDelete);
RelayPacket(p); RelayPacket(p);
break; break;
case Packet::Type::PLAYER_UPDATE: case Packet::Type::PLAYER_UPDATE:
@@ -239,31 +248,31 @@ void ServerApplication::HandleDisconnection(Packet::Disconnect& disconnect) {
cout << "number of clients: " << clients.size() << endl; cout << "number of clients: " << clients.size() << endl;
} }
void ServerApplication::AddPlayer(Packet::PlayerNew& playerNew) { void ServerApplication::AddPlayer(Packet::PlayerNew& p) {
//add the player //add the player
PlayerEntry newPlayer = { PlayerEntry newPlayer = {
uniqueIndex++, uniqueIndex++,
playerNew.clientIndex, p.clientIndex,
playerNew.handle, p.handle,
playerNew.avatar, p.avatar,
{0,0}, p.position,
{0,0} p.motion
}; };
players[newPlayer.index] = newPlayer; players[newPlayer.index] = newPlayer;
//prep for relay //prep for relay
playerNew.playerIndex = newPlayer.index; p.playerIndex = newPlayer.index;
//debugging //debugging
cout << "New player " << newPlayer.handle << "Has joined the game" << endl; cout << "New player " << newPlayer.handle << "Has joined the game" << endl;
cout << "Number of players: " << players.size() << endl; cout << "Number of players: " << players.size() << endl;
} }
void ServerApplication::DeletePlayer(Packet::PlayerDelete& playerDelete) { void ServerApplication::RemovePlayer(Packet::PlayerDelete& p) {
//TODO remove a player //TODO remove a player
} }
void ServerApplication::UpdatePlayer(Packet::PlayerUpdate& playerUpdate) { void ServerApplication::UpdatePlayer(Packet::PlayerUpdate& p) {
//TODO update a player //TODO update a player
} }
+1 -1
View File
@@ -63,7 +63,7 @@ private:
void HandleDisconnection(Packet::Disconnect&); void HandleDisconnection(Packet::Disconnect&);
void AddPlayer(Packet::PlayerNew&); void AddPlayer(Packet::PlayerNew&);
void DeletePlayer(Packet::PlayerDelete&); void RemovePlayer(Packet::PlayerDelete&);
void UpdatePlayer(Packet::PlayerUpdate&); void UpdatePlayer(Packet::PlayerUpdate&);
//services //services