summaryrefslogtreecommitdiffstats
path: root/pacman-c++/client
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2011-05-11 17:38:29 +0200
committermanuel <manuel@mausz.at>2011-05-11 17:38:29 +0200
commitca29fc0babe8fc985a9e4656f80fc7faec4ac8a5 (patch)
treefb48f74ffcddcd8b260ebf78062623427aeda862 /pacman-c++/client
parent535c342a2f28e0a1e90010b2f0ff4018eeeb200a (diff)
downloadfoop-ca29fc0babe8fc985a9e4656f80fc7faec4ac8a5.tar.gz
foop-ca29fc0babe8fc985a9e4656f80fc7faec4ac8a5.tar.bz2
foop-ca29fc0babe8fc985a9e4656f80fc7faec4ac8a5.zip
- fix audio plugin and make that a real interface
- that fixes a duplicate statis audiomanager (1x pacman, 1x audio plugin) on windows - display won/lost dialog upon gameend
Diffstat (limited to 'pacman-c++/client')
-rw-r--r--pacman-c++/client/client.cpp14
-rw-r--r--pacman-c++/client/mainwidget.cpp95
-rw-r--r--pacman-c++/client/mainwidget.h7
3 files changed, 76 insertions, 40 deletions
diff --git a/pacman-c++/client/client.cpp b/pacman-c++/client/client.cpp
index a00249b..d20e6bf 100644
--- a/pacman-c++/client/client.cpp
+++ b/pacman-c++/client/client.cpp
@@ -9,16 +9,14 @@ extern "C" {
9} 9}
10 10
11Client::Client() 11Client::Client()
12 : m_ambientMuted(false) 12 : m_dialog(NULL), m_ambientMuted(false)
13{ 13{
14 m_settings = new QSettings(qApp->organizationName(), qApp->applicationName(), this); 14 m_settings = new QSettings(qApp->organizationName(), qApp->applicationName(), this);
15 m_dialog = new QDialog(this);
16 m_mainWidget = new MainWidget(this); 15 m_mainWidget = new MainWidget(this);
17 createMenu(); 16 createMenu();
18 m_mainWidget->setAmbientMuted(m_ambientMuted); 17 m_mainWidget->setAmbientMuted(m_ambientMuted);
19 setCentralWidget(m_mainWidget); 18 setCentralWidget(m_mainWidget);
20 showConnectDialog(); 19 showConnectDialog();
21 m_dialog->setFocus();
22} 20}
23 21
24void Client::createMenu() 22void Client::createMenu()
@@ -81,6 +79,7 @@ void Client::createMenu()
81 disconnectAction->setDisabled(true); 79 disconnectAction->setDisabled(true);
82 fileMenu->addAction(disconnectAction); 80 fileMenu->addAction(disconnectAction);
83 connect(disconnectAction, SIGNAL(triggered()), m_mainWidget, SLOT(doDisconnect())); 81 connect(disconnectAction, SIGNAL(triggered()), m_mainWidget, SLOT(doDisconnect()));
82 connect(disconnectAction, SIGNAL(triggered()), m_mainWidget, SLOT(deleteGUI()));
84 connect(m_mainWidget, SIGNAL(connected(bool)), disconnectAction, SLOT(setEnabled(bool))); 83 connect(m_mainWidget, SIGNAL(connected(bool)), disconnectAction, SLOT(setEnabled(bool)));
85 84
86 /* exit entry */ 85 /* exit entry */
@@ -134,10 +133,8 @@ QPixmap Client::soundIcon(bool enabled) const
134void Client::showAbout() 133void Client::showAbout()
135{ 134{
136 if (m_dialog != NULL) 135 if (m_dialog != NULL)
137 {
138 delete m_dialog; 136 delete m_dialog;
139 m_dialog = new QDialog(this); 137 m_dialog = new QDialog(this);
140 }
141 m_dialog->setWindowTitle("About Pacman"); 138 m_dialog->setWindowTitle("About Pacman");
142 m_dialog->setWindowFlags(m_dialog->windowFlags() & ~Qt::WindowContextHelpButtonHint); 139 m_dialog->setWindowFlags(m_dialog->windowFlags() & ~Qt::WindowContextHelpButtonHint);
143 140
@@ -176,10 +173,9 @@ void Client::showAbout()
176void Client::showConnectDialog() 173void Client::showConnectDialog()
177{ 174{
178 if (m_dialog != NULL) 175 if (m_dialog != NULL)
179 {
180 delete m_dialog; 176 delete m_dialog;
181 m_dialog = new QDialog(this); 177 m_dialog = new QDialog(this);
182 } 178 m_dialog->setModal(true);
183 m_dialog->setWindowTitle("Connect"); 179 m_dialog->setWindowTitle("Connect");
184 180
185 QGridLayout *layout = new QGridLayout(m_dialog); 181 QGridLayout *layout = new QGridLayout(m_dialog);
diff --git a/pacman-c++/client/mainwidget.cpp b/pacman-c++/client/mainwidget.cpp
index f2e3f46..99b0f5b 100644
--- a/pacman-c++/client/mainwidget.cpp
+++ b/pacman-c++/client/mainwidget.cpp
@@ -22,13 +22,14 @@ MainWidget::MainWidget(QWidget *parent)
22 m_ambientPlayer = new GaplessAudioPlayer(Sound::Ambient, 100, this); 22 m_ambientPlayer = new GaplessAudioPlayer(Sound::Ambient, 100, this);
23 23
24 m_recvTimer = new QTimer(this); 24 m_recvTimer = new QTimer(this);
25 m_recvTimer->setInterval(Constants::tick / 2); 25 m_recvTimer->setInterval(Constants::Networking::recv_interval);
26 connect(m_recvTimer, SIGNAL(timeout()), this, SLOT(tick())); 26 connect(m_recvTimer, SIGNAL(timeout()), this, SLOT(readServerUpdates()));
27} 27}
28 28
29MainWidget::~MainWidget() 29MainWidget::~MainWidget()
30{ 30{
31 doDisconnect(); 31 doDisconnect();
32 deleteGUI();
32 if (m_host != NULL) 33 if (m_host != NULL)
33 { 34 {
34 enet_host_destroy(m_host); 35 enet_host_destroy(m_host);
@@ -38,6 +39,10 @@ MainWidget::~MainWidget()
38 39
39void MainWidget::doConnect(QString srv, unsigned int port) 40void MainWidget::doConnect(QString srv, unsigned int port)
40{ 41{
42 /* preload sound - this eliminates some loading gap on slower computers */
43 AudioManager::self()->setSource(Sound::Intro);
44 deleteGUI();
45
41 Color::Color color = connectToServer(srv, port); 46 Color::Color color = connectToServer(srv, port);
42 if (color == Color::none) 47 if (color == Color::none)
43 { 48 {
@@ -48,7 +53,7 @@ void MainWidget::doConnect(QString srv, unsigned int port)
48 /* create our scene */ 53 /* create our scene */
49 m_scene = new SceneHolder(this); 54 m_scene = new SceneHolder(this);
50 m_scene->setColor(color); 55 m_scene->setColor(color);
51 m_scene->showWaitingForPlayers(true); 56 m_scene->showWaitingForPlayers();
52 createGui(); 57 createGui();
53 58
54 m_recvTimer->start(); 59 m_recvTimer->start();
@@ -77,13 +82,26 @@ void MainWidget::deleteLayout(QLayout *layout)
77 delete layout; 82 delete layout;
78} 83}
79 84
85void MainWidget::deleteGUI()
86{
87 deleteLayout(layout());
88 m_playerScoreLayouts.clear();
89}
90
80void MainWidget::doDisconnect() 91void MainWidget::doDisconnect()
81{ 92{
93 if (!connected())
94 return;
95 closeENetPeer();
96 onDisconnect();
97}
98
99void MainWidget::onDisconnect()
100{
82 stopGame(); 101 stopGame();
83 m_recvTimer->stop(); 102 m_recvTimer->stop();
84 closeENetPeer(); 103 m_scene->clear();
85 deleteLayout(layout()); 104 m_scene->showWonLost(didIWinLoose());
86 m_playerScoreLayouts.clear();
87 emit connected(false); 105 emit connected(false);
88} 106}
89 107
@@ -157,6 +175,23 @@ void MainWidget::updateScore(const ProtoBuf::MapUpdate& packet)
157 } 175 }
158} 176}
159 177
178bool MainWidget::didIWinLoose()
179{
180 QGridLayout *score = m_playerScoreLayouts.at(0);
181 QLabel *allPointsLbl = dynamic_cast<QLabel *>(score->itemAtPosition(1, 1)->widget());
182 unsigned long myscore = allPointsLbl->text().toULong();
183
184 for(unsigned i = 1; i < m_maxplayers; ++i)
185 {
186 QGridLayout *score = m_playerScoreLayouts.at(i);
187 QLabel *allPointsLbl = dynamic_cast<QLabel *>(score->itemAtPosition(1, 1)->widget());
188 unsigned long other = allPointsLbl->text().toULong();
189 if (other > myscore)
190 return false;
191 }
192 return true;
193}
194
160Transmission::field_t MainWidget::translateKey(int key) 195Transmission::field_t MainWidget::translateKey(int key)
161{ 196{
162 switch(key) 197 switch(key)
@@ -182,7 +217,7 @@ Transmission::field_t MainWidget::translateKey(int key)
182 } 217 }
183} 218}
184 219
185void MainWidget::tick() 220void MainWidget::readServerUpdates()
186{ 221{
187 ENetEvent event; 222 ENetEvent event;
188 while (enet_host_service(m_host, &event, 1) > 0) 223 while (enet_host_service(m_host, &event, 1) > 0)
@@ -191,10 +226,10 @@ void MainWidget::tick()
191 { 226 {
192 case ENET_EVENT_TYPE_DISCONNECT: 227 case ENET_EVENT_TYPE_DISCONNECT:
193 m_peer = NULL; 228 m_peer = NULL;
194 doDisconnect(); 229 onDisconnect();
195 break; 230 break;
196 case ENET_EVENT_TYPE_RECEIVE: 231 case ENET_EVENT_TYPE_RECEIVE:
197 tick(&event); 232 processServerUpdates(&event);
198 enet_packet_destroy(event.packet); 233 enet_packet_destroy(event.packet);
199 break; 234 break;
200 default: 235 default:
@@ -203,18 +238,22 @@ void MainWidget::tick()
203 } 238 }
204} 239}
205 240
206void MainWidget::tick(ENetEvent *event) 241void MainWidget::processServerUpdates(ENetEvent *event)
207{ 242{
208 QSharedPointer<QByteArray> data = Util::receivePacket(event->packet); 243 QSharedPointer<QByteArray> data = Util::receivePacket(event->packet);
209 bool worked = m_updatepacket.ParseFromArray(data->data(), data->size()); 244 if (!m_updatepacket.ParseFromArray(data->data(), data->size()))
210 Q_ASSERT(worked); 245 {
211 Q_UNUSED(worked); 246 qWarning() << "Invalid update packet from server";
247 return;
248 }
212 249
213 /* eating order data set indicates a new round */ 250 /* eating order data set indicates a new round */
214 if (m_updatepacket.eating_order_size() > 0) 251 if (m_updatepacket.eating_order_size() > 0)
215 { 252 {
216 Q_ASSERT(m_scene != NULL); 253 Q_ASSERT(m_scene != NULL);
217 m_scene->reset(); 254
255 /* stop game */
256 stopGame();
218 257
219 /* fetch eating order */ 258 /* fetch eating order */
220 QList<Color::Color> order; 259 QList<Color::Color> order;
@@ -222,16 +261,13 @@ void MainWidget::tick(ENetEvent *event)
222 order.append(static_cast<Color::Color>(m_updatepacket.eating_order(i) & Transmission::color_mask)); 261 order.append(static_cast<Color::Color>(m_updatepacket.eating_order(i) & Transmission::color_mask));
223 m_scene->setEatingOrder(order); 262 m_scene->setEatingOrder(order);
224 263
225 /* stop game */
226 stopGame();
227
228 /* and restart game */ 264 /* and restart game */
229 QTimer *timer = new QTimer(this); 265 QTimer *timer = new QTimer(this);
230 timer->setSingleShot(true); 266 timer->setSingleShot(true);
231 timer->setInterval(Sound::length[Sound::Intro] + Constants::tick); 267 timer->setInterval(Sound::length[Sound::Intro] + Constants::tick);
232 connect(timer, SIGNAL(timeout()), this, SLOT(startGame())); 268 connect(timer, SIGNAL(timeout()), this, SLOT(startGame()));
233 timer->start(); 269 timer->start();
234 AudioManager::self()->audioPlayer()->play(Sound::Intro); 270 AudioManager::self()->play(Sound::Intro);
235 } 271 }
236 272
237 Transmission::map_t map = Util::createUninitialisedMap(); 273 Transmission::map_t map = Util::createUninitialisedMap();
@@ -250,10 +286,7 @@ void MainWidget::tick(ENetEvent *event)
250 updateScore(m_updatepacket); 286 updateScore(m_updatepacket);
251 287
252 if (m_updatepacket.eating_order_size() > 0) 288 if (m_updatepacket.eating_order_size() > 0)
253 {
254 m_scene->showWaitingForPlayers(false);
255 m_scene->showEatingText(); 289 m_scene->showEatingText();
256 }
257} 290}
258 291
259void MainWidget::keyPressEvent(QKeyEvent* event) 292void MainWidget::keyPressEvent(QKeyEvent* event)
@@ -273,11 +306,13 @@ void MainWidget::keyPressEvent(QKeyEvent* event)
273 306
274void MainWidget::sendKeyUpdate() 307void MainWidget::sendKeyUpdate()
275{ 308{
309 if (!connected())
310 return;
276 if (m_currentKey == Transmission::direction_none) 311 if (m_currentKey == Transmission::direction_none)
277 return; 312 return;
278 qDebug() << "[SendKey] key=" << m_currentKey; 313 qDebug() << "[SendKey] key=" << m_currentKey;
279 ProtoBuf::KeyPressUpdate packet; 314 ProtoBuf::ClientUpdate packet;
280 packet.set_newkey(m_currentKey); 315 packet.set_new_direction(m_currentKey);
281 Util::sendPacket(packet, m_peer, m_host); 316 Util::sendPacket(packet, m_peer, m_host);
282} 317}
283 318
@@ -294,7 +329,7 @@ void MainWidget::keyReleaseEvent(QKeyEvent* event)
294void MainWidget::startGame() 329void MainWidget::startGame()
295{ 330{
296 disconnect(AudioManager::self()->audioPlayer(), NULL, this, SLOT(startGame())); 331 disconnect(AudioManager::self()->audioPlayer(), NULL, this, SLOT(startGame()));
297 m_scene->showEatingText(false); 332 m_scene->hideOverlayText();
298 m_running = true; 333 m_running = true;
299 sendKeyUpdate(); 334 sendKeyUpdate();
300 m_ambientPlayer->play(); 335 m_ambientPlayer->play();
@@ -304,6 +339,7 @@ void MainWidget::stopGame()
304{ 339{
305 m_running = false; 340 m_running = false;
306 m_ambientPlayer->pause(); 341 m_ambientPlayer->pause();
342 m_scene->reset();
307} 343}
308 344
309void MainWidget::setAmbientMuted(bool muted) 345void MainWidget::setAmbientMuted(bool muted)
@@ -348,11 +384,12 @@ Color::Color MainWidget::connectToServer(QString srv, unsigned int port)
348 QSharedPointer<QByteArray> data = Util::receivePacket(event.packet); 384 QSharedPointer<QByteArray> data = Util::receivePacket(event.packet);
349 enet_packet_destroy(event.packet); 385 enet_packet_destroy(event.packet);
350 ProtoBuf::Init packet; 386 ProtoBuf::Init packet;
351 worked = packet.ParseFromArray(data->data(), data->size()); 387 if (packet.ParseFromArray(data->data(), data->size()))
352 Q_ASSERT(worked); 388 {
353 Q_UNUSED(worked); 389 m_maxplayers = packet.maxplayers();
354 m_maxplayers = packet.maxplayers(); 390 return static_cast<Color::Color>(packet.color() & Transmission::color_mask);
355 return static_cast<Color::Color>(packet.color() & Transmission::color_mask); 391 }
392 qWarning() << "Invalid initialize packet from server";
356 } 393 }
357 } 394 }
358 enet_peer_reset(m_peer); 395 enet_peer_reset(m_peer);
diff --git a/pacman-c++/client/mainwidget.h b/pacman-c++/client/mainwidget.h
index 99ff7d7..cfc6cf8 100644
--- a/pacman-c++/client/mainwidget.h
+++ b/pacman-c++/client/mainwidget.h
@@ -28,6 +28,8 @@ public:
28public slots: 28public slots:
29 void doConnect(QString srv = "127.0.0.1", unsigned int port = Constants::Networking::port); 29 void doConnect(QString srv = "127.0.0.1", unsigned int port = Constants::Networking::port);
30 void doDisconnect(); 30 void doDisconnect();
31 void onDisconnect();
32 void deleteGUI();
31 33
32protected: 34protected:
33 /* handling of current key */ 35 /* handling of current key */
@@ -41,14 +43,15 @@ private slots:
41 void startGame(); 43 void startGame();
42 void stopGame(); 44 void stopGame();
43 void playerScoreClicked(); 45 void playerScoreClicked();
44 void tick(); 46 void readServerUpdates();
45 void tick(ENetEvent *event); 47 void processServerUpdates(ENetEvent *event);
46 void sendKeyUpdate(); 48 void sendKeyUpdate();
47 49
48private: 50private:
49 void createGui(); 51 void createGui();
50 void createMenu(); 52 void createMenu();
51 void updateScore(const ProtoBuf::MapUpdate&); 53 void updateScore(const ProtoBuf::MapUpdate&);
54 bool didIWinLoose();
52 bool isRunning(); 55 bool isRunning();
53 Color::Color connectToServer(QString srv = "127.0.0.1", unsigned int port = Constants::Networking::port); 56 Color::Color connectToServer(QString srv = "127.0.0.1", unsigned int port = Constants::Networking::port);
54 void closeENetPeer(); 57 void closeENetPeer();