diff options
| author | manuel <manuel@mausz.at> | 2011-05-11 17:38:29 +0200 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2011-05-11 17:38:29 +0200 |
| commit | ca29fc0babe8fc985a9e4656f80fc7faec4ac8a5 (patch) | |
| tree | fb48f74ffcddcd8b260ebf78062623427aeda862 /pacman-c++/client/mainwidget.cpp | |
| parent | 535c342a2f28e0a1e90010b2f0ff4018eeeb200a (diff) | |
| download | foop-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/mainwidget.cpp')
| -rw-r--r-- | pacman-c++/client/mainwidget.cpp | 95 |
1 files changed, 66 insertions, 29 deletions
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 | ||
| 29 | MainWidget::~MainWidget() | 29 | MainWidget::~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 | ||
| 39 | void MainWidget::doConnect(QString srv, unsigned int port) | 40 | void 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 | ||
| 85 | void MainWidget::deleteGUI() | ||
| 86 | { | ||
| 87 | deleteLayout(layout()); | ||
| 88 | m_playerScoreLayouts.clear(); | ||
| 89 | } | ||
| 90 | |||
| 80 | void MainWidget::doDisconnect() | 91 | void MainWidget::doDisconnect() |
| 81 | { | 92 | { |
| 93 | if (!connected()) | ||
| 94 | return; | ||
| 95 | closeENetPeer(); | ||
| 96 | onDisconnect(); | ||
| 97 | } | ||
| 98 | |||
| 99 | void 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 | ||
| 178 | bool 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 | |||
| 160 | Transmission::field_t MainWidget::translateKey(int key) | 195 | Transmission::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 | ||
| 185 | void MainWidget::tick() | 220 | void 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 | ||
| 206 | void MainWidget::tick(ENetEvent *event) | 241 | void 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 | ||
| 259 | void MainWidget::keyPressEvent(QKeyEvent* event) | 292 | void MainWidget::keyPressEvent(QKeyEvent* event) |
| @@ -273,11 +306,13 @@ void MainWidget::keyPressEvent(QKeyEvent* event) | |||
| 273 | 306 | ||
| 274 | void MainWidget::sendKeyUpdate() | 307 | void 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) | |||
| 294 | void MainWidget::startGame() | 329 | void 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 | ||
| 309 | void MainWidget::setAmbientMuted(bool muted) | 345 | void 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); |
