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:
+61
-26
@@ -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<int,PlayerCharacter>::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<int,PlayerCharacter>::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<void*>(&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) {
|
||||
//
|
||||
}
|
||||
|
||||
+10
-4
@@ -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 <map>
|
||||
|
||||
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<ConfigUtility>::Get();
|
||||
SurfaceManager* surfaceMgr = Singleton<SurfaceManager>::Get();
|
||||
@@ -75,7 +81,7 @@ protected:
|
||||
|
||||
//members
|
||||
RasterFont font;
|
||||
PlayerCharacter pc;
|
||||
std::map<int, PlayerCharacter> playerCharacters;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+7
-7
@@ -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:
|
||||
|
||||
@@ -98,6 +98,8 @@ struct PlayerNew {
|
||||
int clientIndex;
|
||||
char handle[PACKET_STRING_SIZE];
|
||||
char avatar[PACKET_STRING_SIZE];
|
||||
Vector2 position;
|
||||
Vector2 motion;
|
||||
//TODO Playerdata
|
||||
};
|
||||
|
||||
|
||||
@@ -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<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);
|
||||
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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user