From 41a31420cf091aeb4e986503387855d41e550106 Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 25 Apr 2011 14:39:00 +0200 Subject: - add intro sound on every round - add dieing sound - add dieing animation - add die on moving onto colorized block --- pacman-c++/sceneholder.cpp | 76 +++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 32 deletions(-) (limited to 'pacman-c++/sceneholder.cpp') diff --git a/pacman-c++/sceneholder.cpp b/pacman-c++/sceneholder.cpp index 56e0fff..1ecf31b 100644 --- a/pacman-c++/sceneholder.cpp +++ b/pacman-c++/sceneholder.cpp @@ -20,23 +20,51 @@ SceneHolder::SceneHolder(QObject *parent) void SceneHolder::reset() { - /* reset actor directions */ + processDelayedItems(); + + /* remove actors from scene so they don't get deleted during clear */ foreach(Actor *actor, m_actors) - actor->resetDirection(); + { + actor->resetAnimation(); + removeItem(actor); + } + + /* clear our stuff */ + clear(); + m_pointsLeft = 0; + for (int i = 0; i < visualMap.size(); ++i) + { + visualMap[i].clear(); + visualMap[i].resize(Constants::map_size.height); + } + + /* add actors again */ + foreach(Actor *actor, m_actors) + addItem(actor); } -void SceneHolder::updateMap(const Transmission::map_t& map) +void SceneHolder::processDelayedItems() { /* remove items that got marked for removal from scene */ - QMutableListIterator i(m_oldItems); - while(i.hasNext()) + foreach(GameEntity *item, m_oldItems) { - i.next(); - GameEntity *item = i.value(); removeItem(item); - i.remove(); delete item; } + m_oldItems.clear(); + + /* process death */ + foreach(const Color::Color color, m_death.keys()) + { + Q_ASSERT(m_death[color] != NULL); + m_death[color]->onDie(m_actors[color]); + } + m_death.clear(); +} + +void SceneHolder::updateMap(const Transmission::map_t& map) +{ + processDelayedItems(); /* process update */ for (unsigned int x = 0; x < Constants::map_size.width; ++x) @@ -66,28 +94,18 @@ void SceneHolder::updateMap(const Transmission::map_t& map, const unsigned int x if (cur & Transmission::empty) { GameEntity *oldItem = visualMap[x][y]; - /* special handling for purging field - */ + /* special handling for purging field */ if (oldItem != NULL) { + /* remove item from visualmap and register item for removal in next update */ visualMap[x][y] = NULL; - Actor *actor = NULL; - foreach (Actor *tmp, m_actors) - { - if (cur & tmp->color()) - { - actor = tmp; - break; - } - } + m_oldItems.append(oldItem); /* an item must be removed by an actor */ + Actor *actor = m_actors[color]; if (actor == NULL) Q_ASSERT(false); oldItem->onDie(actor); - - /* register item for removal in next update */ - m_oldItems.append(oldItem); } } @@ -165,6 +183,10 @@ void SceneHolder::updateMap(const Transmission::map_t& map, const unsigned int x qDebug() << "[SceneUpdate] actor moves: color=" << color << "direction=" << direction << "newpos=" << QPoint(x, y); } + + + if (cur & Transmission::death) + m_death[color] = visualMap[x][y]; } if (cur & Transmission::empty) @@ -221,16 +243,6 @@ QList &SceneHolder::eatingOrder() return m_eatingorder; } -void SceneHolder::removeActors() -{ - foreach(Actor *actor, m_actors) - { - removeItem(actor); - delete actor; - } - m_actors.clear(); -} - QPoint SceneHolder::mapPositionToCoord(unsigned int x, unsigned int y) { return QPoint(x * Constants::field_size.width, y * Constants::field_size.height); -- cgit v1.2.3