From a35824a3319ae9c304263185c4efc449e2c2cf73 Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 4 Apr 2011 11:27:54 +0200 Subject: added simple pacman animation --- pacman-c++/actor.cpp | 47 +++++++++++++++++++++++++++++++-- pacman-c++/actor.h | 2 ++ pacman-c++/animationmanager.cpp | 56 ++++++++++++++++++++++++++++++++++++++++ pacman-c++/animationmanager.h | 33 +++++++++++++++++++++++ pacman-c++/pacman.pro | 8 +++--- pacman-c++/pacman.qrc | 1 + pacman-c++/pics/actor1.png | Bin 0 -> 485 bytes pacman-c++/pixmapitem.cpp | 44 +++++++++++++++++++++++++++++-- pacman-c++/pixmapitem.h | 12 +++++++++ 9 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 pacman-c++/animationmanager.cpp create mode 100644 pacman-c++/animationmanager.h create mode 100644 pacman-c++/pics/actor1.png (limited to 'pacman-c++') diff --git a/pacman-c++/actor.cpp b/pacman-c++/actor.cpp index 860f490..5080497 100644 --- a/pacman-c++/actor.cpp +++ b/pacman-c++/actor.cpp @@ -1,7 +1,50 @@ #include "actor.h" +#include "animationmanager.h" +#include +#include +#include + +#define SPRITE_MARGIN 2 +#define SPRITE_PLAYER_WIDTH 16 +#define SPRITE_PLAYER_HEIGHT 16 + +static QVariant myBooleanInterpolator(const bool &start, const bool &end, qreal progress) +{ + return (progress == 1.0) ? end : start; +} Actor::Actor(Type type) - : PixmapItem("google-pacman-sprite"), m_type(type), m_direction(Actor::None) + : m_type(type), m_direction(Actor::None) { - setSprite(2, 2, 16, 16); + m_pix = ":/" + QString("actor%1").arg(type); + setPixmap(m_pix); + setSprite(82, 82, 16, 16); + + m_direction = Actor::Left; + + qRegisterAnimationInterpolator(myBooleanInterpolator); + QSequentialAnimationGroup *group = new QSequentialAnimationGroup(this); + group->setLoopCount(-1); + for (int i = 0; i < 4; i++) + { + PixmapItem *step = new PixmapItem(m_pix, this); + int x = i * 20 + SPRITE_MARGIN; + int y = m_direction * 20 + SPRITE_MARGIN; + step->setSprite(x, y, SPRITE_PLAYER_WIDTH, SPRITE_PLAYER_HEIGHT); + step->setVisible(false); + + + QPropertyAnimation *anim = new QPropertyAnimation(step, "visible", group); + anim->setDuration(0); + anim->setEndValue(true); + + group->addPause(100); + + QPropertyAnimation *anim2 = new QPropertyAnimation(step, "visible", group); + anim2->setDuration(0); + anim2->setEndValue(false); + } + + AnimationManager::self()->registerAnimation(group); + group->start(); } diff --git a/pacman-c++/actor.h b/pacman-c++/actor.h index 5f68f8f..43314a9 100644 --- a/pacman-c++/actor.h +++ b/pacman-c++/actor.h @@ -22,7 +22,9 @@ public: }; Actor(Type type); + private: + QPixmap m_pix; Type m_type; Movement m_direction; }; diff --git a/pacman-c++/animationmanager.cpp b/pacman-c++/animationmanager.cpp new file mode 100644 index 0000000..69bec53 --- /dev/null +++ b/pacman-c++/animationmanager.cpp @@ -0,0 +1,56 @@ +#include "animationmanager.h" +#include +#include + +// the universe's only animation manager +AnimationManager *AnimationManager::instance = 0; + +AnimationManager::AnimationManager() +{ +} + +AnimationManager *AnimationManager::self() +{ + if (!instance) + instance = new AnimationManager; + return instance; +} + +void AnimationManager::registerAnimation(QAbstractAnimation *anim) +{ + QObject::connect(anim, SIGNAL(destroyed(QObject*)), this, SLOT(unregisterAnimation_helper(QObject*))); + animations.append(anim); +} + +void AnimationManager::unregisterAnimation_helper(QObject *obj) +{ + unregisterAnimation(static_cast(obj)); +} + +void AnimationManager::unregisterAnimation(QAbstractAnimation *anim) +{ + QObject::disconnect(anim, SIGNAL(destroyed(QObject*)), this, SLOT(unregisterAnimation_helper(QObject*))); + animations.removeAll(anim); +} + +void AnimationManager::unregisterAllAnimations() +{ + animations.clear(); +} + +void AnimationManager::pauseAll() +{ + foreach (QAbstractAnimation* animation, animations) + { + if (animation->state() == QAbstractAnimation::Running) + animation->pause(); + } +} +void AnimationManager::resumeAll() +{ + foreach (QAbstractAnimation* animation, animations) + { + if (animation->state() == QAbstractAnimation::Paused) + animation->resume(); + } +} diff --git a/pacman-c++/animationmanager.h b/pacman-c++/animationmanager.h new file mode 100644 index 0000000..eb5b7d0 --- /dev/null +++ b/pacman-c++/animationmanager.h @@ -0,0 +1,33 @@ +#ifndef ANIMATIONMANAGER_H +#define ANIMATIONMANAGER_H + +#include + +QT_BEGIN_NAMESPACE +class QAbstractAnimation; +QT_END_NAMESPACE + +class AnimationManager + : public QObject +{ +Q_OBJECT +public: + AnimationManager(); + void registerAnimation(QAbstractAnimation *anim); + void unregisterAnimation(QAbstractAnimation *anim); + void unregisterAllAnimations(); + static AnimationManager *self(); + +public slots: + void pauseAll(); + void resumeAll(); + +private slots: + void unregisterAnimation_helper(QObject *obj); + +private: + static AnimationManager *instance; + QList animations; +}; + +#endif // ANIMATIONMANAGER_H diff --git a/pacman-c++/pacman.pro b/pacman-c++/pacman.pro index 6b705a8..3ce84da 100644 --- a/pacman-c++/pacman.pro +++ b/pacman-c++/pacman.pro @@ -1,12 +1,12 @@ SOURCES += main.cpp \ pixmapitem.cpp \ - actor.cpp + actor.cpp \ + animationmanager.cpp HEADERS += pixmapitem.h \ - actor.h + actor.h \ + animationmanager.h RESOURCES += pacman.qrc OBJECTS_DIR = .obj MOC_DIR = .moc - - diff --git a/pacman-c++/pacman.qrc b/pacman-c++/pacman.qrc index c209878..a643886 100644 --- a/pacman-c++/pacman.qrc +++ b/pacman-c++/pacman.qrc @@ -1,5 +1,6 @@ pics/pacman10-hp-sprite-2.png + pics/actor1.png diff --git a/pacman-c++/pics/actor1.png b/pacman-c++/pics/actor1.png new file mode 100644 index 0000000..2b4a32a Binary files /dev/null and b/pacman-c++/pics/actor1.png differ diff --git a/pacman-c++/pixmapitem.cpp b/pacman-c++/pixmapitem.cpp index 9c2f941..a977a9e 100644 --- a/pacman-c++/pixmapitem.cpp +++ b/pacman-c++/pixmapitem.cpp @@ -1,10 +1,16 @@ #include "pixmapitem.h" #include +#include + +PixmapItem::PixmapItem(QGraphicsItem *parent) + : QGraphicsObject(parent), m_x(0), m_y(0) +{ +} PixmapItem::PixmapItem(const QString &fileName, QGraphicsItem *parent) : QGraphicsObject(parent), m_x(0), m_y(0) { - m_pix = ":/" + fileName; + m_pix = ":/" + fileName; m_width = m_pix.width(); m_height = m_pix.height(); } @@ -12,12 +18,34 @@ PixmapItem::PixmapItem(const QString &fileName, QGraphicsItem *parent) PixmapItem::PixmapItem(const QString &fileName, QGraphicsScene *scene) : QGraphicsObject(), m_x(0), m_y(0) { - m_pix = ":/" + fileName; + m_pix = ":/" + fileName; m_width = m_pix.width(); m_height = m_pix.height(); scene->addItem(this); } +PixmapItem::PixmapItem(const QPixmap &pix, QGraphicsItem *parent) + : QGraphicsObject(parent), m_pix(pix), m_x(0), m_y(0) +{ + m_width = m_pix.width(); + m_height = m_pix.height(); +} + +PixmapItem::PixmapItem(const QPixmap &pix, QGraphicsScene *scene) + : QGraphicsObject(), m_pix(pix), m_x(0), m_y(0) +{ + m_width = m_pix.width(); + m_height = m_pix.height(); + scene->addItem(this); +} + +void PixmapItem::setPixmap(const QPixmap &pix) +{ + m_pix = pix; + m_width = m_pix.width(); + m_height = m_pix.height(); +} + void PixmapItem::setSprite(int x, int y, int width, int height) { m_x = x; @@ -41,4 +69,16 @@ void PixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWid painter->drawPixmap(0, 0, m_pix, m_x, m_y, m_width, m_height); } +#if 0 +bool PixmapItem::isVisible() const +{ + qDebug() << "isVisible()"; + return true; +} + +void PixmapItem::setVisible(bool v) +{ + qDebug() << "setVisible(" << v << ")"; +} +#endif diff --git a/pacman-c++/pixmapitem.h b/pacman-c++/pixmapitem.h index 853604d..e6aa79e 100644 --- a/pacman-c++/pixmapitem.h +++ b/pacman-c++/pixmapitem.h @@ -7,13 +7,25 @@ class PixmapItem : public QGraphicsObject { + Q_PROPERTY(bool visibleX READ isVisible WRITE setVisible) + public: + PixmapItem(QGraphicsItem *parent = 0); PixmapItem(const QString &fileName, QGraphicsItem *parent = 0); PixmapItem(const QString &fileName, QGraphicsScene *scene); + PixmapItem(const QPixmap &pix, QGraphicsItem *parent = 0); + PixmapItem(const QPixmap &pix, QGraphicsScene *scene); + void setPixmap(const QPixmap &pix); void setSprite(int x, int y, int width, int height); QSizeF size() const; QRectF boundingRect() const; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); + +#if 0 + bool isVisible() const; + void setVisible(bool v); +#endif + private: QPixmap m_pix; int m_x, m_y; -- cgit v1.2.3