summaryrefslogtreecommitdiffstats
path: root/pacman-c++/mainwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'pacman-c++/mainwidget.cpp')
-rw-r--r--pacman-c++/mainwidget.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp
index 5dc392c..d441607 100644
--- a/pacman-c++/mainwidget.cpp
+++ b/pacman-c++/mainwidget.cpp
@@ -35,11 +35,14 @@ MainWidget::MainWidget(QWidget *parent)
35 35
36 /* call updateMap after m_color ist set! */ 36 /* call updateMap after m_color ist set! */
37 createGui(); 37 createGui();
38 m_scene->updateMap(Util::createDemoMap()); 38 Transmission::map_t map = Util::createDemoMap();
39 m_scene->updateMap(map);
40 Util::deleteMap(map);
41 map = NULL;
39 42
40 connect(m_socket, SIGNAL(readyRead()), this, SLOT(tick())); 43 connect(m_socket, SIGNAL(readyRead()), this, SLOT(tick()));
41 44
42 QTimer *sendTimer = new QTimer(); 45 QTimer *sendTimer = new QTimer(this);
43 connect(sendTimer, SIGNAL(timeout()), this, SLOT(sendKeyUpdate())); 46 connect(sendTimer, SIGNAL(timeout()), this, SLOT(sendKeyUpdate()));
44 sendTimer->start(Constants::tick); 47 sendTimer->start(Constants::tick);
45 48
@@ -143,12 +146,12 @@ Transmission::field_t MainWidget::translateKey(int key)
143 146
144void MainWidget::tick() 147void MainWidget::tick()
145{ 148{
146 std::string dataStr; 149 //TODO: allocate + reuse packet
147 Util::QByteArrayToStdString(m_socket->readAll(), dataStr); 150 QSharedPointer<QByteArray> data = Util::receivePacket(m_socket);
148
149 ProtoBuf::MapUpdate packet; 151 ProtoBuf::MapUpdate packet;
150 bool worked = packet.ParseFromString(dataStr); 152 bool worked = packet.ParseFromArray(data->data(), data->size());
151 Q_ASSERT(worked); 153 Q_ASSERT(worked);
154 Q_UNUSED(worked);
152 Transmission::map_t map = Util::createUninitialisedMap(); 155 Transmission::map_t map = Util::createUninitialisedMap();
153 Q_ASSERT(packet.field_size() == (int) (Constants::map_size.width * Constants::map_size.height)); 156 Q_ASSERT(packet.field_size() == (int) (Constants::map_size.width * Constants::map_size.height));
154 int i = 0; 157 int i = 0;
@@ -161,7 +164,11 @@ void MainWidget::tick()
161 } 164 }
162 } 165 }
163 m_scene->updateMap(map); 166 m_scene->updateMap(map);
167 Util::deleteMap(map);
164 updateScore(packet); 168 updateScore(packet);
169
170 if (m_socket->bytesAvailable() > (qint64)sizeof(qint64))
171 tick();
165} 172}
166 173
167void MainWidget::keyPressEvent(QKeyEvent* event) 174void MainWidget::keyPressEvent(QKeyEvent* event)
@@ -226,28 +233,27 @@ void MainWidget::playerScoreClicked()
226 233
227Color::Color MainWidget::connectToServer() 234Color::Color MainWidget::connectToServer()
228{ 235{
229 // check command line arguments for server port 236 /* TODO: check command line arguments for server port */
230 const QStringList &args = QCoreApplication::arguments(); 237 const QStringList &args = QCoreApplication::arguments();
231 QString srv = args.value(1, "127.0.0.1"); 238 QString srv = args.value(1, "127.0.0.1");
232 qDebug() << "[Connect] server=" << srv; 239 qDebug() << "[Connect] server=" << srv;
233 240
234 // connect to server 241 /* connect to server */
235 m_socket = new QTcpSocket(this); 242 m_socket = new QTcpSocket(this);
236 m_socket->connectToHost(srv, Constants::Networking::port); 243 m_socket->connectToHost(srv, Constants::Networking::port);
237 bool worked = m_socket->waitForConnected(Constants::Networking::connection_timeout); 244 bool worked = m_socket->waitForConnected(Constants::Networking::connection_timeout);
238 if (worked) 245 if (worked)
239 { 246 {
240 // additional init 247 /* additional init: first packet is our color */
241 // first packet is our color
242 worked = m_socket->waitForReadyRead(); 248 worked = m_socket->waitForReadyRead();
243 if (worked) 249 if (worked)
244 { 250 {
245 // receive color 251 /* receive color */
246 std::string data; 252 QSharedPointer<QByteArray> data = Util::receivePacket(m_socket);
247 Util::QByteArrayToStdString(m_socket->readAll(), data);
248 ProtoBuf::WhoAmI packet; 253 ProtoBuf::WhoAmI packet;
249 bool worked = packet.ParseFromString(data); 254 bool worked = packet.ParseFromArray(data->data(), data->size());
250 Q_ASSERT(worked); 255 Q_ASSERT(worked);
256 Q_UNUSED(worked);
251 return static_cast<Color::Color>(packet.color() & Transmission::color_mask); 257 return static_cast<Color::Color>(packet.color() & Transmission::color_mask);
252 } 258 }
253 } 259 }