Multiplayer framework in place (can now connect multiple clients and view them in game)
This commit is contained in:
1 parent
3e178b4d97
commit
abd731f3ca
9 files changed
+308
-146
No files matched your search
+127
-57
@@ -6,10 +6,8 @@ Server::Server(sf::Uint16 port)
|
||||
{
|
||||
m_net_server = new Network();
|
||||
m_net_server->Create(port, sf::IpAddress::None);
|
||||
m_player = new Player();
|
||||
m_player->x = 0;
|
||||
m_player->y = 0;
|
||||
m_player->direction = M_PI_2;
|
||||
m_players = new std::map<sf::Uint8, Player>;
|
||||
m_players->clear();
|
||||
}
|
||||
|
||||
Server::~Server()
|
||||
@@ -40,65 +38,137 @@ void Server::update( double elapsed_time )
|
||||
static Player player_prev;
|
||||
const double move_speed = 75.0;
|
||||
sf::Packet server_packet;
|
||||
static sf::Uint8 w_pressed = KEY_NOT_PRESSED;
|
||||
static sf::Uint8 a_pressed = KEY_NOT_PRESSED;
|
||||
static sf::Uint8 s_pressed = KEY_NOT_PRESSED;
|
||||
static sf::Uint8 d_pressed = KEY_NOT_PRESSED;
|
||||
static sf::Int32 rel_mouse_movement = 0;
|
||||
|
||||
m_net_server->Receive();
|
||||
// Handle all received data (only really want the latest)
|
||||
while(m_net_server->getData(server_packet))
|
||||
{
|
||||
server_packet >> w_pressed;
|
||||
server_packet >> a_pressed;
|
||||
server_packet >> s_pressed;
|
||||
server_packet >> d_pressed;
|
||||
server_packet >> rel_mouse_movement;
|
||||
sf::Uint8 ptype;
|
||||
// Get packet type
|
||||
server_packet >> ptype;
|
||||
switch(ptype)
|
||||
{
|
||||
case PLAYER_CONNECT:
|
||||
{
|
||||
Player p;
|
||||
std::string pname;
|
||||
sf::Uint8 pindex;
|
||||
|
||||
server_packet >> pindex;
|
||||
server_packet >> pname;
|
||||
// When a player connects, we need to associate
|
||||
// that player with a new ID. find first unused id
|
||||
// player zero means a player does not exist.
|
||||
if(pindex == 0)
|
||||
{
|
||||
for(pindex = 1u; pindex < 255u; pindex++ )
|
||||
{
|
||||
if(m_players->end() == m_players->find(pindex))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
p.name = pname;
|
||||
(*m_players)[pindex] = p;
|
||||
|
||||
// Send a response to the newly added player
|
||||
server_packet.clear();
|
||||
server_packet << ptype;
|
||||
server_packet << pindex;
|
||||
server_packet << p.name;
|
||||
m_net_server->sendData(server_packet, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PLAYER_UPDATE:
|
||||
{
|
||||
// Need to determine the correct player id
|
||||
// then update the stored contents.
|
||||
sf::Uint8 pindex;
|
||||
server_packet >> pindex;
|
||||
if(m_players->end() != m_players->find(pindex))
|
||||
{
|
||||
server_packet >> (*m_players)[pindex].w_pressed;
|
||||
server_packet >> (*m_players)[pindex].a_pressed;
|
||||
server_packet >> (*m_players)[pindex].s_pressed;
|
||||
server_packet >> (*m_players)[pindex].d_pressed;
|
||||
server_packet >> (*m_players)[pindex].rel_mouse_movement;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PLAYER_DISCONNECT:
|
||||
{
|
||||
// This completely removes the player from the game
|
||||
// Deletes member from the player list
|
||||
break;
|
||||
}
|
||||
case PLAYER_DEATH:
|
||||
{
|
||||
// This just forces the player to dissapper from the
|
||||
// playing field.
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Just eat the packet
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(std::map<sf::Uint8, Player>::iterator piter = m_players->begin(); piter != m_players->end(); piter++)
|
||||
{
|
||||
sf::Uint8 pindex = piter->first;
|
||||
double direction = (*m_players)[pindex].direction;
|
||||
direction -= M_PI * 0.5 * (*m_players)[pindex].rel_mouse_movement / 1000;
|
||||
if(direction != (*m_players)[pindex].direction)
|
||||
{
|
||||
(*m_players)[pindex].direction = direction;
|
||||
(*m_players)[pindex].updated = true;
|
||||
}
|
||||
if (KEY_PRESSED == (*m_players)[pindex].a_pressed)
|
||||
{
|
||||
direction = (*m_players)[pindex].direction + M_PI_2;
|
||||
(*m_players)[pindex].x += cos(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].y += sin(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].updated = true;
|
||||
}
|
||||
if (KEY_PRESSED == (*m_players)[pindex].d_pressed)
|
||||
{
|
||||
direction = (*m_players)[pindex].direction - M_PI_2;
|
||||
(*m_players)[pindex].x += cos(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].y += sin(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].updated = true;
|
||||
}
|
||||
if (KEY_PRESSED == (*m_players)[pindex].w_pressed)
|
||||
{
|
||||
direction = (*m_players)[pindex].direction;
|
||||
(*m_players)[pindex].x += cos(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].y += sin(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].updated = true;
|
||||
}
|
||||
if (KEY_PRESSED == (*m_players)[pindex].s_pressed)
|
||||
{
|
||||
direction = (*m_players)[pindex].direction + M_PI;
|
||||
(*m_players)[pindex].x += cos(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].y += sin(direction) * move_speed * elapsed_time;
|
||||
(*m_players)[pindex].updated = true;
|
||||
}
|
||||
|
||||
server_packet.clear();
|
||||
|
||||
if (KEY_PRESSED == a_pressed)
|
||||
{
|
||||
double direction = m_player->direction + M_PI_2;
|
||||
m_player->x += cos(direction) * move_speed * elapsed_time;
|
||||
m_player->y += sin(direction) * move_speed * elapsed_time;
|
||||
}
|
||||
if (KEY_PRESSED == d_pressed)
|
||||
{
|
||||
double direction = m_player->direction - M_PI_2;
|
||||
m_player->x += cos(direction) * move_speed * elapsed_time;
|
||||
m_player->y += sin(direction) * move_speed * elapsed_time;
|
||||
}
|
||||
if (KEY_PRESSED == w_pressed)
|
||||
{
|
||||
double direction = m_player->direction;
|
||||
m_player->x += cos(direction) * move_speed * elapsed_time;
|
||||
m_player->y += sin(direction) * move_speed * elapsed_time;
|
||||
}
|
||||
if (KEY_PRESSED == s_pressed)
|
||||
{
|
||||
double direction = m_player->direction + M_PI;
|
||||
m_player->x += cos(direction) * move_speed * elapsed_time;
|
||||
m_player->y += sin(direction) * move_speed * elapsed_time;
|
||||
}
|
||||
m_player->direction -= M_PI * 0.5 * rel_mouse_movement / 1000;
|
||||
|
||||
server_packet.clear();
|
||||
|
||||
// Send the player update if there were changes
|
||||
if((player_prev.direction != m_player->direction) ||
|
||||
(player_prev.x != m_player->x) ||
|
||||
(player_prev.y != m_player->y))
|
||||
{
|
||||
server_packet << m_player->direction;
|
||||
server_packet << m_player->x;
|
||||
server_packet << m_player->y;
|
||||
m_net_server->sendData(server_packet);
|
||||
|
||||
player_prev.direction = m_player->direction;
|
||||
player_prev.x = m_player->x;
|
||||
player_prev.y = m_player->y;
|
||||
}
|
||||
|
||||
// Send the player update if there were changes
|
||||
if((*m_players)[pindex].updated)
|
||||
{
|
||||
sf::Uint8 ptype = PLAYER_UPDATE;
|
||||
server_packet << ptype;
|
||||
server_packet << pindex;
|
||||
server_packet << (*m_players)[pindex].direction;
|
||||
server_packet << (*m_players)[pindex].x;
|
||||
server_packet << (*m_players)[pindex].y;
|
||||
m_net_server->sendData(server_packet);
|
||||
(*m_players)[pindex].updated = false;
|
||||
}
|
||||
}
|
||||
m_net_server->Transmit();
|
||||
}
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
#include "Network.h"
|
||||
#include "Player.h"
|
||||
#include "refptr.h"
|
||||
#include "SFML/Config.hpp"
|
||||
|
||||
class Server{
|
||||
public:
|
||||
@@ -11,6 +12,6 @@ class Server{
|
||||
protected:
|
||||
void update(double elapsed_time);
|
||||
refptr<Network> m_net_server;
|
||||
refptr<Player> m_player;
|
||||
refptr< std::map<sf::Uint8, Player> > m_players;
|
||||
sf::Clock m_clock;
|
||||
};
|
||||
Reference in new issue
Block a user