From 0c4d6493ce9d1215c10d5f2942d373c4f37204b5 Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 2 May 2011 20:42:37 +0200 Subject: add eating overlay --- pacman-c++/actor.cpp | 6 +++++- pacman-c++/actor.h | 1 + pacman-c++/mainwidget.cpp | 5 +++++ pacman-c++/sceneholder.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ pacman-c++/sceneholder.h | 2 ++ pacman-c++/server.cpp | 4 ++-- 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/pacman-c++/actor.cpp b/pacman-c++/actor.cpp index 757003e..de8d77e 100644 --- a/pacman-c++/actor.cpp +++ b/pacman-c++/actor.cpp @@ -57,7 +57,6 @@ Actor::Actor(Color::Color color, bool local, QGraphicsItem *parent) m_eating.append(setupEatingAnimation(Actor::Down)); /* dieing animation */ - qWarning() << "color=" << Util::colorToString(m_color) << "zValue=" << zValue() << "dieing.z=" << 100 - m_color; m_dieing = new QSequentialAnimationGroup(this); for (int i = 0; i < 11; i++) { @@ -123,6 +122,11 @@ PixmapItem &Actor::icon() return m_icon; } +const QString Actor::iconStr() +{ + return QString(":/actor%1icon").arg(Util::floorLog2(m_color) + 1); +} + Actor::Movement Actor::direction() { return m_direction; diff --git a/pacman-c++/actor.h b/pacman-c++/actor.h index e7d3ebc..c30c62a 100644 --- a/pacman-c++/actor.h +++ b/pacman-c++/actor.h @@ -33,6 +33,7 @@ public: {}; PixmapItem &icon(); + const QString iconStr(); Movement direction(); void setDirection(Movement direction); void reset(); diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp index 3c77765..93fd796 100644 --- a/pacman-c++/mainwidget.cpp +++ b/pacman-c++/mainwidget.cpp @@ -4,6 +4,7 @@ #include "constants.h" #include "util.h" #include "pacman.pb.h" +#include MainWidget::MainWidget(QWidget *parent) : QWidget(parent), m_currentKey(Transmission::none), m_running(false), m_scene(NULL), @@ -173,6 +174,9 @@ void MainWidget::tick() m_scene->updateMap(map); Util::deleteMap(map); updateScore(m_updatepacket); + + if (m_updatepacket.eating_order_size() > 0) + m_scene->showEatingText(); } } @@ -214,6 +218,7 @@ void MainWidget::keyReleaseEvent(QKeyEvent* event) void MainWidget::startGame() { disconnect(AudioManager::self()->audioPlayer(), NULL, this, SLOT(startGame())); + m_scene->showEatingText(false); m_running = true; sendKeyUpdate(); m_ambientPlayer->play(); diff --git a/pacman-c++/sceneholder.cpp b/pacman-c++/sceneholder.cpp index f6b8145..51496ca 100644 --- a/pacman-c++/sceneholder.cpp +++ b/pacman-c++/sceneholder.cpp @@ -13,6 +13,8 @@ SceneHolder::SceneHolder(QObject *parent) setSceneRect(0, 0, Constants::map_size_pixel.width, Constants::map_size_pixel.height); setBackgroundBrush(Qt::black); + m_overlayText = new QGraphicsTextItem(); + visualMap.resize(Constants::map_size.width); for (int i = 0; i < visualMap.size(); ++i) visualMap[i].resize(Constants::map_size.height); @@ -21,6 +23,7 @@ SceneHolder::SceneHolder(QObject *parent) void SceneHolder::reset() { processDelayedItems(); + showEatingText(false); /* remove actors from scene so they don't get deleted during clear */ foreach(Actor *actor, m_actors) @@ -269,6 +272,49 @@ QList &SceneHolder::eatingOrder() return m_eatingorder; } +void SceneHolder::showEatingText(bool show) +{ + if (!show) + { + if (m_overlayText->scene() == this) + removeItem(m_overlayText); + return; + } + + m_overlayText->setDefaultTextColor(Qt::black); + QString text = QString( + "
" + "
" + ); + unsigned int lines = 1; + + text = text % QString("Your Pacman:

") + .arg(m_actors[m_color]->iconStr()); + lines += 2; + + foreach(Actor *actor, m_actors) + { + foreach(Actor *other, m_actors) + { + if (!actor->canEat(other, m_eatingorder)) + continue; + text = text % QString("  can eat
") + .arg(actor->iconStr(), other->iconStr()); + ++lines; + } + } + text = text % "
"; + m_overlayText->setHtml(text); + m_overlayText->setTextWidth(150); + m_overlayText->setOpacity(0.9); + + QFontMetrics metrics(m_overlayText->font()); + m_overlayText->setPos((width() - m_overlayText->textWidth()) / 2, (height() - metrics.height() * lines) / 2); + m_overlayText->setZValue(100); + + addItem(m_overlayText); +} + QPoint SceneHolder::mapPositionToCoord(unsigned int x, unsigned int y) { return QPoint(x * Constants::field_size.width, y * Constants::field_size.height); diff --git a/pacman-c++/sceneholder.h b/pacman-c++/sceneholder.h index dcc10bf..7d6e556 100644 --- a/pacman-c++/sceneholder.h +++ b/pacman-c++/sceneholder.h @@ -24,6 +24,7 @@ public: Color::Color color(); void setEatingOrder(QList &order); QList &eatingOrder(); + void showEatingText(bool show = true); signals: void allPointsRemoved(); @@ -66,6 +67,7 @@ protected: /* points left before round ends */ unsigned int m_pointsLeft; + QGraphicsTextItem *m_overlayText; }; #endif // SCENEHOLDER_H diff --git a/pacman-c++/server.cpp b/pacman-c++/server.cpp index caf2fa5..962d1bf 100644 --- a/pacman-c++/server.cpp +++ b/pacman-c++/server.cpp @@ -22,7 +22,7 @@ Server::Server(QWidget *parent) bool Server::run() { /* create eating order list first - this can also be created dynamically per round (theoretically) */ - for(unsigned i = 0; i < m_maxplayers; ++i) + for(unsigned int i = 0; i < m_maxplayers; ++i) m_eatingorder.append(Color::order[i]); m_eatingorder.append(Color::order[0]); @@ -406,7 +406,7 @@ void Server::sendUpdate(Transmission::map_t map, bool firstPacket) m_updatepacket.add_field(map[x][y]); } - for(unsigned i = 0; i < m_maxplayers; ++i) + for(unsigned int i = 0; i < m_maxplayers; ++i) { m_updatepacket.add_round_points(m_actors.value(Color::order[i])->getRoundPoints()); m_updatepacket.add_game_points(m_actors.value(Color::order[i])->getGamePoints()); -- cgit v1.2.3