From 4f88849caf6533d965849952c9ea153fd8c518c5 Mon Sep 17 00:00:00 2001 From: totycro Date: Sat, 9 Apr 2011 19:20:13 +0200 Subject: first version of multiplayer --- pacman-c++/server.cpp | 104 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 92 insertions(+), 12 deletions(-) (limited to 'pacman-c++/server.cpp') diff --git a/pacman-c++/server.cpp b/pacman-c++/server.cpp index 8539410..8f9e42d 100644 --- a/pacman-c++/server.cpp +++ b/pacman-c++/server.cpp @@ -1,34 +1,39 @@ #include "server.h" +#include +#include #include "util.h" - #include "pacman.pb.h" Server::Server(QWidget *parent) : SceneHolder(parent) { + qDebug() << "waiting for clients"; + waitForClientConnections(); + qDebug() << "clients connected"; + updateMap(Util::createDummyMap()); - Transmission::map_t map = calculateUpdates(); - for (int i=0; i<10; ++i) { - qDebug() << "doing srv update"; - updateMap(map); - } + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(tick())); + timer->start(500); } -QMap< Color::Color, Actor::Movement > Server::getActorDirections() +void Server::tick() { - QMap directions; - directions[Color::red] = Actor::Down; - return directions; + qDebug() << "doing srv update"; + Transmission::map_t map = calculateUpdates(); + updateMap(map); + + QSharedPointer packet = createUpdatePacket(map); + sendUpdate(packet); } Transmission::map_t Server::calculateUpdates() { Transmission::map_t map = Util::createEmptyMap(); - QMap directions = getActorDirections(); - QMapIterator i(directions); + QMapIterator i(m_actorMovements); while (i.hasNext()) { i.next(); Actor *actor = m_actors.value( i.key() ); @@ -52,8 +57,83 @@ Transmission::map_t Server::calculateUpdates() return map; } +QSharedPointer< ProtoBuf::MapUpdate > Server::createUpdatePacket(Transmission::map_t map) +{ + QSharedPointer updatePacket = + QSharedPointer(new ProtoBuf::MapUpdate); + + for (unsigned int x = 0; x < Constants::map_size.width; ++x) { + for (unsigned int y = 0; y < Constants::map_size.height; ++y) { + updatePacket->add_field(map[x][y]); + } + } + //qDebug() << "field sz "<< updatePacket->field_size(); + return updatePacket; +} + +void Server::waitForClientConnections() +{ + QTcpServer *tcpSrv = new QTcpServer(this); + // server must stay alive as long as sockets (qt parent mem mechanism) + tcpSrv->listen(QHostAddress::Any, Constants::port); + + //for (unsigned int i=0; iwaitForNewConnection(-1); + Q_ASSERT(connectionAvailable); + QTcpSocket *socket = tcpSrv->nextPendingConnection(); + // TODO: color assignment + m_clientConnections[Color::red] = socket; + connect(socket, SIGNAL(readyRead()), this, SLOT(keyPressUpdate())); + } +} + +void Server::sendUpdate(QSharedPointer< ProtoBuf::MapUpdate > packet) +{ + std::string dataStr = packet->SerializeAsString(); + const char *data = dataStr.c_str(); + foreach(QTcpSocket *socket, m_clientConnections) { + //qDebug() << "sending str len: " << dataStr.length(); + int bytesWritten = socket->write(data, dataStr.length()); + Q_ASSERT(bytesWritten == dataStr.length()); + } + foreach(QTcpSocket *socket, m_clientConnections) { + socket->flush(); + } +} + +void Server::keyPressUpdate() +{ + qDebug() << "kpress"; + QMapIterator i(m_clientConnections); + while (i.hasNext()) { + i.next(); + Color::Color color = i.key(); + QTcpSocket *socket = i.value(); + qDebug() << "data?"; + if (socket->bytesAvailable() > 0) { + qDebug() << "data!"; + QByteArray data = socket->readAll(); + // see mainwidget.cpp:153 + std::string dataStr; + for (int i = 0; i < data.size(); ++i) { + dataStr += data[i]; + } + ProtoBuf::KeyPressUpdate packet; + packet.ParseFromString(dataStr); + Transmission::field_t direction = packet.newkey(); + qDebug() << "data:" << direction; + m_actorMovements[ color ] = Util::transmissionMovementToActor(direction); + } + } + +} + + int main(int argc, char ** argv) { + GOOGLE_PROTOBUF_VERIFY_VERSION; + QApplication app(argc, argv); app.setApplicationName("Pacman Server"); app.setWindowIcon(QIcon(":/appicon")); -- cgit v1.2.3