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++/mainwidget.cpp | 82 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 14 deletions(-) (limited to 'pacman-c++/mainwidget.cpp') diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp index 06a0b9c..da08d89 100644 --- a/pacman-c++/mainwidget.cpp +++ b/pacman-c++/mainwidget.cpp @@ -4,6 +4,7 @@ #include "constants.h" #include "audioplayer.h" #include "util.h" +#include "pacman.pb.h" MainWidget::MainWidget(QWidget *parent) : SceneHolder(parent), m_currentKey(0), m_running(false) @@ -14,9 +15,15 @@ MainWidget::MainWidget(QWidget *parent) //connect(AudioPlayer::self(), SIGNAL(finished()), this, SLOT(startGame())); //AudioPlayer::self()->play(AudioPlayer::Intro); - QTimer *timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(tick())); - timer->start(Constants::tick); + bool connected = connectToServer(); + if (!connected) { + QMessageBox::critical(this, "Error", "Failed to connect to server, falling back to local test mode"); + // TODO: quit application here or sth + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(tick())); + timer->start(Constants::tick); + } + connect(m_socket, SIGNAL(readyRead()), this, SLOT(tick())); startGame(); } @@ -120,21 +127,49 @@ Transmission::field_t MainWidget::translateKey(int key) void MainWidget::tick() { - Actor::Movement mov = Util::transmissionMovementToActor(m_currentKey, Actor::None); +#if 0 + Actor::Movement mov = Util::transmissionMovementToActor(m_currentKey, Actor::None); - QMapIterator i(m_actors); - while (i.hasNext()) - { - i.next(); - i.value()->move(mov); - QList list(i.value()->collidingItems()); - for(int j = 0; j < list.count(); ++j) + QMapIterator i(m_actors); + while (i.hasNext()) { - if (list.at(j)->parentItem() == i.value()) - continue; - list.at(j)->setOpacity(0.6); + i.next(); + i.value()->move(mov); + QList list(i.value()->collidingItems()); + for(int j = 0; j < list.count(); ++j) + { + if (list.at(j)->parentItem() == i.value()) + continue; + list.at(j)->setOpacity(0.6); + } + } +#else + QByteArray data = m_socket->readAll(); + //qDebug() << "read qbytes " << data.length(); + // TODO: normal conversion to std::string won't work, + // probably due to \0-bytes. both those methods will yield + // a 3 char long string + //std::string dataStr = std::string(data.constData()); + //std::string dataStr = QString(data).toStdString(); + std::string dataStr; + for (int i = 0; i < data.size(); ++i) { + dataStr += data[i]; + } + + //qDebug() << "read str " << dataStr.length(); + ProtoBuf::MapUpdate packet; + packet.ParseFromString(dataStr); + Transmission::map_t map = Util::createUninitialisedMap(); + Q_ASSERT(packet.field_size() == (int) (Constants::map_size.width * Constants::map_size.height)); + int i = 0; + for (unsigned int x = 0; x < Constants::map_size.width; ++x) { + for (unsigned int y = 0; y < Constants::map_size.height; ++y) { + map[x][y] = packet.field(i); + ++i; } } + updateMap(map); + #endif } @@ -144,8 +179,19 @@ void MainWidget::keyPressEvent(QKeyEvent* event) return; QWidget::keyPressEvent(event); + // TODO: remove m_currentKey when we don't need it any more for testing m_currentKey = translateKey(event->key()); + // send to server + ProtoBuf::KeyPressUpdate packet; + packet.set_newkey(m_currentKey); + std::string dataStr = packet.SerializeAsString(); + unsigned int bytesWritten = m_socket->write(dataStr.c_str(), dataStr.length()); + m_socket->flush(); + Q_ASSERT(bytesWritten == dataStr.length()); + + qDebug() << "send key: " << m_currentKey; + return; // test stuff @@ -186,3 +232,11 @@ void MainWidget::playerScoreClicked() tmp->setChecked(true); return; } + +bool MainWidget::connectToServer() +{ + m_socket = new QTcpSocket(this); + m_socket->connectToHost("127.0.0.1", Constants::port); + return m_socket->waitForConnected(3000); +} + -- cgit v1.2.3