From da6ef5d87e1cafc0a7de658dc65a9a4578e28f6c Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 6 Apr 2011 23:29:31 +0200 Subject: - make a few optimizations to actor sprites - make actor move via keyboard! --- pacman-c++/actor.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 112 insertions(+), 15 deletions(-) (limited to 'pacman-c++/actor.cpp') diff --git a/pacman-c++/actor.cpp b/pacman-c++/actor.cpp index cde20cd..1796091 100644 --- a/pacman-c++/actor.cpp +++ b/pacman-c++/actor.cpp @@ -1,8 +1,6 @@ #include "actor.h" #include "animationmanager.h" #include -#include -#include #include #include @@ -11,8 +9,8 @@ static QVariant myBooleanInterpolator(const bool &start, const bool &end, qreal return (progress == 1.0) ? end : start; } -Actor::Actor(Color::Color color, QGraphicsItem *parent) - : PixmapItem(parent), m_color(color), m_direction(Actor::None) +Actor::Actor(Color::Color color, bool local, QGraphicsItem *parent) + : PixmapItem(parent), m_color(color), m_direction(Actor::None), m_local(local) { m_pix = ":/" + QString("actor%1").arg((m_color >> 1) + 1); // DON'T set any pixmap here. we've a pixmap in the animation @@ -24,23 +22,47 @@ Actor::Actor(Color::Color color, QGraphicsItem *parent) m_icon.setPixmap(m_pix); m_icon.setSprite(Constants::sprite_margin, Constants::sprite_margin, Constants::field_size.width, Constants::field_size.height); - m_direction = Actor::Left; + /* setup static images first + * they are visible if no animation is running + * and will be the first in m_images + */ + for (int i = 0; i < 5; i++) + { + PixmapItem *img = new PixmapItem(m_pix, this); + m_images.append(img); + int x = i * Constants::sprite_offset + Constants::sprite_margin; + int y = Actor::None * Constants::sprite_offset + Constants::sprite_margin; + img->setSprite(x, y, Constants::field_size.width, Constants::field_size.height); + img->setZValue(zValue()); + img->setVisible(false); + } + /* setup animation stuff */ qRegisterAnimationInterpolator(myBooleanInterpolator); + m_moving = new QParallelAnimationGroup(this); + m_eating.append(NULL); // Actor::None + m_eating.append(setupEatingAnimation(Actor::Left)); + m_eating.append(setupEatingAnimation(Actor::Right)); + m_eating.append(setupEatingAnimation(Actor::Up)); + m_eating.append(setupEatingAnimation(Actor::Down)); + + /* make the picture showing the current direction visible */ + m_images[m_direction]->setVisible(true); +} +QSequentialAnimationGroup *Actor::setupEatingAnimation(Actor::Movement direction) +{ QSequentialAnimationGroup *eating = new QSequentialAnimationGroup(this); - QParallelAnimationGroup *moving = new QParallelAnimationGroup(this); eating->setLoopCount(-1); - for (int i = 0; i < 4; i++) { PixmapItem *img = new PixmapItem(m_pix, this); + m_images.append(img); int x = i * Constants::sprite_offset + Constants::sprite_margin; - int y = m_direction * Constants::sprite_offset + Constants::sprite_margin; + int y = direction * Constants::sprite_offset + Constants::sprite_margin; img->setSprite(x, y, Constants::field_size.width, Constants::field_size.height); img->setZValue(zValue()); img->setVisible(false); - img->setPos(QPointF(200, 0)); QPropertyAnimation *fadein = new QPropertyAnimation(img, "visible", eating); fadein->setDuration(0); @@ -52,17 +74,92 @@ Actor::Actor(Color::Color color, QGraphicsItem *parent) fadeout->setDuration(0); fadeout->setEndValue(false); - QPropertyAnimation *move = new QPropertyAnimation(img, "pos", moving); - move->setDuration(5000); - move->setEndValue(QPointF(0, 0)); + QPropertyAnimation *move = new QPropertyAnimation(img, "pos", m_moving); + move->setDuration(Constants::tick); } - AnimationManager::self()->registerAnimation(eating); - eating->start(); - moving->start(); + return eating; +} + +Color::Color Actor::getColor() +{ + return m_color; } PixmapItem &Actor::getIcon() { return m_icon; } + +bool Actor::isLocal() +{ + return m_local; +} + +void Actor::move(Actor::Movement direction) +{ + //TODO: remove? + if (isMoving()) + return; + + /* stop current animation */ + if (direction != m_direction) + { + /* hide all pictures */ + for (int i = 0; i < m_images.size(); ++i) + m_images.at(i)->setVisible(false); + + if (m_eating[m_direction] != NULL) + { + m_eating[m_direction]->stop(); + //AnimationManager::self()->unregisterAnimation(m_eating[m_direction]); + } + } + + QPointF endpos(0, 0); + switch(direction) + { + case Actor::None: + break; + case Actor::Left: + endpos.setX(static_cast(Constants::field_size.width) * -1); + break; + case Actor::Right: + endpos.setX(Constants::field_size.width); + break; + case Actor::Up: + endpos.setY(static_cast(Constants::field_size.height) * -1); + break; + case Actor::Down: + endpos.setY(Constants::field_size.height); + break; + default: + Q_ASSERT(false); + break; + } + + qDebug() << __FILE__ << "Move from" << pos() - endpos << "to" << (pos()) << "(" << endpos << ")"; + for(int i = 0; i < m_moving->animationCount(); ++i) + { + QPropertyAnimation *move = dynamic_cast(m_moving->animationAt(i)); + move->setStartValue(QPoint(0, 0) - endpos); + move->setEndValue(QPoint(0, 0)); + } + setPos(pos() + endpos); + + /* start new animation */ + if (direction != m_direction) + { + if (direction == Actor::None) + m_images[m_direction]->setVisible(true); + else + m_eating[direction]->start(); + m_direction = direction; + } + m_moving->start(); +} + +bool Actor::isMoving() +{ + return (m_moving->state() == QAbstractAnimation::Running); +} -- cgit v1.2.3