aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamu Laaksonen <laaksonen.sj@gmail.com>2012-09-29 22:21:14 +0300
committerSamu Laaksonen <laaksonen.sj@gmail.com>2012-09-29 22:21:14 +0300
commita8934f323fd7e48014addb55ff25ef0486aebbd1 (patch)
tree914cd44e012f498b0d1fc610659049085f8b7a11
parent87618947d1de7cdd1ff9a8047acec3279ef253b4 (diff)
downloadprism-a8934f323fd7e48014addb55ff25ef0486aebbd1.tar.gz
prism-a8934f323fd7e48014addb55ff25ef0486aebbd1.zip
MenuScene changes
Changed MenuScene to use buttons based on new AnimatingUiElement - buttons now have scale animation allowing them to be a bit more "lively" Added hero_concept as png ":D"
-rw-r--r--data/gfx/hero_concept.pngbin0 -> 2250 bytes
-rw-r--r--src/AnimatingUiElement.cpp146
-rw-r--r--src/AnimatingUiElement.h42
-rw-r--r--src/MenuScene.cpp27
-rw-r--r--src/src.pro6
5 files changed, 219 insertions, 2 deletions
diff --git a/data/gfx/hero_concept.png b/data/gfx/hero_concept.png
new file mode 100644
index 0000000..2021c34
--- /dev/null
+++ b/data/gfx/hero_concept.png
Binary files differ
diff --git a/src/AnimatingUiElement.cpp b/src/AnimatingUiElement.cpp
new file mode 100644
index 0000000..de7c231
--- /dev/null
+++ b/src/AnimatingUiElement.cpp
@@ -0,0 +1,146 @@
+#include <QPropertyAnimation>
+#include <QLinearGradient>
+#include <QPainter>
+#include <QDebug>
+
+#include "AnimatingUiElement.h"
+
+QPixmap* AnimatingUiElement::s_tmpGfx = 0;
+int AnimatingUiElement::s_ref = 0;
+
+AnimatingUiElement::AnimatingUiElement(const QString& text, QObject *parent, QGraphicsItem* graphicsParent) :
+ QObject(parent), QGraphicsPixmapItem(graphicsParent)
+{
+ m_durationPressed = 500;
+ m_durationReleased = 400;
+ m_text = text;
+
+ m_animation = 0;
+
+ initialize();
+}
+
+AnimatingUiElement::~AnimatingUiElement()
+{
+ s_ref--;
+
+ if (s_tmpGfx && s_ref == 0)
+ {
+ delete s_tmpGfx;
+ s_tmpGfx = 0;
+ }
+}
+
+void AnimatingUiElement::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (m_animation)
+ {
+ m_animation->stop();
+ delete m_animation;
+ m_animation = 0;
+ }
+
+ m_animation = new QPropertyAnimation(this, "scale");
+ connect(m_animation, SIGNAL(finished()), this, SLOT(animationFinished()));
+ m_animation->setDuration(m_durationPressed);
+ m_animation->setEndValue(1.3);
+ m_animation->setEasingCurve(QEasingCurve::OutBounce); //or OutBounce, OutQuint...
+
+ m_animation->start();
+
+ m_released = false;
+}
+
+void AnimatingUiElement::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ m_released = true;
+
+ if (m_animation)
+ {
+ m_animation->stop();
+ delete m_animation;
+ m_animation = 0;
+ }
+
+ m_animation = new QPropertyAnimation(this, "scale");
+ connect(m_animation, SIGNAL(finished()), this, SLOT(animationFinished()));
+ m_animation->setDuration(m_durationReleased);
+ m_animation->setEndValue(1.0);
+ m_animation->setEasingCurve(QEasingCurve::OutBounce); //or OutBounce, OutQuint...
+
+ m_animation->start();
+
+ m_released = true;
+}
+
+void AnimatingUiElement::initialize()
+{
+ s_ref++;
+
+ int pw = 280;
+ int ph = 60;
+
+ // Draw the gradients only once
+ if (!s_tmpGfx)
+ {
+ //DBG("generating button gradients");
+
+ s_tmpGfx = new QPixmap(pw, ph);
+ QPainter painter(s_tmpGfx);
+
+ painter.setPen(Qt::NoPen);
+
+ painter.setBrush(Qt::white);
+ painter.drawRect(s_tmpGfx->rect());
+
+ QLinearGradient grad;
+
+ grad.setCoordinateMode(QGradient::ObjectBoundingMode);
+
+ grad.setStart(0, 0);
+ grad.setFinalStop(0, 1);
+
+ grad.setColorAt(0, Qt::red);
+ grad.setColorAt(0.20, QColor(255, 127, 0));
+ grad.setColorAt(0.35, QColor(255, 255, 0));
+ grad.setColorAt(0.5, QColor(0, 255, 0));
+ grad.setColorAt(0.65, QColor(0, 0, 255));
+ grad.setColorAt(0.80, QColor(111, 0, 255));
+ grad.setColorAt(1, QColor(143, 0, 255));
+
+ painter.setBrush(QBrush(grad));
+ painter.drawRect(4, 4, pw-8, ph-8);
+ }
+
+ QPixmap buttonImage = QPixmap(*s_tmpGfx);
+ QPainter painter(&buttonImage);
+
+ QFont font("Arial", 36);
+ font.setLetterSpacing(QFont::PercentageSpacing, 95);
+
+ QFontMetrics metrics(font);
+ QRect bbox = metrics.boundingRect(m_text);
+
+ QPainterPath path;
+
+ int x = (ph - metrics.height()) / 2;
+ path.addText(pw/2-bbox.width()/2, x + metrics.ascent(), font, m_text);
+
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setPen(QPen(Qt::black, 3));
+ painter.setBrush(Qt::white);
+ painter.drawPath(path);
+
+ setPixmap(buttonImage);
+}
+
+void AnimatingUiElement::animationFinished()
+{
+ delete m_animation;
+ m_animation = 0;
+ if (m_released)
+ {
+ m_released = false;
+ emit clicked();
+ }
+}
diff --git a/src/AnimatingUiElement.h b/src/AnimatingUiElement.h
new file mode 100644
index 0000000..c02c7af
--- /dev/null
+++ b/src/AnimatingUiElement.h
@@ -0,0 +1,42 @@
+#ifndef AnimatingUiElement_h
+#define AnimatingUiElement_h
+
+#include <QObject>
+#include <QGraphicsPixmapItem>
+
+class QPropertyAnimation;
+
+class AnimatingUiElement : public QObject, public QGraphicsPixmapItem
+{
+ Q_OBJECT
+
+ Q_PROPERTY(qreal scale READ scale WRITE setScale)
+public:
+ AnimatingUiElement(const QString& text, QObject *parent = 0, QGraphicsItem* graphicsParent = 0);
+ virtual ~AnimatingUiElement();
+
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+ void initialize();
+
+signals:
+ void clicked();
+
+public slots:
+
+private slots:
+ void animationFinished();
+
+private:
+ QPropertyAnimation* m_animation;
+ QString m_text;
+ bool m_released;
+ int m_durationPressed;
+ int m_durationReleased;
+
+ static QPixmap *s_tmpGfx;
+ static int s_ref;
+};
+
+#endif // AnimatingUiElement_h
diff --git a/src/MenuScene.cpp b/src/MenuScene.cpp
index 241f423..a7c2a75 100644
--- a/src/MenuScene.cpp
+++ b/src/MenuScene.cpp
@@ -4,6 +4,8 @@
#include "GraphicsButtonObject.h"
#include "GameView.h"
+#include "AnimatingUiElement.h"
+
#include "MenuScene.h"
MenuScene::MenuScene(const QString &name, const QRectF &rect, GameView *parent)
@@ -40,6 +42,30 @@ void MenuScene::initializeScene()
{
int yoff = 200;
+ AnimatingUiElement *btn1 = new AnimatingUiElement("Play");
+
+ btn1->setOffset(-btn1->boundingRect().width() / 2,
+ -btn1->boundingRect().height() / 2);
+ btn1->setPos(sceneRect().width() / 2, yoff);
+ addItem(btn1);
+
+ AnimatingUiElement *btn2 = new AnimatingUiElement("Credits");
+ btn2->setOffset(-btn2->boundingRect().width() / 2,
+ -btn2->boundingRect().height() / 2);
+ btn2->setPos(sceneRect().width() / 2, btn1->pos().y() + btn1->boundingRect().height() + 20);
+ addItem(btn2);
+
+ AnimatingUiElement *btn3 = new AnimatingUiElement("Quit");
+ btn3->setOffset(-btn3->boundingRect().width() / 2,
+ -btn3->boundingRect().height() / 2);
+ btn3->setPos(sceneRect().width() / 2, btn2->pos().y() + btn2->boundingRect().height() + 20);
+ addItem(btn3);
+
+ connect(btn1, SIGNAL(clicked()), gameView(), SLOT(showLevelSelectionScene()));
+ connect(btn2, SIGNAL(clicked()), gameView(), SLOT(showCreditsScene()));
+ connect(btn3, SIGNAL(clicked()), qApp, SLOT(quit()));
+
+ /*
GraphicsButtonObject *btn1 = new GraphicsButtonObject("Play", 0, this);
btn1->setPos(260, yoff);
@@ -52,6 +78,7 @@ void MenuScene::initializeScene()
connect(btn1, SIGNAL(clicked()), gameView(), SLOT(showLevelSelectionScene()));
connect(btn2, SIGNAL(clicked()), gameView(), SLOT(showCreditsScene()));
connect(btn3, SIGNAL(clicked()), qApp, SLOT(quit()));
+ */
addTitle("prism");
}
diff --git a/src/src.pro b/src/src.pro
index de37d2e..397b1bc 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -36,7 +36,8 @@ HEADERS += MainWindow.h \
BasicEnemy.h \
BarDisplay.h \
CircularDisplay.h \
- HeadsUpDisplay.h
+ HeadsUpDisplay.h \
+ AnimatingUiElement.h \
SOURCES += main.cpp \
MainWindow.cpp \
@@ -58,4 +59,5 @@ SOURCES += main.cpp \
BasicEnemy.cpp \
BarDisplay.cpp \
CircularDisplay.cpp \
- HeadsUpDisplay.cpp
+ HeadsUpDisplay.cpp \
+ AnimatingUiElement.cpp \