diff options
Diffstat (limited to 'demos/bttennis/board.cpp')
-rw-r--r-- | demos/bttennis/board.cpp | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/demos/bttennis/board.cpp b/demos/bttennis/board.cpp new file mode 100644 index 00000000..81128657 --- /dev/null +++ b/demos/bttennis/board.cpp @@ -0,0 +1,250 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "board.h" + +#include <QGraphicsItem> +#include <QGraphicsScene> +#include <QDebug> +#include <QTextDocument> +#include <QFontMetrics> +#include <QPropertyAnimation> + +const QColor fg = Qt::white; +const QColor bg = Qt::black; + +Board::Board(QWidget *parent) : + QGraphicsView(parent) +{ + scene = new QGraphicsScene(QRect(0, 0, 640, 360), this); + + scene->setBackgroundBrush(QBrush(bg)); + + ball = scene->addRect(-6, -6, 12, 12, QPen(Qt::SolidLine), QBrush(fg)); + ball->setPos(Width/2-6, Height/2-6); + + // why is y -1...otherwise we have a gap... + topWall = scene->addRect(0, -1, Width, 12, QPen(Qt::SolidLine), QBrush(fg)); + bottomWall = scene->addRect(0, Height-12, Width, 12, QPen(Qt::SolidLine), QBrush(fg)); + + leftPaddle = scene->addRect(0, 12, 12, Paddle, QPen(Qt::SolidLine), QBrush(fg)); + rightPaddle = scene->addRect(Width-12, 12, 12, Paddle, QPen(Qt::SolidLine), QBrush(fg)); + + QPen p; + p.setWidth(2); + p.setStyle(Qt::DotLine); + p.setBrush(QBrush(fg)); + scene->addLine(Width/2, 0, Width/2, Height, p); + + QFont f; + f.setStyleHint(QFont::OldEnglish); + f.setPixelSize(50); + f.setBold(true); + leftScore = scene->addText(QString("0"), f); + leftScore->setDefaultTextColor(fg); +// leftScore->setPos(120, 50); + + rightScore = scene->addText(QString("0"), f); +// rightScore->setPos(Width-140, 50); + rightScore->setDefaultTextColor(fg); + setScore(0, 0); + + f.setPixelSize(25); + status = scene->addText(QString(), f); + status->setDefaultTextColor(fg); + + ball->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + leftPaddle->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + rightPaddle->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + + icon.load(QString(":/icons/connect.png")); + icon = icon.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + qDebug() << "icon" << icon.isNull(); + connectIcon = scene->addPixmap(icon); + connectIcon->setPos(440,200); + connectIcon->setAcceptTouchEvents(true); + connectIcon->setTransformOriginPoint(50,50); + connectIcon->setTransformationMode(Qt::SmoothTransformation); + + connectAnimation = new QPropertyAnimation(this, "connectRotation"); + connectAnimation->setDuration(1000); + connectAnimation->setLoopCount(-1); + connectAnimation->setStartValue(0); + connectAnimation->setEndValue(360); + + setCacheMode(QGraphicsView::CacheBackground); + setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); + +// connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(sceneChanged(QList<QRectF>))); + +} +void Board::setBall(int x, int y) +{ + ball->setPos(x, y); + checkBall(x, y); +} + +void Board::setLeftPaddle(int y) +{ + leftPaddle->setPos(0, y); +} + +void Board::setRightPaddle(int y) +{ + rightPaddle->setPos(0, y); +} + +void Board::sceneChanged(const QList<QRectF> ®ion) +{ + Q_UNUSED(region); + + QList<QGraphicsItem *>items = scene->collidingItems(ball); + while (!items.empty()) { + QGraphicsItem *i = items.takeFirst(); + if (i == topWall) + emit ballCollision(Top); + if (i == bottomWall) + emit ballCollision(Bottom); + if (i == leftPaddle) + emit ballCollision(Left); + if (i == rightPaddle) + emit ballCollision(Right); + } + +} + +void Board::checkBall(int x, int y) +{ + int ly = leftPaddle->y(); + int ry = rightPaddle->y(); + + if (x > 646) + emit scored(Right); + else if (x < -6) + emit scored(Left); + + if (y < 18) + emit ballCollision(Top); + else if (y > 360-18) + emit ballCollision(Bottom); + + if ((x < 18) && + (y > ly-6) && + (y < ly+Paddle+6)) + emit ballCollision(Left); + + if ((x > 640-18) && + (y > ry-6) && + (y < ry+Paddle+6)) + emit ballCollision(Right); +} + +void Board::setScore(int l, int r) +{ + QString left = QString("%1").arg(l); + QString right = QString("%1").arg(r); + leftScore->document()->setPlainText(left); + rightScore->document()->setPlainText(right); + QFontMetrics fm(leftScore->font()); + leftScore->setPos(Width/4 - fm.width(left)/2, 50); + rightScore->setPos(3*Width/4 - fm.width(right)/2, 50); + +} + +void Board::setStatus(QString text, int opacity_start, int opacity_end) +{ + + status->document()->setPlainText(text); + status->setPos(24, Height-25-25); + QPropertyAnimation *a = new QPropertyAnimation(status, "opacity"); + a->setDuration(2000); + a->setStartValue(opacity_start/100.0); + a->setEndValue(opacity_end/100.0); + a->start(QAbstractAnimation::DeleteWhenStopped); +} + +void Board::setConnectRotation(int rot) +{ + connectIcon->setRotation(rot); +// QTransform t; +// t.rotate(rot); +// connectIcon->setPixmap(icon.scaled(100, 100).transformed(t, Qt::SmoothTransformation)); +} + +void Board::setConnectOpacity(qreal op) +{ + connectIcon->setOpacity(op); +} + +void Board::animateConnect(bool start) +{ + if (start) { + connectAnimation->start(); + } + else { + connectAnimation->stop(); + QPropertyAnimation *a = new QPropertyAnimation(this, "connectRotation"); +// qDebug() << "currentTime" << connectAnimation->currentLoopTime() << "rotation" << connectAnimation->currentValue(); + a->setDuration(connectAnimation->currentLoopTime()/2); + a->setStartValue(connectAnimation->currentValue().toInt( )); + a->setEndValue(0); +// a->setDirection(QAbstractAnimation::Backward); + a->start(QAbstractAnimation::DeleteWhenStopped); + } +} + + +void Board::fadeConnect(bool out) +{ + qreal start = 100.0; + qreal end = 0.0; + + if (!out) { + start = 0.0; + end = 100.0; + } + + QPropertyAnimation *a = new QPropertyAnimation(this, "connectOpacity"); + a->setDuration(2000); + a->setStartValue(start); + a->setEndValue(end); + a->start(QAbstractAnimation::DeleteWhenStopped); +} |