aboutsummaryrefslogtreecommitdiff
path: root/src/SceneChanger.cpp
diff options
context:
space:
mode:
authorSamu Laaksonen <laaksonen.sj@gmail.com>2012-09-25 20:00:41 +0300
committerSamu Laaksonen <laaksonen.sj@gmail.com>2012-09-25 20:00:41 +0300
commit685fe05def77b039221edf06c74af74915d536c5 (patch)
tree9c1a14b8f68bc0f801bdec3edc447d04fdbf7a4c /src/SceneChanger.cpp
parent29eabac0670574efd384182c065f53d08c42a483 (diff)
downloadprism-685fe05def77b039221edf06c74af74915d536c5.tar.gz
prism-685fe05def77b039221edf06c74af74915d536c5.zip
Initial code commit
Added some stuff for project base - tiled sources - few Qt based classes for gfx
Diffstat (limited to 'src/SceneChanger.cpp')
-rw-r--r--src/SceneChanger.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/SceneChanger.cpp b/src/SceneChanger.cpp
new file mode 100644
index 0000000..2aa8b86
--- /dev/null
+++ b/src/SceneChanger.cpp
@@ -0,0 +1,107 @@
+#include "SceneChanger.h"
+#include "GameScene.h"
+#include "GameView.h"
+#include "GraphicsPixmapObject.h"
+
+#include <QTimer>
+#include <QParallelAnimationGroup>
+#include <QPropertyAnimation>
+
+SceneChanger::SceneChanger(QString name, const QRectF &rect, GameView *parent) :
+ GameScene(name, parent)
+{
+ setSceneRect(rect);
+
+ m_anim = new QParallelAnimationGroup(this);
+ connect(m_anim, SIGNAL(finished()), this, SLOT(animationFinished()));
+ setDuration(500);
+
+ m_updateTimer = new QTimer(this);
+ connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(update()));
+}
+
+void SceneChanger::updateLogic()
+{
+ advance();
+ update();
+}
+
+void SceneChanger::setDuration(int msecs)
+{
+ m_duration = msecs;
+}
+
+void SceneChanger::changeScene(GameScene *from, GameScene *to, bool rightToLeft)
+{
+ m_fromScene = from;
+ m_toScene = to;
+
+ int width = from->sceneRect().width();
+ int height = from->sceneRect().height();
+
+ clear();
+ m_anim->clear();
+
+ QPixmap from_pixmap(width, height);
+ QPixmap to_pixmap(width, height);
+
+ QPainter from_painter(&from_pixmap);
+ QPainter to_painter(&to_pixmap);
+
+ from->render(&from_painter);
+ to->render(&to_painter);
+
+ GraphicsPixmapObject *from_obj = new GraphicsPixmapObject(from_pixmap);
+ from_obj->setPos(0, 0);
+
+ GraphicsPixmapObject *to_obj = new GraphicsPixmapObject(to_pixmap);
+ to_obj->setPos(0, 0);
+
+ addItem(from_obj);
+ addItem(to_obj);
+
+ QPropertyAnimation *from_anim = new QPropertyAnimation(from_obj, "pos",
+ this);
+
+ QPropertyAnimation *to_anim = new QPropertyAnimation(to_obj, "pos",
+ this);
+
+ if( rightToLeft )
+ {
+ from_anim->setDuration(m_duration);
+ from_anim->setStartValue(QPointF(0.0, 0.0));
+ from_anim->setEndValue(QPointF(-(float)width, 0.0));
+ from_anim->setEasingCurve(QEasingCurve::OutCubic); //or OutBounce, OutQuint...
+
+ to_anim->setDuration(m_duration);
+ to_anim->setStartValue(QPointF((float)width, 0.0));
+ to_anim->setEndValue(QPointF(0.0, 0.0));
+ to_anim->setEasingCurve(QEasingCurve::OutCubic); //or OutBounce, OutQuint...
+ }
+ else
+ {
+ from_anim->setDuration(m_duration);
+ from_anim->setStartValue(QPointF(0.0, 0.0));
+ from_anim->setEndValue(QPointF((float)width, 0.0));
+ from_anim->setEasingCurve(QEasingCurve::OutCubic); //or OutBounce, OutQuint...
+
+ to_anim->setDuration(m_duration);
+ to_anim->setStartValue(QPointF(-(float)width, 0.0));
+ to_anim->setEndValue(QPointF(0.0, 0.0));
+ to_anim->setEasingCurve(QEasingCurve::OutCubic); //or OutBounce, OutQuint...
+
+ }
+ m_anim->addAnimation(from_anim);
+ m_anim->addAnimation(to_anim);
+
+ // Use a little more frequent update than normally
+ m_updateTimer->start(1000 / 100);
+ m_anim->start();
+}
+
+void SceneChanger::animationFinished()
+{
+ m_updateTimer->stop();
+
+ gameView()->showScene(m_toScene);
+}