From ca29fc0babe8fc985a9e4656f80fc7faec4ac8a5 Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 11 May 2011 17:38:29 +0200 Subject: - 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 --- pacman-c++/client/client.cpp | 14 +++--- pacman-c++/client/mainwidget.cpp | 95 ++++++++++++++++++++++++++++------------ pacman-c++/client/mainwidget.h | 7 ++- 3 files changed, 76 insertions(+), 40 deletions(-) (limited to 'pacman-c++/client') 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" { } Client::Client() - : m_ambientMuted(false) + : m_dialog(NULL), m_ambientMuted(false) { m_settings = new QSettings(qApp->organizationName(), qApp->applicationName(), this); - m_dialog = new QDialog(this); m_mainWidget = new MainWidget(this); createMenu(); m_mainWidget->setAmbientMuted(m_ambientMuted); setCentralWidget(m_mainWidget); showConnectDialog(); - m_dialog->setFocus(); } void Client::createMenu() @@ -81,6 +79,7 @@ void Client::createMenu() disconnectAction->setDisabled(true); fileMenu->addAction(disconnectAction); connect(disconnectAction, SIGNAL(triggered()), m_mainWidget, SLOT(doDisconnect())); + connect(disconnectAction, SIGNAL(triggered()), m_mainWidget, SLOT(deleteGUI())); connect(m_mainWidget, SIGNAL(connected(bool)), disconnectAction, SLOT(setEnabled(bool))); /* exit entry */ @@ -134,10 +133,8 @@ QPixmap Client::soundIcon(bool enabled) const void Client::showAbout() { if (m_dialog != NULL) - { delete m_dialog; - m_dialog = new QDialog(this); - } + m_dialog = new QDialog(this); m_dialog->setWindowTitle("About Pacman"); m_dialog->setWindowFlags(m_dialog->windowFlags() & ~Qt::WindowContextHelpButtonHint); @@ -176,10 +173,9 @@ void Client::showAbout() void Client::showConnectDialog() { if (m_dialog != NULL) - { delete m_dialog; - m_dialog = new QDialog(this); - } + m_dialog = new QDialog(this); + m_dialog->setModal(true); m_dialog->setWindowTitle("Connect"); 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) m_ambientPlayer = new GaplessAudioPlayer(Sound::Ambient, 100, this); m_recvTimer = new QTimer(this); - m_recvTimer->setInterval(Constants::tick / 2); - connect(m_recvTimer, SIGNAL(timeout()), this, SLOT(tick())); + m_recvTimer->setInterval(Constants::Networking::recv_interval); + connect(m_recvTimer, SIGNAL(timeout()), this, SLOT(readServerUpdates())); } MainWidget::~MainWidget() { doDisconnect(); + deleteGUI(); if (m_host != NULL) { enet_host_destroy(m_host); @@ -38,6 +39,10 @@ MainWidget::~MainWidget() void MainWidget::doConnect(QString srv, unsigned int port) { + /* preload sound - this eliminates some loading gap on slower computers */ + AudioManager::self()->setSource(Sound::Intro); + deleteGUI(); + Color::Color color = connectToServer(srv, port); if (color == Color::none) { @@ -48,7 +53,7 @@ void MainWidget::doConnect(QString srv, unsigned int port) /* create our scene */ m_scene = new SceneHolder(this); m_scene->setColor(color); - m_scene->showWaitingForPlayers(true); + m_scene->showWaitingForPlayers(); createGui(); m_recvTimer->start(); @@ -77,13 +82,26 @@ void MainWidget::deleteLayout(QLayout *layout) delete layout; } +void MainWidget::deleteGUI() +{ + deleteLayout(layout()); + m_playerScoreLayouts.clear(); +} + void MainWidget::doDisconnect() +{ + if (!connected()) + return; + closeENetPeer(); + onDisconnect(); +} + +void MainWidget::onDisconnect() { stopGame(); m_recvTimer->stop(); - closeENetPeer(); - deleteLayout(layout()); - m_playerScoreLayouts.clear(); + m_scene->clear(); + m_scene->showWonLost(didIWinLoose()); emit connected(false); } @@ -157,6 +175,23 @@ void MainWidget::updateScore(const ProtoBuf::MapUpdate& packet) } } +bool MainWidget::didIWinLoose() +{ + QGridLayout *score = m_playerScoreLayouts.at(0); + QLabel *allPointsLbl = dynamic_cast(score->itemAtPosition(1, 1)->widget()); + unsigned long myscore = allPointsLbl->text().toULong(); + + for(unsigned i = 1; i < m_maxplayers; ++i) + { + QGridLayout *score = m_playerScoreLayouts.at(i); + QLabel *allPointsLbl = dynamic_cast(score->itemAtPosition(1, 1)->widget()); + unsigned long other = allPointsLbl->text().toULong(); + if (other > myscore) + return false; + } + return true; +} + Transmission::field_t MainWidget::translateKey(int key) { switch(key) @@ -182,7 +217,7 @@ Transmission::field_t MainWidget::translateKey(int key) } } -void MainWidget::tick() +void MainWidget::readServerUpdates() { ENetEvent event; while (enet_host_service(m_host, &event, 1) > 0) @@ -191,10 +226,10 @@ void MainWidget::tick() { case ENET_EVENT_TYPE_DISCONNECT: m_peer = NULL; - doDisconnect(); + onDisconnect(); break; case ENET_EVENT_TYPE_RECEIVE: - tick(&event); + processServerUpdates(&event); enet_packet_destroy(event.packet); break; default: @@ -203,18 +238,22 @@ void MainWidget::tick() } } -void MainWidget::tick(ENetEvent *event) +void MainWidget::processServerUpdates(ENetEvent *event) { QSharedPointer data = Util::receivePacket(event->packet); - bool worked = m_updatepacket.ParseFromArray(data->data(), data->size()); - Q_ASSERT(worked); - Q_UNUSED(worked); + if (!m_updatepacket.ParseFromArray(data->data(), data->size())) + { + qWarning() << "Invalid update packet from server"; + return; + } /* eating order data set indicates a new round */ if (m_updatepacket.eating_order_size() > 0) { Q_ASSERT(m_scene != NULL); - m_scene->reset(); + + /* stop game */ + stopGame(); /* fetch eating order */ QList order; @@ -222,16 +261,13 @@ void MainWidget::tick(ENetEvent *event) order.append(static_cast(m_updatepacket.eating_order(i) & Transmission::color_mask)); m_scene->setEatingOrder(order); - /* stop game */ - stopGame(); - /* and restart game */ QTimer *timer = new QTimer(this); timer->setSingleShot(true); timer->setInterval(Sound::length[Sound::Intro] + Constants::tick); connect(timer, SIGNAL(timeout()), this, SLOT(startGame())); timer->start(); - AudioManager::self()->audioPlayer()->play(Sound::Intro); + AudioManager::self()->play(Sound::Intro); } Transmission::map_t map = Util::createUninitialisedMap(); @@ -250,10 +286,7 @@ void MainWidget::tick(ENetEvent *event) updateScore(m_updatepacket); if (m_updatepacket.eating_order_size() > 0) - { - m_scene->showWaitingForPlayers(false); m_scene->showEatingText(); - } } void MainWidget::keyPressEvent(QKeyEvent* event) @@ -273,11 +306,13 @@ void MainWidget::keyPressEvent(QKeyEvent* event) void MainWidget::sendKeyUpdate() { + if (!connected()) + return; if (m_currentKey == Transmission::direction_none) return; qDebug() << "[SendKey] key=" << m_currentKey; - ProtoBuf::KeyPressUpdate packet; - packet.set_newkey(m_currentKey); + ProtoBuf::ClientUpdate packet; + packet.set_new_direction(m_currentKey); Util::sendPacket(packet, m_peer, m_host); } @@ -294,7 +329,7 @@ void MainWidget::keyReleaseEvent(QKeyEvent* event) void MainWidget::startGame() { disconnect(AudioManager::self()->audioPlayer(), NULL, this, SLOT(startGame())); - m_scene->showEatingText(false); + m_scene->hideOverlayText(); m_running = true; sendKeyUpdate(); m_ambientPlayer->play(); @@ -304,6 +339,7 @@ void MainWidget::stopGame() { m_running = false; m_ambientPlayer->pause(); + m_scene->reset(); } void MainWidget::setAmbientMuted(bool muted) @@ -348,11 +384,12 @@ Color::Color MainWidget::connectToServer(QString srv, unsigned int port) QSharedPointer data = Util::receivePacket(event.packet); enet_packet_destroy(event.packet); ProtoBuf::Init packet; - worked = packet.ParseFromArray(data->data(), data->size()); - Q_ASSERT(worked); - Q_UNUSED(worked); - m_maxplayers = packet.maxplayers(); - return static_cast(packet.color() & Transmission::color_mask); + if (packet.ParseFromArray(data->data(), data->size())) + { + m_maxplayers = packet.maxplayers(); + return static_cast(packet.color() & Transmission::color_mask); + } + qWarning() << "Invalid initialize packet from server"; } } 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: public slots: void doConnect(QString srv = "127.0.0.1", unsigned int port = Constants::Networking::port); void doDisconnect(); + void onDisconnect(); + void deleteGUI(); protected: /* handling of current key */ @@ -41,14 +43,15 @@ private slots: void startGame(); void stopGame(); void playerScoreClicked(); - void tick(); - void tick(ENetEvent *event); + void readServerUpdates(); + void processServerUpdates(ENetEvent *event); void sendKeyUpdate(); private: void createGui(); void createMenu(); void updateScore(const ProtoBuf::MapUpdate&); + bool didIWinLoose(); bool isRunning(); Color::Color connectToServer(QString srv = "127.0.0.1", unsigned int port = Constants::Networking::port); void closeENetPeer(); -- cgit v1.2.3