Move QStateMachine from QtCore to QtScxml

Task-number: QTBUG-80316
Change-Id: I2ee74110fd55e94d86321d3b3dc5bb8297424ed4
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
This commit is contained in:
Karsten Heimrich 2020-08-18 14:26:50 +02:00
parent 43f01ec2e5
commit a735038376
286 changed files with 209 additions and 31767 deletions

View File

@ -103,7 +103,6 @@ manifestmeta.android.names = "Qt3D/Qt 3D: Basic Shapes C++ Example" \
"QtWidgets/Easing Curves Example" \
"QtWidgets/Editable Tree Model Example" \
"QtWidgets/Elided Label Example" \
"QtWidgets/Event Transitions Example" \
"QtWidgets/Fade Message Effect Example" \
"QtWidgets/Flow Layout Example" \
"QtWidgets/Font Sampler Example" \
@ -193,8 +192,6 @@ manifestmeta.ios.names = "QtCore/Contiguous Cache Example" \
"QtWidgets/Order Form Example" \
"QtWidgets/Syntax Highlighter Example" \
"QtWidgets/Text Edit" \
"QtWidgets/Traffic Light Example" \
"QtWidgets/Two-way Button Example" \
"QtWidgets/Completer Example" \
"QtWidgets/Custom Completer Example" \
"QtWidgets/Undo Framework" \
@ -242,8 +239,6 @@ manifestmeta.thumbnail.names = "QtCore/Contiguous Cache Example" \
"QtGui/Raster Window Example" \
"QtNetwork/Network Download*" \
"QtWidgets/Dynamic Layouts Example" \
"QtWidgets/Event Transitions Example" \
"QtWidgets/Two-way Button Example" \
"QtWidgets/Validators Example" \
"QtDbus/*" \
"QtHelp/*" \

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -17,7 +17,6 @@ add_subdirectory(layouts)
add_subdirectory(painting)
add_subdirectory(richtext)
add_subdirectory(scroller)
add_subdirectory(statemachine)
add_subdirectory(tools)
add_subdirectory(touch)
add_subdirectory(tutorials)

View File

@ -17,7 +17,6 @@ add_subdirectory(layouts)
add_subdirectory(painting)
add_subdirectory(richtext)
add_subdirectory(scroller)
add_subdirectory(statemachine)
add_subdirectory(tools)
add_subdirectory(touch)
add_subdirectory(tutorials)

View File

@ -1,8 +1,3 @@
# Generated from animation.pro.
add_subdirectory(animatedtiles)
add_subdirectory(easing)
add_subdirectory(moveblocks)
add_subdirectory(states)
add_subdirectory(stickman)
add_subdirectory(sub-attaq)

View File

@ -1,54 +0,0 @@
# Generated from animatedtiles.pro.
cmake_minimum_required(VERSION 3.14)
project(animatedtiles LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/animatedtiles")
find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS Widgets)
add_qt_gui_executable(animatedtiles
main.cpp
)
target_link_libraries(animatedtiles PUBLIC
Qt::Core
Qt::Gui
Qt::Widgets
)
# Resources:
set(animatedtiles_resource_files
"images/Time-For-Lunch-2.jpg"
"images/centered.png"
"images/ellipse.png"
"images/figure8.png"
"images/kinetic.png"
"images/random.png"
"images/tile.png"
)
qt6_add_resources(animatedtiles "animatedtiles"
PREFIX
"/"
FILES
${animatedtiles_resource_files}
)
install(TARGETS animatedtiles
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,8 +0,0 @@
QT += widgets
SOURCES = main.cpp
RESOURCES = animatedtiles.qrc
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/animatedtiles
INSTALLS += target

View File

@ -1,11 +0,0 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/Time-For-Lunch-2.jpg</file>
<file>images/centered.png</file>
<file>images/ellipse.png</file>
<file>images/figure8.png</file>
<file>images/kinetic.png</file>
<file>images/random.png</file>
<file>images/tile.png</file>
</qresource>
</RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,268 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtWidgets/QtWidgets>
#include <QtCore/qmath.h>
#include <QtCore/qrandom.h>
#include <QtCore/qstate.h>
class Pixmap : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
Q_PROPERTY(QPointF pos READ pos WRITE setPos)
public:
Pixmap(const QPixmap &pix)
: QObject(), QGraphicsPixmapItem(pix)
{
setCacheMode(DeviceCoordinateCache);
}
};
class Button : public QGraphicsWidget
{
Q_OBJECT
public:
Button(const QPixmap &pixmap, QGraphicsItem *parent = nullptr)
: QGraphicsWidget(parent), _pix(pixmap)
{
setAcceptHoverEvents(true);
setCacheMode(DeviceCoordinateCache);
}
QRectF boundingRect() const override
{
return QRectF(-65, -65, 130, 130);
}
QPainterPath shape() const override
{
QPainterPath path;
path.addEllipse(boundingRect());
return path;
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) override
{
bool down = option->state & QStyle::State_Sunken;
QRectF r = boundingRect();
QLinearGradient grad(r.topLeft(), r.bottomRight());
grad.setColorAt(down ? 1 : 0, option->state & QStyle::State_MouseOver ? Qt::white : Qt::lightGray);
grad.setColorAt(down ? 0 : 1, Qt::darkGray);
painter->setPen(Qt::darkGray);
painter->setBrush(grad);
painter->drawEllipse(r);
QLinearGradient grad2(r.topLeft(), r.bottomRight());
grad.setColorAt(down ? 1 : 0, Qt::darkGray);
grad.setColorAt(down ? 0 : 1, Qt::lightGray);
painter->setPen(Qt::NoPen);
painter->setBrush(grad);
if (down)
painter->translate(2, 2);
painter->drawEllipse(r.adjusted(5, 5, -5, -5));
painter->drawPixmap(-_pix.width()/2, -_pix.height()/2, _pix);
}
signals:
void pressed();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *) override
{
emit pressed();
update();
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *) override
{
update();
}
private:
QPixmap _pix;
};
class View : public QGraphicsView
{
public:
View(QGraphicsScene *scene) : QGraphicsView(scene) { }
protected:
void resizeEvent(QResizeEvent *event) override
{
QGraphicsView::resizeEvent(event);
fitInView(sceneRect(), Qt::KeepAspectRatio);
}
};
int main(int argc, char **argv)
{
Q_INIT_RESOURCE(animatedtiles);
QApplication app(argc, argv);
QPixmap kineticPix(":/images/kinetic.png");
QPixmap bgPix(":/images/Time-For-Lunch-2.jpg");
QGraphicsScene scene(-350, -350, 700, 700);
QList<Pixmap *> items;
for (int i = 0; i < 64; ++i) {
Pixmap *item = new Pixmap(kineticPix);
item->setOffset(-kineticPix.width()/2, -kineticPix.height()/2);
item->setZValue(i);
items << item;
scene.addItem(item);
}
// Buttons
QGraphicsItem *buttonParent = new QGraphicsRectItem;
Button *ellipseButton = new Button(QPixmap(":/images/ellipse.png"), buttonParent);
Button *figure8Button = new Button(QPixmap(":/images/figure8.png"), buttonParent);
Button *randomButton = new Button(QPixmap(":/images/random.png"), buttonParent);
Button *tiledButton = new Button(QPixmap(":/images/tile.png"), buttonParent);
Button *centeredButton = new Button(QPixmap(":/images/centered.png"), buttonParent);
ellipseButton->setPos(-100, -100);
figure8Button->setPos(100, -100);
randomButton->setPos(0, 0);
tiledButton->setPos(-100, 100);
centeredButton->setPos(100, 100);
scene.addItem(buttonParent);
buttonParent->setTransform(QTransform::fromScale(0.75, 0.75), true);
buttonParent->setPos(200, 200);
buttonParent->setZValue(65);
// States
QState *rootState = new QState;
QState *ellipseState = new QState(rootState);
QState *figure8State = new QState(rootState);
QState *randomState = new QState(rootState);
QState *tiledState = new QState(rootState);
QState *centeredState = new QState(rootState);
// Values
for (int i = 0; i < items.count(); ++i) {
Pixmap *item = items.at(i);
// Ellipse
ellipseState->assignProperty(item, "pos",
QPointF(qCos((i / 63.0) * 6.28) * 250,
qSin((i / 63.0) * 6.28) * 250));
// Figure 8
figure8State->assignProperty(item, "pos",
QPointF(qSin((i / 63.0) * 6.28) * 250,
qSin(((i * 2)/63.0) * 6.28) * 250));
// Random
randomState->assignProperty(item, "pos",
QPointF(-250 + QRandomGenerator::global()->bounded(500),
-250 + QRandomGenerator::global()->bounded(500)));
// Tiled
tiledState->assignProperty(item, "pos",
QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2,
((i / 8) - 4) * kineticPix.height() + kineticPix.height() / 2));
// Centered
centeredState->assignProperty(item, "pos", QPointF());
}
// Ui
View *view = new View(&scene);
view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Animated Tiles"));
view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
view->setBackgroundBrush(bgPix);
view->setCacheMode(QGraphicsView::CacheBackground);
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view->show();
QStateMachine states;
states.addState(rootState);
states.setInitialState(rootState);
rootState->setInitialState(centeredState);
QParallelAnimationGroup *group = new QParallelAnimationGroup;
for (int i = 0; i < items.count(); ++i) {
QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos");
anim->setDuration(750 + i * 25);
anim->setEasingCurve(QEasingCurve::InOutBack);
group->addAnimation(anim);
}
QAbstractTransition *trans = rootState->addTransition(ellipseButton, &Button::pressed, ellipseState);
trans->addAnimation(group);
trans = rootState->addTransition(figure8Button, &Button::pressed, figure8State);
trans->addAnimation(group);
trans = rootState->addTransition(randomButton, &Button::pressed, randomState);
trans->addAnimation(group);
trans = rootState->addTransition(tiledButton, &Button::pressed, tiledState);
trans->addAnimation(group);
trans = rootState->addTransition(centeredButton, &Button::pressed, centeredState);
trans->addAnimation(group);
QTimer timer;
timer.start(125);
timer.setSingleShot(true);
trans = rootState->addTransition(&timer, &QTimer::timeout, ellipseState);
trans->addAnimation(group);
states.start();
#ifdef QT_KEYPAD_NAVIGATION
QApplication::setNavigationMode(Qt::NavigationModeCursorAuto);
#endif
return app.exec();
}
#include "main.moc"

View File

@ -1,9 +1,3 @@
TEMPLATE = \
subdirs
SUBDIRS += \
animatedtiles \
easing \
moveblocks \
states \
stickman \
sub-attaq \
SUBDIRS += easing

View File

@ -1,35 +0,0 @@
# Generated from moveblocks.pro.
cmake_minimum_required(VERSION 3.14)
project(moveblocks LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/moveblocks")
find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS Widgets)
add_qt_gui_executable(moveblocks
main.cpp
)
target_link_libraries(moveblocks PUBLIC
Qt::Core
Qt::Gui
Qt::Widgets
)
install(TARGETS moveblocks
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,330 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtCore>
#include <QtWidgets>
//![15]
class StateSwitchEvent: public QEvent
{
public:
StateSwitchEvent()
: QEvent(Type(StateSwitchType))
{
}
explicit StateSwitchEvent(int rand)
: QEvent(Type(StateSwitchType)),
m_rand(rand)
{
}
enum { StateSwitchType = QEvent::User + 256 };
int rand() const { return m_rand; }
private:
int m_rand;
};
//![15]
//![16]
class QGraphicsRectWidget : public QGraphicsWidget
{
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *,
QWidget *) override
{
painter->fillRect(rect(), Qt::blue);
}
};
//![16]
class StateSwitchTransition: public QAbstractTransition
{
public:
StateSwitchTransition(int rand)
: QAbstractTransition(),
m_rand(rand)
{
}
protected:
//![14]
bool eventTest(QEvent *event) override
{
return (event->type() == QEvent::Type(StateSwitchEvent::StateSwitchType))
&& (static_cast<StateSwitchEvent *>(event)->rand() == m_rand);
}
//![14]
void onTransition(QEvent *) override {}
private:
int m_rand;
};
//![10]
class StateSwitcher : public QState
{
Q_OBJECT
public:
StateSwitcher(QStateMachine *machine)
: QState(machine), m_stateCount(0), m_lastIndex(0)
{ }
//![10]
//![11]
void onEntry(QEvent *) override
{
int n;
while ((n = QRandomGenerator::global()->bounded(m_stateCount) + 1) == m_lastIndex)
{ }
m_lastIndex = n;
machine()->postEvent(new StateSwitchEvent(n));
}
void onExit(QEvent *) override {}
//![11]
//![12]
void addState(QState *state, QAbstractAnimation *animation) {
StateSwitchTransition *trans = new StateSwitchTransition(++m_stateCount);
trans->setTargetState(state);
addTransition(trans);
trans->addAnimation(animation);
}
//![12]
private:
int m_stateCount;
int m_lastIndex;
};
//![13]
QState *createGeometryState(QObject *w1, const QRect &rect1,
QObject *w2, const QRect &rect2,
QObject *w3, const QRect &rect3,
QObject *w4, const QRect &rect4,
QState *parent)
{
QState *result = new QState(parent);
result->assignProperty(w1, "geometry", rect1);
result->assignProperty(w2, "geometry", rect2);
result->assignProperty(w3, "geometry", rect3);
result->assignProperty(w4, "geometry", rect4);
return result;
}
//![13]
class GraphicsView : public QGraphicsView
{
Q_OBJECT
public:
GraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)
: QGraphicsView(scene, parent)
{
}
protected:
void resizeEvent(QResizeEvent *event) override
{
fitInView(scene()->sceneRect());
QGraphicsView::resizeEvent(event);
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
//![1]
QGraphicsRectWidget *button1 = new QGraphicsRectWidget;
QGraphicsRectWidget *button2 = new QGraphicsRectWidget;
QGraphicsRectWidget *button3 = new QGraphicsRectWidget;
QGraphicsRectWidget *button4 = new QGraphicsRectWidget;
button2->setZValue(1);
button3->setZValue(2);
button4->setZValue(3);
QGraphicsScene scene(0, 0, 300, 300);
scene.setBackgroundBrush(Qt::black);
scene.addItem(button1);
scene.addItem(button2);
scene.addItem(button3);
scene.addItem(button4);
//![1]
GraphicsView window(&scene);
window.setFrameStyle(0);
window.setAlignment(Qt::AlignLeft | Qt::AlignTop);
window.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
window.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//![2]
QStateMachine machine;
QState *group = new QState();
group->setObjectName("group");
QTimer timer;
timer.setInterval(1250);
timer.setSingleShot(true);
QObject::connect(group, &QState::entered, &timer, QOverload<>::of(&QTimer::start));
//![2]
//![3]
QState *state1;
QState *state2;
QState *state3;
QState *state4;
QState *state5;
QState *state6;
QState *state7;
state1 = createGeometryState(button1, QRect(100, 0, 50, 50),
button2, QRect(150, 0, 50, 50),
button3, QRect(200, 0, 50, 50),
button4, QRect(250, 0, 50, 50),
group);
//![3]
state2 = createGeometryState(button1, QRect(250, 100, 50, 50),
button2, QRect(250, 150, 50, 50),
button3, QRect(250, 200, 50, 50),
button4, QRect(250, 250, 50, 50),
group);
state3 = createGeometryState(button1, QRect(150, 250, 50, 50),
button2, QRect(100, 250, 50, 50),
button3, QRect(50, 250, 50, 50),
button4, QRect(0, 250, 50, 50),
group);
state4 = createGeometryState(button1, QRect(0, 150, 50, 50),
button2, QRect(0, 100, 50, 50),
button3, QRect(0, 50, 50, 50),
button4, QRect(0, 0, 50, 50),
group);
state5 = createGeometryState(button1, QRect(100, 100, 50, 50),
button2, QRect(150, 100, 50, 50),
button3, QRect(100, 150, 50, 50),
button4, QRect(150, 150, 50, 50),
group);
state6 = createGeometryState(button1, QRect(50, 50, 50, 50),
button2, QRect(200, 50, 50, 50),
button3, QRect(50, 200, 50, 50),
button4, QRect(200, 200, 50, 50),
group);
//![4]
state7 = createGeometryState(button1, QRect(0, 0, 50, 50),
button2, QRect(250, 0, 50, 50),
button3, QRect(0, 250, 50, 50),
button4, QRect(250, 250, 50, 50),
group);
group->setInitialState(state1);
//![4]
//![5]
QParallelAnimationGroup animationGroup;
QSequentialAnimationGroup *subGroup;
QPropertyAnimation *anim = new QPropertyAnimation(button4, "geometry");
anim->setDuration(1000);
anim->setEasingCurve(QEasingCurve::OutElastic);
animationGroup.addAnimation(anim);
//![5]
//![6]
subGroup = new QSequentialAnimationGroup(&animationGroup);
subGroup->addPause(100);
anim = new QPropertyAnimation(button3, "geometry");
anim->setDuration(1000);
anim->setEasingCurve(QEasingCurve::OutElastic);
subGroup->addAnimation(anim);
//![6]
subGroup = new QSequentialAnimationGroup(&animationGroup);
subGroup->addPause(150);
anim = new QPropertyAnimation(button2, "geometry");
anim->setDuration(1000);
anim->setEasingCurve(QEasingCurve::OutElastic);
subGroup->addAnimation(anim);
subGroup = new QSequentialAnimationGroup(&animationGroup);
subGroup->addPause(200);
anim = new QPropertyAnimation(button1, "geometry");
anim->setDuration(1000);
anim->setEasingCurve(QEasingCurve::OutElastic);
subGroup->addAnimation(anim);
//![7]
StateSwitcher *stateSwitcher = new StateSwitcher(&machine);
stateSwitcher->setObjectName("stateSwitcher");
group->addTransition(&timer, &QTimer::timeout, stateSwitcher);
stateSwitcher->addState(state1, &animationGroup);
stateSwitcher->addState(state2, &animationGroup);
//![7]
stateSwitcher->addState(state3, &animationGroup);
stateSwitcher->addState(state4, &animationGroup);
stateSwitcher->addState(state5, &animationGroup);
stateSwitcher->addState(state6, &animationGroup);
//![8]
stateSwitcher->addState(state7, &animationGroup);
//![8]
//![9]
machine.addState(group);
machine.setInitialState(group);
machine.start();
//![9]
window.resize(300, 300);
window.show();
return app.exec();
}
#include "main.moc"

View File

@ -1,7 +0,0 @@
QT += widgets
SOURCES = main.cpp
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/moveblocks
INSTALLS += target

View File

@ -1,53 +0,0 @@
# Generated from states.pro.
cmake_minimum_required(VERSION 3.14)
project(states LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/states")
find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS Widgets)
add_qt_gui_executable(states
main.cpp
)
target_link_libraries(states PUBLIC
Qt::Core
Qt::Gui
Qt::Widgets
)
# Resources:
set(states_resource_files
"accessories-dictionary.png"
"akregator.png"
"digikam.png"
"help-browser.png"
"k3b.png"
"kchart.png"
)
qt6_add_resources(states "states"
PREFIX
"/"
FILES
${states_resource_files}
)
install(TARGETS states
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -1,295 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtWidgets>
class Pixmap : public QGraphicsObject
{
Q_OBJECT
public:
Pixmap(const QPixmap &pix) : QGraphicsObject(), p(pix)
{
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override
{
painter->drawPixmap(QPointF(), p);
}
QRectF boundingRect() const override
{
return QRectF( QPointF(0, 0), p.size());
}
private:
QPixmap p;
};
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QGraphicsScene *scene) : QGraphicsView(scene)
{
}
void resizeEvent(QResizeEvent *) override
{
fitInView(sceneRect(), Qt::KeepAspectRatio);
}
};
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(states);
QApplication app(argc, argv);
// Text edit and button
QTextEdit *edit = new QTextEdit;
edit->setText("asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
"asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
"asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
"asdf lkjha yuoiqwe asd iuaysd u iasyd uiy!");
QPushButton *button = new QPushButton;
QGraphicsProxyWidget *buttonProxy = new QGraphicsProxyWidget;
buttonProxy->setWidget(button);
QGraphicsProxyWidget *editProxy = new QGraphicsProxyWidget;
editProxy->setWidget(edit);
QGroupBox *box = new QGroupBox;
box->setFlat(true);
box->setTitle("Options");
QVBoxLayout *layout2 = new QVBoxLayout;
box->setLayout(layout2);
layout2->addWidget(new QRadioButton("Herring"));
layout2->addWidget(new QRadioButton("Blue Parrot"));
layout2->addWidget(new QRadioButton("Petunias"));
layout2->addStretch();
QGraphicsProxyWidget *boxProxy = new QGraphicsProxyWidget;
boxProxy->setWidget(box);
// Parent widget
QGraphicsWidget *widget = new QGraphicsWidget;
QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, widget);
layout->addItem(editProxy);
layout->addItem(buttonProxy);
widget->setLayout(layout);
Pixmap *p1 = new Pixmap(QPixmap(":/digikam.png"));
Pixmap *p2 = new Pixmap(QPixmap(":/akregator.png"));
Pixmap *p3 = new Pixmap(QPixmap(":/accessories-dictionary.png"));
Pixmap *p4 = new Pixmap(QPixmap(":/k3b.png"));
Pixmap *p5 = new Pixmap(QPixmap(":/help-browser.png"));
Pixmap *p6 = new Pixmap(QPixmap(":/kchart.png"));
QGraphicsScene scene(0, 0, 400, 300);
scene.setBackgroundBrush(scene.palette().window());
scene.addItem(widget);
scene.addItem(boxProxy);
scene.addItem(p1);
scene.addItem(p2);
scene.addItem(p3);
scene.addItem(p4);
scene.addItem(p5);
scene.addItem(p6);
QStateMachine machine;
QState *state1 = new QState(&machine);
QState *state2 = new QState(&machine);
QState *state3 = new QState(&machine);
machine.setInitialState(state1);
// State 1
state1->assignProperty(button, "text", "Switch to state 2");
state1->assignProperty(widget, "geometry", QRectF(0, 0, 400, 150));
state1->assignProperty(box, "geometry", QRect(-200, 150, 200, 150));
state1->assignProperty(p1, "pos", QPointF(68, 200)); // 185));
state1->assignProperty(p2, "pos", QPointF(168, 200)); // 185));
state1->assignProperty(p3, "pos", QPointF(268, 200)); // 185));
state1->assignProperty(p4, "pos", QPointF(68 - 150, 48 - 150));
state1->assignProperty(p5, "pos", QPointF(168, 48 - 150));
state1->assignProperty(p6, "pos", QPointF(268 + 150, 48 - 150));
state1->assignProperty(p1, "rotation", qreal(0));
state1->assignProperty(p2, "rotation", qreal(0));
state1->assignProperty(p3, "rotation", qreal(0));
state1->assignProperty(p4, "rotation", qreal(-270));
state1->assignProperty(p5, "rotation", qreal(-90));
state1->assignProperty(p6, "rotation", qreal(270));
state1->assignProperty(boxProxy, "opacity", qreal(0));
state1->assignProperty(p1, "opacity", qreal(1));
state1->assignProperty(p2, "opacity", qreal(1));
state1->assignProperty(p3, "opacity", qreal(1));
state1->assignProperty(p4, "opacity", qreal(0));
state1->assignProperty(p5, "opacity", qreal(0));
state1->assignProperty(p6, "opacity", qreal(0));
// State 2
state2->assignProperty(button, "text", "Switch to state 3");
state2->assignProperty(widget, "geometry", QRectF(200, 150, 200, 150));
state2->assignProperty(box, "geometry", QRect(9, 150, 190, 150));
state2->assignProperty(p1, "pos", QPointF(68 - 150, 185 + 150));
state2->assignProperty(p2, "pos", QPointF(168, 185 + 150));
state2->assignProperty(p3, "pos", QPointF(268 + 150, 185 + 150));
state2->assignProperty(p4, "pos", QPointF(64, 48));
state2->assignProperty(p5, "pos", QPointF(168, 48));
state2->assignProperty(p6, "pos", QPointF(268, 48));
state2->assignProperty(p1, "rotation", qreal(-270));
state2->assignProperty(p2, "rotation", qreal(90));
state2->assignProperty(p3, "rotation", qreal(270));
state2->assignProperty(p4, "rotation", qreal(0));
state2->assignProperty(p5, "rotation", qreal(0));
state2->assignProperty(p6, "rotation", qreal(0));
state2->assignProperty(boxProxy, "opacity", qreal(1));
state2->assignProperty(p1, "opacity", qreal(0));
state2->assignProperty(p2, "opacity", qreal(0));
state2->assignProperty(p3, "opacity", qreal(0));
state2->assignProperty(p4, "opacity", qreal(1));
state2->assignProperty(p5, "opacity", qreal(1));
state2->assignProperty(p6, "opacity", qreal(1));
// State 3
state3->assignProperty(button, "text", "Switch to state 1");
state3->assignProperty(p1, "pos", QPointF(0, 5));
state3->assignProperty(p2, "pos", QPointF(0, 5 + 64 + 5));
state3->assignProperty(p3, "pos", QPointF(5, 5 + (64 + 5) + 64));
state3->assignProperty(p4, "pos", QPointF(5 + 64 + 5, 5));
state3->assignProperty(p5, "pos", QPointF(5 + 64 + 5, 5 + 64 + 5));
state3->assignProperty(p6, "pos", QPointF(5 + 64 + 5, 5 + (64 + 5) + 64));
state3->assignProperty(widget, "geometry", QRectF(138, 5, 400 - 138, 200));
state3->assignProperty(box, "geometry", QRect(5, 205, 400, 90));
state3->assignProperty(p1, "opacity", qreal(1));
state3->assignProperty(p2, "opacity", qreal(1));
state3->assignProperty(p3, "opacity", qreal(1));
state3->assignProperty(p4, "opacity", qreal(1));
state3->assignProperty(p5, "opacity", qreal(1));
state3->assignProperty(p6, "opacity", qreal(1));
QAbstractTransition *t1 = state1->addTransition(button, &QAbstractButton::clicked, state2);
QSequentialAnimationGroup *animation1SubGroup = new QSequentialAnimationGroup;
animation1SubGroup->addPause(250);
animation1SubGroup->addAnimation(new QPropertyAnimation(box, "geometry"));
t1->addAnimation(animation1SubGroup);
t1->addAnimation(new QPropertyAnimation(widget, "geometry"));
t1->addAnimation(new QPropertyAnimation(p1, "pos"));
t1->addAnimation(new QPropertyAnimation(p2, "pos"));
t1->addAnimation(new QPropertyAnimation(p3, "pos"));
t1->addAnimation(new QPropertyAnimation(p4, "pos"));
t1->addAnimation(new QPropertyAnimation(p5, "pos"));
t1->addAnimation(new QPropertyAnimation(p6, "pos"));
t1->addAnimation(new QPropertyAnimation(p1, "rotation"));
t1->addAnimation(new QPropertyAnimation(p2, "rotation"));
t1->addAnimation(new QPropertyAnimation(p3, "rotation"));
t1->addAnimation(new QPropertyAnimation(p4, "rotation"));
t1->addAnimation(new QPropertyAnimation(p5, "rotation"));
t1->addAnimation(new QPropertyAnimation(p6, "rotation"));
t1->addAnimation(new QPropertyAnimation(p1, "opacity"));
t1->addAnimation(new QPropertyAnimation(p2, "opacity"));
t1->addAnimation(new QPropertyAnimation(p3, "opacity"));
t1->addAnimation(new QPropertyAnimation(p4, "opacity"));
t1->addAnimation(new QPropertyAnimation(p5, "opacity"));
t1->addAnimation(new QPropertyAnimation(p6, "opacity"));
QAbstractTransition *t2 = state2->addTransition(button, &QAbstractButton::clicked, state3);
t2->addAnimation(new QPropertyAnimation(box, "geometry"));
t2->addAnimation(new QPropertyAnimation(widget, "geometry"));
t2->addAnimation(new QPropertyAnimation(p1, "pos"));
t2->addAnimation(new QPropertyAnimation(p2, "pos"));
t2->addAnimation(new QPropertyAnimation(p3, "pos"));
t2->addAnimation(new QPropertyAnimation(p4, "pos"));
t2->addAnimation(new QPropertyAnimation(p5, "pos"));
t2->addAnimation(new QPropertyAnimation(p6, "pos"));
t2->addAnimation(new QPropertyAnimation(p1, "rotation"));
t2->addAnimation(new QPropertyAnimation(p2, "rotation"));
t2->addAnimation(new QPropertyAnimation(p3, "rotation"));
t2->addAnimation(new QPropertyAnimation(p4, "rotation"));
t2->addAnimation(new QPropertyAnimation(p5, "rotation"));
t2->addAnimation(new QPropertyAnimation(p6, "rotation"));
t2->addAnimation(new QPropertyAnimation(p1, "opacity"));
t2->addAnimation(new QPropertyAnimation(p2, "opacity"));
t2->addAnimation(new QPropertyAnimation(p3, "opacity"));
t2->addAnimation(new QPropertyAnimation(p4, "opacity"));
t2->addAnimation(new QPropertyAnimation(p5, "opacity"));
t2->addAnimation(new QPropertyAnimation(p6, "opacity"));
QAbstractTransition *t3 = state3->addTransition(button, &QAbstractButton::clicked, state1);
t3->addAnimation(new QPropertyAnimation(box, "geometry"));
t3->addAnimation(new QPropertyAnimation(widget, "geometry"));
t3->addAnimation(new QPropertyAnimation(p1, "pos"));
t3->addAnimation(new QPropertyAnimation(p2, "pos"));
t3->addAnimation(new QPropertyAnimation(p3, "pos"));
t3->addAnimation(new QPropertyAnimation(p4, "pos"));
t3->addAnimation(new QPropertyAnimation(p5, "pos"));
t3->addAnimation(new QPropertyAnimation(p6, "pos"));
t3->addAnimation(new QPropertyAnimation(p1, "rotation"));
t3->addAnimation(new QPropertyAnimation(p2, "rotation"));
t3->addAnimation(new QPropertyAnimation(p3, "rotation"));
t3->addAnimation(new QPropertyAnimation(p4, "rotation"));
t3->addAnimation(new QPropertyAnimation(p5, "rotation"));
t3->addAnimation(new QPropertyAnimation(p6, "rotation"));
t3->addAnimation(new QPropertyAnimation(p1, "opacity"));
t3->addAnimation(new QPropertyAnimation(p2, "opacity"));
t3->addAnimation(new QPropertyAnimation(p3, "opacity"));
t3->addAnimation(new QPropertyAnimation(p4, "opacity"));
t3->addAnimation(new QPropertyAnimation(p5, "opacity"));
t3->addAnimation(new QPropertyAnimation(p6, "opacity"));
machine.start();
GraphicsView view(&scene);
view.show();
return app.exec();
}
#include "main.moc"

View File

@ -1,8 +0,0 @@
QT += widgets
SOURCES += main.cpp
RESOURCES += states.qrc
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/states
INSTALLS += target

View File

@ -1,10 +0,0 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>accessories-dictionary.png</file>
<file>akregator.png</file>
<file>digikam.png</file>
<file>help-browser.png</file>
<file>k3b.png</file>
<file>kchart.png</file>
</qresource>
</RCC>

View File

@ -1,57 +0,0 @@
# Generated from stickman.pro.
cmake_minimum_required(VERSION 3.14)
project(stickman LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/stickman")
find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS Widgets)
add_qt_gui_executable(stickman
animation.cpp animation.h
graphicsview.cpp graphicsview.h
lifecycle.cpp lifecycle.h
main.cpp
node.cpp node.h
rectbutton.cpp rectbutton.h
stickman.cpp stickman.h
)
target_link_libraries(stickman PUBLIC
Qt::Core
Qt::Gui
Qt::Widgets
)
# Resources:
set(stickman_resource_files
"animations/chilling.bin"
"animations/dancing.bin"
"animations/dead.bin"
"animations/jumping.bin"
)
qt6_add_resources(stickman "stickman"
PREFIX
"/"
FILES
${stickman_resource_files}
)
install(TARGETS stickman
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,193 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "animation.h"
#include <QIODevice>
#include <QDataStream>
class Frame
{
public:
Frame() = default;
int nodeCount() const
{
return m_nodePositions.size();
}
void setNodeCount(int nodeCount)
{
m_nodePositions.resize(nodeCount);
}
QPointF nodePos(int idx) const
{
return m_nodePositions.at(idx);
}
void setNodePos(int idx, const QPointF &pos)
{
m_nodePositions[idx] = pos;
}
private:
QList<QPointF> m_nodePositions;
};
Animation::Animation() : m_currentFrame(0)
{
m_frames.append(new Frame);
}
Animation::~Animation()
{
qDeleteAll(m_frames);
}
void Animation::setTotalFrames(int totalFrames)
{
while (m_frames.size() < totalFrames)
m_frames.append(new Frame);
while (totalFrames < m_frames.size())
delete m_frames.takeLast();
setCurrentFrame(m_currentFrame);
}
int Animation::totalFrames() const
{
return m_frames.size();
}
void Animation::setCurrentFrame(int currentFrame)
{
m_currentFrame = qBound(0, currentFrame, totalFrames() - 1);
}
int Animation::currentFrame() const
{
return m_currentFrame;
}
void Animation::setNodeCount(int nodeCount)
{
Frame *frame = m_frames.at(m_currentFrame);
frame->setNodeCount(nodeCount);
}
int Animation::nodeCount() const
{
Frame *frame = m_frames.at(m_currentFrame);
return frame->nodeCount();
}
void Animation::setNodePos(int idx, const QPointF &pos)
{
Frame *frame = m_frames.at(m_currentFrame);
frame->setNodePos(idx, pos);
}
QPointF Animation::nodePos(int idx) const
{
Frame *frame = m_frames.at(m_currentFrame);
return frame->nodePos(idx);
}
QString Animation::name() const
{
return m_name;
}
void Animation::setName(const QString &name)
{
m_name = name;
}
void Animation::save(QIODevice *device) const
{
QDataStream stream(device);
stream << m_name;
stream << m_frames.size();
for (const Frame *frame : qAsConst(m_frames)) {
stream << frame->nodeCount();
for (int i = 0; i < frame->nodeCount(); ++i)
stream << frame->nodePos(i);
}
}
void Animation::load(QIODevice *device)
{
qDeleteAll(m_frames);
m_frames.clear();
QDataStream stream(device);
stream >> m_name;
int frameCount;
stream >> frameCount;
for (int i = 0; i < frameCount; ++i) {
int nodeCount;
stream >> nodeCount;
Frame *frame = new Frame;
frame->setNodeCount(nodeCount);
for (int j = 0; j < nodeCount; ++j) {
QPointF pos;
stream >> pos;
frame->setNodePos(j, pos);
}
m_frames.append(frame);
}
}

View File

@ -1,92 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef ANIMATION_H
#define ANIMATION_H
#include <QPointF>
#include <QString>
#include <QList>
class Frame;
QT_BEGIN_NAMESPACE
class QIODevice;
QT_END_NAMESPACE
class Animation
{
public:
Animation();
~Animation();
void setTotalFrames(int totalFrames);
int totalFrames() const;
void setCurrentFrame(int currentFrame);
int currentFrame() const;
void setNodeCount(int nodeCount);
int nodeCount() const;
void setNodePos(int idx, const QPointF &pos);
QPointF nodePos(int idx) const;
QString name() const;
void setName(const QString &name);
void save(QIODevice *device) const;
void load(QIODevice *device);
private:
QString m_name;
QList<Frame *> m_frames;
int m_currentFrame;
};
#endif

View File

@ -1,68 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "graphicsview.h"
#include "stickman.h"
#include <QKeyEvent>
#include <QGraphicsScene>
void GraphicsView::keyPressEvent(QKeyEvent *e)
{
if (e->key() == Qt::Key_Escape)
close();
emit keyPressed(Qt::Key(e->key()));
}
void GraphicsView::resizeEvent(QResizeEvent *e)
{
fitInView(scene()->sceneRect());
QGraphicsView::resizeEvent(e);
}

View File

@ -1,70 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QGraphicsView>
class GraphicsView: public QGraphicsView
{
Q_OBJECT
public:
using QGraphicsView::QGraphicsView;
protected:
void resizeEvent(QResizeEvent *e) override;
void keyPressEvent(QKeyEvent *e) override;
signals:
void keyPressed(int key);
};
#endif

View File

@ -1,234 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "lifecycle.h"
#include "stickman.h"
#include "node.h"
#include "animation.h"
#include "graphicsview.h"
#include <QEventTransition>
#include <QFile>
#include <QParallelAnimationGroup>
#include <QPropertyAnimation>
#include <QRandomGenerator>
#include <QSignalTransition>
#include <QState>
#include <QStateMachine>
#include <QTimer>
class KeyPressTransition: public QSignalTransition
{
public:
KeyPressTransition(GraphicsView *receiver, Qt::Key key)
: QSignalTransition(receiver, &GraphicsView::keyPressed), m_key(key)
{
}
KeyPressTransition(GraphicsView *receiver, Qt::Key key, QAbstractState *target)
: QSignalTransition(receiver, &GraphicsView::keyPressed), m_key(key)
{
setTargetState(target);
}
bool eventTest(QEvent *e) override
{
if (QSignalTransition::eventTest(e)) {
QVariant key = static_cast<QStateMachine::SignalEvent*>(e)->arguments().at(0);
return (key.toInt() == int(m_key));
}
return false;
}
private:
Qt::Key m_key;
};
//! [4]
class LightningStrikesTransition: public QEventTransition
{
public:
LightningStrikesTransition(QAbstractState *target)
: QEventTransition(this, QEvent::Timer)
{
setTargetState(target);
startTimer(1000);
}
bool eventTest(QEvent *e) override
{
return QEventTransition::eventTest(e) && QRandomGenerator::global()->bounded(50) == 0;
}
};
//! [4]
LifeCycle::LifeCycle(StickMan *stickMan, GraphicsView *keyReceiver)
: m_stickMan(stickMan), m_keyReceiver(keyReceiver)
{
// Create animation group to be used for all transitions
m_animationGroup = new QParallelAnimationGroup();
const int stickManNodeCount = m_stickMan->nodeCount();
for (int i = 0; i < stickManNodeCount; ++i) {
QPropertyAnimation *pa = new QPropertyAnimation(m_stickMan->node(i), "pos");
m_animationGroup->addAnimation(pa);
}
// Set up initial state graph
//! [3]
m_machine = new QStateMachine();
m_machine->addDefaultAnimation(m_animationGroup);
//! [3]
m_alive = new QState(m_machine);
m_alive->setObjectName("alive");
// Make it blink when lightning strikes before entering dead animation
QState *lightningBlink = new QState(m_machine);
lightningBlink->assignProperty(m_stickMan->scene(), "backgroundBrush", QColor(Qt::white));
lightningBlink->assignProperty(m_stickMan, "penColor", QColor(Qt::black));
lightningBlink->assignProperty(m_stickMan, "fillColor", QColor(Qt::white));
lightningBlink->assignProperty(m_stickMan, "isDead", true);
//! [5]
QTimer *timer = new QTimer(lightningBlink);
timer->setSingleShot(true);
timer->setInterval(100);
QObject::connect(lightningBlink, &QAbstractState::entered,
timer, QOverload<>::of(&QTimer::start));
QObject::connect(lightningBlink, &QAbstractState::exited,
timer, &QTimer::stop);
//! [5]
m_dead = new QState(m_machine);
m_dead->assignProperty(m_stickMan->scene(), "backgroundBrush", QColor(Qt::black));
m_dead->assignProperty(m_stickMan, "penColor", QColor(Qt::white));
m_dead->assignProperty(m_stickMan, "fillColor", QColor(Qt::black));
m_dead->setObjectName("dead");
// Idle state (sets no properties)
m_idle = new QState(m_alive);
m_idle->setObjectName("idle");
m_alive->setInitialState(m_idle);
// Lightning strikes at random
m_alive->addTransition(new LightningStrikesTransition(lightningBlink));
//! [0]
lightningBlink->addTransition(timer, &QTimer::timeout, m_dead);
//! [0]
m_machine->setInitialState(m_alive);
}
void LifeCycle::setDeathAnimation(const QString &fileName)
{
QState *deathAnimation = makeState(m_dead, fileName);
m_dead->setInitialState(deathAnimation);
}
void LifeCycle::start()
{
m_machine->start();
}
void LifeCycle::addActivity(const QString &fileName, Qt::Key key, QObject *sender, const char *signal)
{
QState *state = makeState(m_alive, fileName);
m_alive->addTransition(new KeyPressTransition(m_keyReceiver, key, state));
if (sender && signal)
m_alive->addTransition(sender, signal, state);
}
QState *LifeCycle::makeState(QState *parentState, const QString &animationFileName)
{
QState *topLevel = new QState(parentState);
Animation animation;
{
QFile file(animationFileName);
if (file.open(QIODevice::ReadOnly))
animation.load(&file);
}
const int frameCount = animation.totalFrames();
QState *previousState = nullptr;
for (int i = 0; i < frameCount; ++i) {
animation.setCurrentFrame(i);
//! [1]
QState *frameState = new QState(topLevel);
const int nodeCount = animation.nodeCount();
for (int j = 0; j < nodeCount; ++j)
frameState->assignProperty(m_stickMan->node(j), "pos", animation.nodePos(j));
//! [1]
frameState->setObjectName(QString::fromLatin1("frame %0").arg(i));
if (previousState == nullptr)
topLevel->setInitialState(frameState);
else
//! [2]
previousState->addTransition(previousState, &QState::propertiesAssigned, frameState);
//! [2]
previousState = frameState;
}
// Loop
previousState->addTransition(previousState, &QState::propertiesAssigned, topLevel->initialState());
return topLevel;
}
LifeCycle::~LifeCycle()
{
delete m_machine;
delete m_animationGroup;
}

View File

@ -1,91 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef LIFECYCLE_H
#define LIFECYCLE_H
#include <Qt>
QT_BEGIN_NAMESPACE
class QAbstractState;
class QAbstractTransition;
class QAnimationGroup;
class QObject;
class QState;
class QStateMachine;
QT_END_NAMESPACE
class GraphicsView;
class StickMan;
class LifeCycle
{
public:
LifeCycle(StickMan *stickMan, GraphicsView *keyEventReceiver);
~LifeCycle();
void setDeathAnimation(const QString &fileName);
void addActivity(const QString &fileName, Qt::Key key,
QObject *sender = nullptr, const char *signal = nullptr);
void start();
private:
QState *makeState(QState *parentState, const QString &animationFileName);
StickMan *m_stickMan;
QStateMachine *m_machine;
QAnimationGroup *m_animationGroup;
GraphicsView *m_keyReceiver;
QState *m_alive;
QState *m_dead;
QState *m_idle;
};
#endif

View File

@ -1,116 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "animation.h"
#include "node.h"
#include "lifecycle.h"
#include "stickman.h"
#include "graphicsview.h"
#include "rectbutton.h"
#include <QtCore>
#include <QtWidgets>
int main(int argc, char **argv)
{
Q_INIT_RESOURCE(stickman);
QApplication app(argc, argv);
StickMan *stickMan = new StickMan;
stickMan->setDrawSticks(false);
QGraphicsTextItem *textItem = new QGraphicsTextItem();
textItem->setHtml("<font color=\"white\"><b>Stickman</b>"
"<p>"
"Tell the stickman what to do!"
"</p>"
"<p><i>"
"<li>Press <font color=\"purple\">J</font> to make the stickman jump.</li>"
"<li>Press <font color=\"purple\">D</font> to make the stickman dance.</li>"
"<li>Press <font color=\"purple\">C</font> to make him chill out.</li>"
"<li>When you are done, press <font color=\"purple\">Escape</font>.</li>"
"</i></p>"
"<p>If he is unlucky, the stickman will get struck by lightning, and never jump, dance or chill out again."
"</p></font>");
qreal w = textItem->boundingRect().width();
QRectF stickManBoundingRect = stickMan->mapToScene(stickMan->boundingRect()).boundingRect();
textItem->setPos(-w / 2.0, stickManBoundingRect.bottom() + 25.0);
QGraphicsScene scene;
scene.addItem(stickMan);
scene.addItem(textItem);
scene.setBackgroundBrush(Qt::black);
GraphicsView view;
view.setRenderHints(QPainter::Antialiasing);
view.setTransformationAnchor(QGraphicsView::NoAnchor);
view.setScene(&scene);
QRectF sceneRect = scene.sceneRect();
// making enough room in the scene for stickman to jump and die
view.resize(sceneRect.width() + 100, sceneRect.height() + 100);
view.setSceneRect(sceneRect);
view.show();
view.setFocus();
LifeCycle cycle(stickMan, &view);
cycle.setDeathAnimation(":/animations/dead.bin");
cycle.addActivity(":/animations/jumping.bin", Qt::Key_J);
cycle.addActivity(":/animations/dancing.bin", Qt::Key_D);
cycle.addActivity(":/animations/chilling.bin", Qt::Key_C);
cycle.start();
return app.exec();
}

View File

@ -1,102 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "node.h"
#include "stickman.h"
#include <QRectF>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
Node::Node(const QPointF &pos, QGraphicsItem *parent)
: QGraphicsObject(parent), m_dragging(false)
{
setPos(pos);
setFlag(QGraphicsItem::ItemSendsGeometryChanges);
}
Node::~Node()
{
}
QRectF Node::boundingRect() const
{
return QRectF(-6.0, -6.0, 12.0, 12.0);
}
void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
painter->setPen(Qt::white);
painter->drawEllipse(QPointF(0.0, 0.0), 5.0, 5.0);
}
QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (change == QGraphicsItem::ItemPositionChange)
emit positionChanged();
return QGraphicsObject::itemChange(change, value);
}
void Node::mousePressEvent(QGraphicsSceneMouseEvent *)
{
m_dragging = true;
}
void Node::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (m_dragging)
setPos(mapToParent(event->pos()));
}
void Node::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
{
m_dragging = false;
}

View File

@ -1,80 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef NODE_H
#define NODE_H
#include <QGraphicsObject>
class Node: public QGraphicsObject
{
Q_OBJECT
public:
explicit Node(const QPointF &pos, QGraphicsItem *parent = nullptr);
~Node();
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
signals:
void positionChanged();
protected:
QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
void mousePressEvent(QGraphicsSceneMouseEvent *) override;
void mouseMoveEvent(QGraphicsSceneMouseEvent *) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *) override;
private:
bool m_dragging;
};
#endif

View File

@ -1,78 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "rectbutton.h"
#include <QPainter>
RectButton::RectButton(const QString &buttonText) : m_ButtonText(buttonText)
{
}
void RectButton::mousePressEvent (QGraphicsSceneMouseEvent *)
{
emit clicked();
}
QRectF RectButton::boundingRect() const
{
return QRectF(0.0, 0.0, 90.0, 40.0);
}
void RectButton::paint(QPainter *painter, const QStyleOptionGraphicsItem * /* option */, QWidget * /* widget */)
{
painter->setBrush(Qt::gray);
painter->drawRoundedRect(boundingRect(), 5, 5);
painter->setPen(Qt::white);
painter->drawText(20, 25, m_ButtonText);
}

View File

@ -1,75 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef RECTBUTTON_H
#define RECTBUTTON_H
#include <QGraphicsObject>
class RectButton : public QGraphicsObject
{
Q_OBJECT
public:
RectButton(const QString &buttonText);
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
protected:
void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
signals:
void clicked();
private:
QString m_ButtonText;
};
#endif // RECTBUTTON_H

View File

@ -1,329 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "stickman.h"
#include "node.h"
#include <QPainter>
#include <QtMath>
static constexpr qreal Coords[NodeCount * 2] = {
0.0, -150.0, // head, #0
0.0, -100.0, // body pentagon, top->bottom, left->right, #1 - 5
-50.0, -50.0,
50.0, -50.0,
-25.0, 50.0,
25.0, 50.0,
-100.0, 0.0, // right arm, #6 - 7
-125.0, 50.0,
100.0, 0.0, // left arm, #8 - 9
125.0, 50.0,
-35.0, 75.0, // lower body, #10 - 11
35.0, 75.0,
-25.0, 200.0, // right leg, #12 - 13
-30.0, 300.0,
25.0, 200.0, // left leg, #14 - 15
30.0, 300.0
};
static constexpr int Bones[BoneCount * 2] = {
0, 1, // neck
1, 2, // body
1, 3,
1, 4,
1, 5,
2, 3,
2, 4,
2, 5,
3, 4,
3, 5,
4, 5,
2, 6, // right arm
6, 7,
3, 8, // left arm
8, 9,
4, 10, // lower body
4, 11,
5, 10,
5, 11,
10, 11,
10, 12, // right leg
12, 13,
11, 14, // left leg
14, 15
};
StickMan::StickMan()
{
// Set up start position of limbs
for (int i = 0; i < NodeCount; ++i) {
m_nodes[i] = new Node(QPointF(Coords[i * 2], Coords[i * 2 + 1]), this);
connect(m_nodes[i], &Node::positionChanged, this, &StickMan::childPositionChanged);
}
for (int i = 0; i < BoneCount; ++i) {
int n1 = Bones[i * 2];
int n2 = Bones[i * 2 + 1];
Node *node1 = m_nodes[n1];
Node *node2 = m_nodes[n2];
QPointF dist = node1->pos() - node2->pos();
m_perfectBoneLengths[i] = sqrt(pow(dist.x(), 2) + pow(dist.y(), 2));
}
startTimer(10);
}
void StickMan::childPositionChanged()
{
prepareGeometryChange();
}
void StickMan::setDrawSticks(bool on)
{
m_sticks = on;
for (int i = 0; i < nodeCount(); ++i) {
Node *node = m_nodes[i];
node->setVisible(on);
}
}
QRectF StickMan::boundingRect() const
{
// account for head radius=50.0 plus pen which is 5.0
return childrenBoundingRect().adjusted(-55.0, -55.0, 55.0, 55.0);
}
int StickMan::nodeCount() const
{
return NodeCount;
}
Node *StickMan::node(int idx) const
{
if (idx >= 0 && idx < NodeCount)
return m_nodes[idx];
return nullptr;
}
void StickMan::timerEvent(QTimerEvent *)
{
update();
}
void StickMan::stabilize()
{
static const qreal threshold = 0.001;
for (int i = 0; i < BoneCount; ++i) {
int n1 = Bones[i * 2];
int n2 = Bones[i * 2 + 1];
Node *node1 = m_nodes[n1];
Node *node2 = m_nodes[n2];
QPointF pos1 = node1->pos();
QPointF pos2 = node2->pos();
QPointF dist = pos1 - pos2;
qreal length = sqrt(pow(dist.x(),2) + pow(dist.y(),2));
qreal diff = (length - m_perfectBoneLengths[i]) / length;
QPointF p = dist * (0.5 * diff);
if (p.x() > threshold && p.y() > threshold) {
pos1 -= p;
pos2 += p;
node1->setPos(pos1);
node2->setPos(pos2);
}
}
}
QPointF StickMan::posFor(int idx) const
{
return m_nodes[idx]->pos();
}
//#include <QTime>
void StickMan::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
/* static int frames = 0;
static QTime time;
if (frames++ % 100 == 0) {
frames = 1;
time.restart();
}
if (time.elapsed() > 0) {
painter->setPen(Qt::white);
painter->drawText(0, 0, QString::number(frames / (time.elapsed() / 1000.0)));
}*/
stabilize();
if (m_sticks) {
painter->setPen(Qt::white);
for (int i = 0; i < BoneCount; ++i) {
int n1 = Bones[i * 2];
int n2 = Bones[i * 2 + 1];
Node *node1 = m_nodes[n1];
Node *node2 = m_nodes[n2];
painter->drawLine(node1->pos(), node2->pos());
}
} else {
// first bone is neck and will be used for head
QPainterPath path;
path.moveTo(posFor(0));
path.lineTo(posFor(1));
// right arm
path.lineTo(posFor(2));
path.lineTo(posFor(6));
path.lineTo(posFor(7));
// left arm
path.moveTo(posFor(3));
path.lineTo(posFor(8));
path.lineTo(posFor(9));
// body
path.moveTo(posFor(2));
path.lineTo(posFor(4));
path.lineTo(posFor(10));
path.lineTo(posFor(11));
path.lineTo(posFor(5));
path.lineTo(posFor(3));
path.lineTo(posFor(1));
// right leg
path.moveTo(posFor(10));
path.lineTo(posFor(12));
path.lineTo(posFor(13));
// left leg
path.moveTo(posFor(11));
path.lineTo(posFor(14));
path.lineTo(posFor(15));
painter->setPen(QPen(m_penColor, 5.0, Qt::SolidLine, Qt::RoundCap));
painter->drawPath(path);
{
int n1 = Bones[0];
int n2 = Bones[1];
Node *node1 = m_nodes[n1];
Node *node2 = m_nodes[n2];
QPointF dist = node2->pos() - node1->pos();
qreal sinAngle = dist.x() / sqrt(pow(dist.x(), 2) + pow(dist.y(), 2));
qreal angle = qRadiansToDegrees(asin(sinAngle));
QPointF headPos = node1->pos();
painter->translate(headPos);
painter->rotate(-angle);
painter->setBrush(m_fillColor);
painter->drawEllipse(QPointF(0,0), 50.0, 50.0);
painter->setBrush(m_penColor);
painter->setPen(QPen(m_penColor, 2.5, Qt::SolidLine, Qt::RoundCap));
// eyes
if (m_isDead) {
painter->drawLine(-30.0, -30.0, -20.0, -20.0);
painter->drawLine(-20.0, -30.0, -30.0, -20.0);
painter->drawLine(20.0, -30.0, 30.0, -20.0);
painter->drawLine(30.0, -30.0, 20.0, -20.0);
} else {
painter->drawChord(QRectF(-30.0, -30.0, 25.0, 70.0), 30.0*16, 120.0*16);
painter->drawChord(QRectF(5.0, -30.0, 25.0, 70.0), 30.0*16, 120.0*16);
}
// mouth
if (m_isDead) {
painter->drawLine(-28.0, 2.0, 29.0, 2.0);
} else {
painter->setBrush(QColor(128, 0, 64 ));
painter->drawChord(QRectF(-28.0, 2.0-55.0/2.0, 57.0, 55.0), 0.0, -180.0*16);
}
// pupils
if (!m_isDead) {
painter->setPen(QPen(m_fillColor, 1.0, Qt::SolidLine, Qt::RoundCap));
painter->setBrush(m_fillColor);
painter->drawEllipse(QPointF(-12.0, -25.0), 5.0, 5.0);
painter->drawEllipse(QPointF(22.0, -25.0), 5.0, 5.0);
}
}
}
}

View File

@ -1,108 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef STICKMAN_H
#define STICKMAN_H
#include <QGraphicsObject>
static const int NodeCount = 16;
static const int BoneCount = 24;
class Node;
class StickMan: public QGraphicsObject
{
Q_OBJECT
Q_PROPERTY(QColor penColor WRITE setPenColor READ penColor)
Q_PROPERTY(QColor fillColor WRITE setFillColor READ fillColor)
Q_PROPERTY(bool isDead WRITE setIsDead READ isDead)
public:
StickMan();
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
int nodeCount() const;
Node *node(int idx) const;
void setDrawSticks(bool on);
bool drawSticks() const { return m_sticks; }
QColor penColor() const { return m_penColor; }
void setPenColor(const QColor &color) { m_penColor = color; }
QColor fillColor() const { return m_fillColor; }
void setFillColor(const QColor &color) { m_fillColor = color; }
bool isDead() const { return m_isDead; }
void setIsDead(bool isDead) { m_isDead = isDead; }
public slots:
void stabilize();
void childPositionChanged();
protected:
void timerEvent(QTimerEvent *e) override;
private:
QPointF posFor(int idx) const;
Node *m_nodes[NodeCount];
qreal m_perfectBoneLengths[BoneCount];
bool m_sticks = true;
bool m_isDead = false;
QColor m_penColor = Qt::white;
QColor m_fillColor = Qt::black;
};
#endif // STICKMAN_H

View File

@ -1,21 +0,0 @@
QT += widgets
HEADERS += stickman.h \
animation.h \
node.h \
lifecycle.h \
graphicsview.h \
rectbutton.h
SOURCES += main.cpp \
stickman.cpp \
animation.cpp \
node.cpp \
lifecycle.cpp \
graphicsview.cpp \
rectbutton.cpp
RESOURCES += stickman.qrc
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/stickman
INSTALLS += target

View File

@ -1,8 +0,0 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>animations/chilling.bin</file>
<file>animations/dancing.bin</file>
<file>animations/dead.bin</file>
<file>animations/jumping.bin</file>
</qresource>
</RCC>

View File

@ -1,196 +0,0 @@
# Generated from sub-attaq.pro.
cmake_minimum_required(VERSION 3.14)
project(sub-attaq LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/sub-attaq")
find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS Widgets)
add_qt_gui_executable(sub-attaq
animationmanager.cpp animationmanager.h
boat.cpp boat.h boat_p.h
bomb.cpp bomb.h
graphicsscene.cpp graphicsscene.h
main.cpp
mainwindow.cpp mainwindow.h
pixmapitem.cpp pixmapitem.h
progressitem.cpp progressitem.h
qanimationstate.cpp qanimationstate.h
states.cpp states.h
submarine.cpp submarine.h submarine_p.h
textinformationitem.cpp textinformationitem.h
torpedo.cpp torpedo.h
)
target_link_libraries(sub-attaq PUBLIC
Qt::Core
Qt::Gui
Qt::Widgets
)
# Resources:
set_source_files_properties("pics/big/background.png"
PROPERTIES QT_RESOURCE_ALIAS "big/background"
)
set_source_files_properties("pics/big/boat.png"
PROPERTIES QT_RESOURCE_ALIAS "big/boat"
)
set_source_files_properties("pics/big/bomb.png"
PROPERTIES QT_RESOURCE_ALIAS "big/bomb"
)
set_source_files_properties("pics/big/explosion/boat/step1.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step1"
)
set_source_files_properties("pics/big/explosion/boat/step2.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step2"
)
set_source_files_properties("pics/big/explosion/boat/step3.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step3"
)
set_source_files_properties("pics/big/explosion/boat/step4.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step4"
)
set_source_files_properties("pics/big/explosion/submarine/step1.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step1"
)
set_source_files_properties("pics/big/explosion/submarine/step2.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step2"
)
set_source_files_properties("pics/big/explosion/submarine/step3.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step3"
)
set_source_files_properties("pics/big/explosion/submarine/step4.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step4"
)
set_source_files_properties("pics/big/submarine.png"
PROPERTIES QT_RESOURCE_ALIAS "big/submarine"
)
set_source_files_properties("pics/big/surface.png"
PROPERTIES QT_RESOURCE_ALIAS "big/surface"
)
set_source_files_properties("pics/big/torpedo.png"
PROPERTIES QT_RESOURCE_ALIAS "big/torpedo"
)
set_source_files_properties("pics/scalable/boat.svg"
PROPERTIES QT_RESOURCE_ALIAS "boat"
)
set_source_files_properties("pics/scalable/sub-attaq.svg"
PROPERTIES QT_RESOURCE_ALIAS "all"
)
set_source_files_properties("pics/scalable/submarine.svg"
PROPERTIES QT_RESOURCE_ALIAS "submarine"
)
set_source_files_properties("pics/scalable/torpedo.svg"
PROPERTIES QT_RESOURCE_ALIAS "torpedo"
)
set_source_files_properties("pics/small/background.png"
PROPERTIES QT_RESOURCE_ALIAS "small/background"
)
set_source_files_properties("pics/small/boat.png"
PROPERTIES QT_RESOURCE_ALIAS "small/boat"
)
set_source_files_properties("pics/small/bomb.png"
PROPERTIES QT_RESOURCE_ALIAS "small/bomb"
)
set_source_files_properties("pics/small/submarine.png"
PROPERTIES QT_RESOURCE_ALIAS "small/submarine"
)
set_source_files_properties("pics/small/surface.png"
PROPERTIES QT_RESOURCE_ALIAS "small/surface"
)
set_source_files_properties("pics/small/torpedo.png"
PROPERTIES QT_RESOURCE_ALIAS "small/torpedo"
)
set_source_files_properties("pics/welcome/logo-a.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-a"
)
set_source_files_properties("pics/welcome/logo-a2.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-a2"
)
set_source_files_properties("pics/welcome/logo-b.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-b"
)
set_source_files_properties("pics/welcome/logo-dash.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-dash"
)
set_source_files_properties("pics/welcome/logo-excl.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-excl"
)
set_source_files_properties("pics/welcome/logo-q.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-q"
)
set_source_files_properties("pics/welcome/logo-s.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-s"
)
set_source_files_properties("pics/welcome/logo-t.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-t"
)
set_source_files_properties("pics/welcome/logo-t2.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-t2"
)
set_source_files_properties("pics/welcome/logo-u.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-u"
)
set(subattaq_resource_files
"data.xml"
"pics/big/background.png"
"pics/big/boat.png"
"pics/big/bomb.png"
"pics/big/explosion/boat/step1.png"
"pics/big/explosion/boat/step2.png"
"pics/big/explosion/boat/step3.png"
"pics/big/explosion/boat/step4.png"
"pics/big/explosion/submarine/step1.png"
"pics/big/explosion/submarine/step2.png"
"pics/big/explosion/submarine/step3.png"
"pics/big/explosion/submarine/step4.png"
"pics/big/submarine.png"
"pics/big/surface.png"
"pics/big/torpedo.png"
"pics/scalable/boat.svg"
"pics/scalable/sub-attaq.svg"
"pics/scalable/submarine.svg"
"pics/scalable/torpedo.svg"
"pics/small/background.png"
"pics/small/boat.png"
"pics/small/bomb.png"
"pics/small/submarine.png"
"pics/small/surface.png"
"pics/small/torpedo.png"
"pics/welcome/logo-a.png"
"pics/welcome/logo-a2.png"
"pics/welcome/logo-b.png"
"pics/welcome/logo-dash.png"
"pics/welcome/logo-excl.png"
"pics/welcome/logo-q.png"
"pics/welcome/logo-s.png"
"pics/welcome/logo-t.png"
"pics/welcome/logo-t2.png"
"pics/welcome/logo-u.png"
)
qt6_add_resources(sub-attaq "subattaq"
PREFIX
"/"
FILES
${subattaq_resource_files}
)
install(TARGETS sub-attaq
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,197 +0,0 @@
# Generated from sub-attaq.pro.
cmake_minimum_required(VERSION 3.14)
project(sub-attaq LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/sub-attaq")
find_package(Qt6 COMPONENTS Core)
find_package(Qt6 COMPONENTS Gui)
find_package(Qt6 COMPONENTS Widgets)
find_package(Qt6 COMPONENTS OpenGL) # special case
add_qt_gui_executable(sub-attaq
animationmanager.cpp animationmanager.h
boat.cpp boat.h boat_p.h
bomb.cpp bomb.h
graphicsscene.cpp graphicsscene.h
main.cpp
mainwindow.cpp mainwindow.h
pixmapitem.cpp pixmapitem.h
progressitem.cpp progressitem.h
qanimationstate.cpp qanimationstate.h
states.cpp states.h
submarine.cpp submarine.h submarine_p.h
textinformationitem.cpp textinformationitem.h
torpedo.cpp torpedo.h
)
target_link_libraries(sub-attaq PUBLIC
Qt::Core
Qt::Gui
Qt::Widgets
)
# Resources:
set_source_files_properties("pics/big/background.png"
PROPERTIES QT_RESOURCE_ALIAS "big/background"
)
set_source_files_properties("pics/big/boat.png"
PROPERTIES QT_RESOURCE_ALIAS "big/boat"
)
set_source_files_properties("pics/big/bomb.png"
PROPERTIES QT_RESOURCE_ALIAS "big/bomb"
)
set_source_files_properties("pics/big/explosion/boat/step1.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step1"
)
set_source_files_properties("pics/big/explosion/boat/step2.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step2"
)
set_source_files_properties("pics/big/explosion/boat/step3.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step3"
)
set_source_files_properties("pics/big/explosion/boat/step4.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step4"
)
set_source_files_properties("pics/big/explosion/submarine/step1.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step1"
)
set_source_files_properties("pics/big/explosion/submarine/step2.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step2"
)
set_source_files_properties("pics/big/explosion/submarine/step3.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step3"
)
set_source_files_properties("pics/big/explosion/submarine/step4.png"
PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step4"
)
set_source_files_properties("pics/big/submarine.png"
PROPERTIES QT_RESOURCE_ALIAS "big/submarine"
)
set_source_files_properties("pics/big/surface.png"
PROPERTIES QT_RESOURCE_ALIAS "big/surface"
)
set_source_files_properties("pics/big/torpedo.png"
PROPERTIES QT_RESOURCE_ALIAS "big/torpedo"
)
set_source_files_properties("pics/scalable/boat.svg"
PROPERTIES QT_RESOURCE_ALIAS "boat"
)
set_source_files_properties("pics/scalable/sub-attaq.svg"
PROPERTIES QT_RESOURCE_ALIAS "all"
)
set_source_files_properties("pics/scalable/submarine.svg"
PROPERTIES QT_RESOURCE_ALIAS "submarine"
)
set_source_files_properties("pics/scalable/torpedo.svg"
PROPERTIES QT_RESOURCE_ALIAS "torpedo"
)
set_source_files_properties("pics/small/background.png"
PROPERTIES QT_RESOURCE_ALIAS "small/background"
)
set_source_files_properties("pics/small/boat.png"
PROPERTIES QT_RESOURCE_ALIAS "small/boat"
)
set_source_files_properties("pics/small/bomb.png"
PROPERTIES QT_RESOURCE_ALIAS "small/bomb"
)
set_source_files_properties("pics/small/submarine.png"
PROPERTIES QT_RESOURCE_ALIAS "small/submarine"
)
set_source_files_properties("pics/small/surface.png"
PROPERTIES QT_RESOURCE_ALIAS "small/surface"
)
set_source_files_properties("pics/small/torpedo.png"
PROPERTIES QT_RESOURCE_ALIAS "small/torpedo"
)
set_source_files_properties("pics/welcome/logo-a.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-a"
)
set_source_files_properties("pics/welcome/logo-a2.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-a2"
)
set_source_files_properties("pics/welcome/logo-b.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-b"
)
set_source_files_properties("pics/welcome/logo-dash.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-dash"
)
set_source_files_properties("pics/welcome/logo-excl.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-excl"
)
set_source_files_properties("pics/welcome/logo-q.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-q"
)
set_source_files_properties("pics/welcome/logo-s.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-s"
)
set_source_files_properties("pics/welcome/logo-t.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-t"
)
set_source_files_properties("pics/welcome/logo-t2.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-t2"
)
set_source_files_properties("pics/welcome/logo-u.png"
PROPERTIES QT_RESOURCE_ALIAS "logo-u"
)
set(subattaq_resource_files
"data.xml"
"pics/big/background.png"
"pics/big/boat.png"
"pics/big/bomb.png"
"pics/big/explosion/boat/step1.png"
"pics/big/explosion/boat/step2.png"
"pics/big/explosion/boat/step3.png"
"pics/big/explosion/boat/step4.png"
"pics/big/explosion/submarine/step1.png"
"pics/big/explosion/submarine/step2.png"
"pics/big/explosion/submarine/step3.png"
"pics/big/explosion/submarine/step4.png"
"pics/big/submarine.png"
"pics/big/surface.png"
"pics/big/torpedo.png"
"pics/scalable/boat.svg"
"pics/scalable/sub-attaq.svg"
"pics/scalable/submarine.svg"
"pics/scalable/torpedo.svg"
"pics/small/background.png"
"pics/small/boat.png"
"pics/small/bomb.png"
"pics/small/submarine.png"
"pics/small/surface.png"
"pics/small/torpedo.png"
"pics/welcome/logo-a.png"
"pics/welcome/logo-a2.png"
"pics/welcome/logo-b.png"
"pics/welcome/logo-dash.png"
"pics/welcome/logo-excl.png"
"pics/welcome/logo-q.png"
"pics/welcome/logo-s.png"
"pics/welcome/logo-t.png"
"pics/welcome/logo-t2.png"
"pics/welcome/logo-u.png"
)
qt6_add_resources(sub-attaq "subattaq"
PREFIX
"/"
FILES
${subattaq_resource_files}
)
install(TARGETS sub-attaq
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,98 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
//Own
#include "animationmanager.h"
#include <QAbstractAnimation>
AnimationManager *AnimationManager::self()
{
// the universe's only animation manager
static AnimationManager s_instance;
return &s_instance;
}
void AnimationManager::registerAnimation(QAbstractAnimation *anim)
{
QObject::connect(anim, &QObject::destroyed, this, &AnimationManager::unregisterAnimation_helper);
animations.append(anim);
}
void AnimationManager::unregisterAnimation_helper(QObject *obj)
{
unregisterAnimation(static_cast<QAbstractAnimation*>(obj));
}
void AnimationManager::unregisterAnimation(QAbstractAnimation *anim)
{
QObject::disconnect(anim, &QObject::destroyed, this, &AnimationManager::unregisterAnimation_helper);
animations.removeAll(anim);
}
void AnimationManager::unregisterAllAnimations()
{
animations.clear();
}
void AnimationManager::pauseAll()
{
for (QAbstractAnimation *animation : qAsConst(animations)) {
if (animation->state() == QAbstractAnimation::Running)
animation->pause();
}
}
void AnimationManager::resumeAll()
{
for (QAbstractAnimation *animation : qAsConst(animations)) {
if (animation->state() == QAbstractAnimation::Paused)
animation->resume();
}
}

View File

@ -1,82 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef ANIMATIONMANAGER_H
#define ANIMATIONMANAGER_H
#include <QObject>
QT_BEGIN_NAMESPACE
class QAbstractAnimation;
QT_END_NAMESPACE
class AnimationManager : public QObject
{
Q_OBJECT
AnimationManager() = default;
~AnimationManager() = default;
public:
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:
QList<QAbstractAnimation *> animations;
};
#endif // ANIMATIONMANAGER_H

View File

@ -1,281 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
//Own
#include "boat.h"
#include "boat_p.h"
#include "bomb.h"
#include "graphicsscene.h"
#include "animationmanager.h"
#include "qanimationstate.h"
//Qt
#include <QFinalState>
#include <QHistoryState>
#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>
#include <QState>
#include <QStateMachine>
static QAbstractAnimation *setupDestroyAnimation(Boat *boat)
{
QSequentialAnimationGroup *group = new QSequentialAnimationGroup(boat);
for (int i = 1; i <= 4; i++) {
PixmapItem *step = new PixmapItem(QString("explosion/boat/step%1").arg(i),GraphicsScene::Big, boat);
step->setZValue(6);
step->setOpacity(0);
//fade-in
QPropertyAnimation *anim = new QPropertyAnimation(step, "opacity");
anim->setEndValue(1);
anim->setDuration(100);
group->insertAnimation(i-1, anim);
//and then fade-out
QPropertyAnimation *anim2 = new QPropertyAnimation(step, "opacity");
anim2->setEndValue(0);
anim2->setDuration(100);
group->addAnimation(anim2);
}
AnimationManager::self()->registerAnimation(group);
return group;
}
Boat::Boat()
: PixmapItem(QString("boat"), GraphicsScene::Big),
speed(0), bombsAlreadyLaunched(0), direction(Boat::None)
{
setZValue(4);
setFlags(QGraphicsItem::ItemIsFocusable);
//The movement animation used to animate the boat
movementAnimation = new QPropertyAnimation(this, "pos");
//The destroy animation used to explode the boat
destroyAnimation = setupDestroyAnimation(this);
//We setup the state machine of the boat
machine = new QStateMachine(this);
QState *moving = new QState(machine);
StopState *stopState = new StopState(this, moving);
machine->setInitialState(moving);
moving->setInitialState(stopState);
MoveStateRight *moveStateRight = new MoveStateRight(this, moving);
MoveStateLeft *moveStateLeft = new MoveStateLeft(this, moving);
LaunchStateRight *launchStateRight = new LaunchStateRight(this, machine);
LaunchStateLeft *launchStateLeft = new LaunchStateLeft(this, machine);
//then setup the transitions for the rightMove state
KeyStopTransition *leftStopRight = new KeyStopTransition(this, QEvent::KeyPress, Qt::Key_Left);
leftStopRight->setTargetState(stopState);
KeyMoveTransition *leftMoveRight = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Left);
leftMoveRight->setTargetState(moveStateRight);
KeyMoveTransition *rightMoveRight = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right);
rightMoveRight->setTargetState(moveStateRight);
KeyMoveTransition *rightMoveStop = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right);
rightMoveStop->setTargetState(moveStateRight);
//then setup the transitions for the leftMove state
KeyStopTransition *rightStopLeft = new KeyStopTransition(this, QEvent::KeyPress, Qt::Key_Right);
rightStopLeft->setTargetState(stopState);
KeyMoveTransition *rightMoveLeft = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right);
rightMoveLeft->setTargetState(moveStateLeft);
KeyMoveTransition *leftMoveLeft = new KeyMoveTransition(this, QEvent::KeyPress,Qt::Key_Left);
leftMoveLeft->setTargetState(moveStateLeft);
KeyMoveTransition *leftMoveStop = new KeyMoveTransition(this, QEvent::KeyPress,Qt::Key_Left);
leftMoveStop->setTargetState(moveStateLeft);
//We set up the right move state
moveStateRight->addTransition(leftStopRight);
moveStateRight->addTransition(leftMoveRight);
moveStateRight->addTransition(rightMoveRight);
stopState->addTransition(rightMoveStop);
//We set up the left move state
moveStateLeft->addTransition(rightStopLeft);
moveStateLeft->addTransition(leftMoveLeft);
moveStateLeft->addTransition(rightMoveLeft);
stopState->addTransition(leftMoveStop);
//The animation is finished, it means we reached the border of the screen, the boat is stopped so we move to the stop state
moveStateLeft->addTransition(movementAnimation, &QAbstractAnimation::finished, stopState);
moveStateRight->addTransition(movementAnimation, &QAbstractAnimation::finished, stopState);
//We set up the keys for dropping bombs
KeyLaunchTransition *upFireLeft = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up);
upFireLeft->setTargetState(launchStateRight);
KeyLaunchTransition *upFireRight = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up);
upFireRight->setTargetState(launchStateRight);
KeyLaunchTransition *upFireStop = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up);
upFireStop->setTargetState(launchStateRight);
KeyLaunchTransition *downFireLeft = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down);
downFireLeft->setTargetState(launchStateLeft);
KeyLaunchTransition *downFireRight = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down);
downFireRight->setTargetState(launchStateLeft);
KeyLaunchTransition *downFireMove = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down);
downFireMove->setTargetState(launchStateLeft);
//We set up transitions for fire up
moveStateRight->addTransition(upFireRight);
moveStateLeft->addTransition(upFireLeft);
stopState->addTransition(upFireStop);
//We set up transitions for fire down
moveStateRight->addTransition(downFireRight);
moveStateLeft->addTransition(downFireLeft);
stopState->addTransition(downFireMove);
//Finally the launch state should come back to its original state
QHistoryState *historyState = new QHistoryState(moving);
launchStateLeft->addTransition(historyState);
launchStateRight->addTransition(historyState);
QFinalState *finalState = new QFinalState(machine);
//This state play the destroyed animation
QAnimationState *destroyedState = new QAnimationState(machine);
destroyedState->setAnimation(destroyAnimation);
//Play a nice animation when the boat is destroyed
moving->addTransition(this, &Boat::boatDestroyed, destroyedState);
//Transition to final state when the destroyed animation is finished
destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, finalState);
//The machine has finished to be executed, then the boat is dead
connect(machine, &QState::finished, this, &Boat::boatExecutionFinished);
}
void Boat::run()
{
//We register animations
AnimationManager::self()->registerAnimation(movementAnimation);
AnimationManager::self()->registerAnimation(destroyAnimation);
machine->start();
}
void Boat::stop()
{
movementAnimation->stop();
machine->stop();
}
void Boat::updateBoatMovement()
{
if (speed == 0 || direction == Boat::None) {
movementAnimation->stop();
return;
}
movementAnimation->stop();
if (direction == Boat::Left) {
movementAnimation->setEndValue(QPointF(0,y()));
movementAnimation->setDuration(x()/speed*15);
}
else /*if (direction == Boat::Right)*/ {
movementAnimation->setEndValue(QPointF(scene()->width()-size().width(),y()));
movementAnimation->setDuration((scene()->width()-size().width()-x())/speed*15);
}
movementAnimation->start();
}
void Boat::destroy()
{
movementAnimation->stop();
emit boatDestroyed();
}
int Boat::bombsLaunched() const
{
return bombsAlreadyLaunched;
}
void Boat::setBombsLaunched(int number)
{
if (number > MAX_BOMB) {
qWarning("Boat::setBombsLaunched : It impossible to launch that number of bombs");
return;
}
bombsAlreadyLaunched = number;
}
int Boat::currentSpeed() const
{
return speed;
}
void Boat::setCurrentSpeed(int speed)
{
if (speed > 3 || speed < 0) {
qWarning("Boat::setCurrentSpeed: The boat can't run on that speed");
return;
}
this->speed = speed;
}
enum Boat::Movement Boat::currentDirection() const
{
return direction;
}
void Boat::setCurrentDirection(Movement direction)
{
this->direction = direction;
}
int Boat::type() const
{
return Type;
}

View File

@ -1,103 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef BOAT_H
#define BOAT_H
#include "pixmapitem.h"
QT_BEGIN_NAMESPACE
class QVariantAnimation;
class QAbstractAnimation;
class QStateMachine;
QT_END_NAMESPACE
class Boat : public PixmapItem
{
Q_OBJECT
public:
enum Movement {
None = 0,
Left,
Right
};
enum { Type = UserType + 2 };
Boat();
void destroy();
void run();
void stop();
int bombsLaunched() const;
void setBombsLaunched(int number);
int currentSpeed() const;
void setCurrentSpeed(int speed);
enum Movement currentDirection() const;
void setCurrentDirection(Movement direction);
void updateBoatMovement();
int type() const override;
signals:
void boatDestroyed();
void boatExecutionFinished();
private:
int speed;
int bombsAlreadyLaunched;
Movement direction;
QVariantAnimation *movementAnimation;
QAbstractAnimation *destroyAnimation;
QStateMachine *machine;
};
#endif // BOAT_H

View File

@ -1,246 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef BOAT_P_H
#define BOAT_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
//Own
#include "bomb.h"
#include "graphicsscene.h"
// Qt
#include <QGraphicsRotation>
#include <QKeyEventTransition>
#include <QState>
static const int MAX_BOMB = 5;
//These transtion test if we have to stop the boat (i.e current speed is 1)
class KeyStopTransition : public QKeyEventTransition
{
public:
KeyStopTransition(Boat *b, QEvent::Type t, int k)
: QKeyEventTransition(b, t, k), boat(b)
{
}
protected:
bool eventTest(QEvent *event) override
{
if (!QKeyEventTransition::eventTest(event))
return false;
return (boat->currentSpeed() == 1);
}
private:
Boat *boat;
};
//These transtion test if we have to move the boat (i.e current speed was 0 or another value)
class KeyMoveTransition : public QKeyEventTransition
{
public:
KeyMoveTransition(Boat *b, QEvent::Type t, int k)
: QKeyEventTransition(b, t, k), boat(b), key(k)
{
}
protected:
bool eventTest(QEvent *event) override
{
if (!QKeyEventTransition::eventTest(event))
return false;
return (boat->currentSpeed() >= 0);
}
void onTransition(QEvent *) override
{
//We decrease the speed if needed
if (key == Qt::Key_Left && boat->currentDirection() == Boat::Right)
boat->setCurrentSpeed(boat->currentSpeed() - 1);
else if (key == Qt::Key_Right && boat->currentDirection() == Boat::Left)
boat->setCurrentSpeed(boat->currentSpeed() - 1);
else if (boat->currentSpeed() < 3)
boat->setCurrentSpeed(boat->currentSpeed() + 1);
boat->updateBoatMovement();
}
private:
Boat *boat;
int key;
};
//This transition trigger the bombs launch
class KeyLaunchTransition : public QKeyEventTransition
{
public:
KeyLaunchTransition(Boat *boat, QEvent::Type type, int key)
: QKeyEventTransition(boat, type, key), boat(boat)
{
}
protected:
bool eventTest(QEvent *event) override
{
if (!QKeyEventTransition::eventTest(event))
return false;
//We have enough bomb?
return (boat->bombsLaunched() < MAX_BOMB);
}
private:
Boat *boat;
};
//This state is describing when the boat is moving right
class MoveStateRight : public QState
{
public:
explicit MoveStateRight(Boat *boat, QState *parent = nullptr)
: QState(parent), boat(boat)
{
}
protected:
void onEntry(QEvent *) override
{
boat->setCurrentDirection(Boat::Right);
boat->updateBoatMovement();
}
private:
Boat *boat;
};
//This state is describing when the boat is moving left
class MoveStateLeft : public QState
{
public:
explicit MoveStateLeft(Boat *boat, QState *parent = nullptr)
: QState(parent), boat(boat)
{
}
protected:
void onEntry(QEvent *) override
{
boat->setCurrentDirection(Boat::Left);
boat->updateBoatMovement();
}
private:
Boat *boat;
};
//This state is describing when the boat is in a stand by position
class StopState : public QState
{
public:
explicit StopState(Boat *boat, QState *parent = nullptr)
: QState(parent), boat(boat)
{
}
protected:
void onEntry(QEvent *) override
{
boat->setCurrentSpeed(0);
boat->setCurrentDirection(Boat::None);
boat->updateBoatMovement();
}
private:
Boat *boat;
};
//This state is describing the launch of the torpedo on the right
class LaunchStateRight : public QState
{
public:
explicit LaunchStateRight(Boat *boat, QState *parent = nullptr)
: QState(parent), boat(boat)
{
}
protected:
void onEntry(QEvent *) override
{
Bomb *b = new Bomb;
b->setPos(boat->x()+boat->size().width(),boat->y());
GraphicsScene *scene = static_cast<GraphicsScene *>(boat->scene());
scene->addItem(b);
b->launch(Bomb::Right);
boat->setBombsLaunched(boat->bombsLaunched() + 1);
}
private:
Boat *boat;
};
//This state is describing the launch of the torpedo on the left
class LaunchStateLeft : public QState
{
public:
explicit LaunchStateLeft(Boat *boat, QState *parent = nullptr)
: QState(parent), boat(boat)
{
}
protected:
void onEntry(QEvent *) override
{
Bomb *b = new Bomb;
b->setPos(boat->x() - b->size().width(), boat->y());
GraphicsScene *scene = static_cast<GraphicsScene *>(boat->scene());
scene->addItem(b);
b->launch(Bomb::Left);
boat->setBombsLaunched(boat->bombsLaunched() + 1);
}
private:
Boat *boat;
};
#endif // BOAT_P_H

View File

@ -1,128 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
//Own
#include "bomb.h"
#include "submarine.h"
#include "animationmanager.h"
#include "qanimationstate.h"
//Qt
#include <QFinalState>
#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>
#include <QStateMachine>
Bomb::Bomb() : PixmapItem(QString("bomb"), GraphicsScene::Big)
{
setZValue(2);
}
void Bomb::launch(Bomb::Direction direction)
{
QSequentialAnimationGroup *launchAnimation = new QSequentialAnimationGroup;
AnimationManager::self()->registerAnimation(launchAnimation);
qreal delta = direction == Right ? 20 : - 20;
QPropertyAnimation *anim = new QPropertyAnimation(this, "pos");
anim->setEndValue(QPointF(x() + delta,y() - 20));
anim->setDuration(150);
launchAnimation->addAnimation(anim);
anim = new QPropertyAnimation(this, "pos");
anim->setEndValue(QPointF(x() + delta*2, y() ));
anim->setDuration(150);
launchAnimation->addAnimation(anim);
anim = new QPropertyAnimation(this, "pos");
anim->setEndValue(QPointF(x() + delta*2,scene()->height()));
anim->setDuration(y()/2*60);
launchAnimation->addAnimation(anim);
connect(anim, &QVariantAnimation::valueChanged, this, &Bomb::onAnimationLaunchValueChanged);
connect(this, &Bomb::bombExploded, launchAnimation, &QAbstractAnimation::stop);
//We setup the state machine of the bomb
QStateMachine *machine = new QStateMachine(this);
//This state is when the launch animation is playing
QAnimationState *launched = new QAnimationState(machine);
launched->setAnimation(launchAnimation);
//End
QFinalState *finalState = new QFinalState(machine);
machine->setInitialState(launched);
//### Add a nice animation when the bomb is destroyed
launched->addTransition(this, &Bomb::bombExploded, finalState);
//If the animation is finished, then we move to the final state
launched->addTransition(launched, &QAnimationState::animationFinished, finalState);
//The machine has finished to be executed, then the boat is dead
connect(machine,&QState::finished, this, &Bomb::bombExecutionFinished);
machine->start();
}
void Bomb::onAnimationLaunchValueChanged(const QVariant &)
{
const QList<QGraphicsItem *> colItems =
collidingItems(Qt::IntersectsItemBoundingRect);
for (QGraphicsItem *item : colItems) {
if (item->type() == SubMarine::Type) {
SubMarine *s = static_cast<SubMarine *>(item);
destroy();
s->destroy();
}
}
}
void Bomb::destroy()
{
emit bombExploded();
}

View File

@ -1,76 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef BOMB_H
#define BOMB_H
#include "pixmapitem.h"
class Bomb : public PixmapItem
{
Q_OBJECT
public:
enum Direction {
Left = 0,
Right
};
Bomb();
void launch(Direction direction);
void destroy();
signals:
void bombExploded();
void bombExecutionFinished();
private slots:
void onAnimationLaunchValueChanged(const QVariant &);
};
#endif // BOMB_H

View File

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subattaq>
<submarines>
<submarine type="0" points="10" name="Q1" />
<submarine type="1" points="20" name="Q2" />
</submarines>
<levels>
<level id="0" name="Seaman recruit">
<subinstance type="0" nb="1"/>
</level>
<level id="1" name="Seaman apprentice">
<subinstance type="0" nb="2"/>
</level>
<level id="2" name="Seaman">
<subinstance type="0" nb="4"/>
</level>
<level id="3" name="Petty Officer Third Class">
<subinstance type="0" nb="6"/>
</level>
<level id="4" name="Petty Officer Second Class">
<subinstance type="0" nb="6"/>
</level>
<level id="5" name="Petty Officer First Class">
<subinstance type="0" nb="8"/>
</level>
<level id="6" name="Lieutenant">
<subinstance type="0" nb="10"/>
</level>
<level id="7" name="Commander">
<subinstance type="0" nb="15"/>
</level>
<level id="8" name="Captain">
<subinstance type="0" nb="12"/>
</level>
<level id="9" name="Admiral">
<subinstance type="0" nb="12"/>
</level>
</levels>
</subattaq>

View File

@ -1,301 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
//Own
#include "graphicsscene.h"
#include "states.h"
#include "boat.h"
#include "submarine.h"
#include "torpedo.h"
#include "bomb.h"
#include "animationmanager.h"
#include "qanimationstate.h"
#include "progressitem.h"
#include "textinformationitem.h"
//Qt
#include <QAction>
#include <QApplication>
#include <QFile>
#include <QFinalState>
#include <QParallelAnimationGroup>
#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>
#include <QStateMachine>
#include <QXmlStreamReader>
GraphicsScene::GraphicsScene(int x, int y, int width, int height, Mode mode, QObject *parent)
: QGraphicsScene(x, y, width, height, parent), mode(mode), boat(new Boat)
{
PixmapItem *backgroundItem = new PixmapItem(QStringLiteral("background"), mode);
backgroundItem->setZValue(1);
backgroundItem->setPos(0,0);
addItem(backgroundItem);
PixmapItem *surfaceItem = new PixmapItem(QStringLiteral("surface"), mode);
surfaceItem->setZValue(3);
surfaceItem->setPos(0, sealLevel() - surfaceItem->boundingRect().height() / 2);
addItem(surfaceItem);
//The item that display score and level
progressItem = new ProgressItem(backgroundItem);
textInformationItem = new TextInformationItem(backgroundItem);
textInformationItem->hide();
//We create the boat
addItem(boat);
boat->setPos(this->width()/2, sealLevel() - boat->size().height());
boat->hide();
//parse the xml that contain all data of the game
QXmlStreamReader reader;
QFile file(":data.xml");
file.open(QIODevice::ReadOnly);
reader.setDevice(&file);
LevelDescription currentLevel;
while (!reader.atEnd()) {
reader.readNext();
if (reader.tokenType() == QXmlStreamReader::StartElement) {
if (reader.name() == u"submarine") {
SubmarineDescription desc;
desc.name = reader.attributes().value("name").toString();
desc.points = reader.attributes().value("points").toInt();
desc.type = reader.attributes().value("type").toInt();
submarinesData.append(desc);
} else if (reader.name() == u"level") {
currentLevel.id = reader.attributes().value("id").toInt();
currentLevel.name = reader.attributes().value("name").toString();
} else if (reader.name() == u"subinstance") {
currentLevel.submarines.append(qMakePair(reader.attributes().value("type").toInt(),
reader.attributes().value("nb").toInt()));
}
} else if (reader.tokenType() == QXmlStreamReader::EndElement) {
if (reader.name() == u"level") {
levelsData.insert(currentLevel.id, currentLevel);
currentLevel.submarines.clear();
}
}
}
}
qreal GraphicsScene::sealLevel() const
{
return (mode == Big) ? 220 : 160;
}
void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
{
static constexpr int nLetters = 10;
static constexpr struct {
char const *pix;
qreal initX, initY;
qreal destX, destY;
} logoData[nLetters] = {
{"s", -1000, -1000, 300, 150 },
{"u", -800, -1000, 350, 150 },
{"b", -600, -1000, 400, 120 },
{"dash", -400, -1000, 460, 150 },
{"a", 1000, 2000, 350, 250 },
{"t", 800, 2000, 400, 250 },
{"t2", 600, 2000, 430, 250 },
{"a2", 400, 2000, 465, 250 },
{"q", 200, 2000, 510, 250 },
{"excl", 0, 2000, 570, 220 } };
QSequentialAnimationGroup *lettersGroupMoving = new QSequentialAnimationGroup(this);
QParallelAnimationGroup *lettersGroupFading = new QParallelAnimationGroup(this);
for (int i = 0; i < nLetters; ++i) {
PixmapItem *logo = new PixmapItem(QLatin1String(":/logo-") + logoData[i].pix, this);
logo->setPos(logoData[i].initX, logoData[i].initY);
logo->setZValue(i + 3);
//creation of the animations for moving letters
QPropertyAnimation *moveAnim = new QPropertyAnimation(logo, "pos", lettersGroupMoving);
moveAnim->setEndValue(QPointF(logoData[i].destX, logoData[i].destY));
moveAnim->setDuration(200);
moveAnim->setEasingCurve(QEasingCurve::OutElastic);
lettersGroupMoving->addPause(50);
//creation of the animations for fading out the letters
QPropertyAnimation *fadeAnim = new QPropertyAnimation(logo, "opacity", lettersGroupFading);
fadeAnim->setDuration(800);
fadeAnim->setEndValue(0);
fadeAnim->setEasingCurve(QEasingCurve::OutQuad);
}
QStateMachine *machine = new QStateMachine(this);
//This state is when the player is playing
PlayState *gameState = new PlayState(this, machine);
//Final state
QFinalState *finalState = new QFinalState(machine);
//Animation when the player enter in the game
QAnimationState *lettersMovingState = new QAnimationState(machine);
lettersMovingState->setAnimation(lettersGroupMoving);
//Animation when the welcome screen disappear
QAnimationState *lettersFadingState = new QAnimationState(machine);
lettersFadingState->setAnimation(lettersGroupFading);
//if new game then we fade out the welcome screen and start playing
lettersMovingState->addTransition(newAction, &QAction::triggered, lettersFadingState);
lettersFadingState->addTransition(lettersFadingState, &QAnimationState::animationFinished, gameState);
//New Game is triggered then player start playing
gameState->addTransition(newAction, &QAction::triggered, gameState);
//Wanna quit, then connect to CTRL+Q
gameState->addTransition(quitAction, &QAction::triggered, finalState);
lettersMovingState->addTransition(quitAction, &QAction::triggered, finalState);
//Welcome screen is the initial state
machine->setInitialState(lettersMovingState);
machine->start();
//We reach the final state, then we quit
connect(machine, &QStateMachine::finished, qApp, &QApplication::quit);
}
void GraphicsScene::addItem(Bomb *bomb)
{
bombs.insert(bomb);
connect(bomb, &Bomb::bombExecutionFinished,
this, &GraphicsScene::onBombExecutionFinished);
QGraphicsScene::addItem(bomb);
}
void GraphicsScene::addItem(Torpedo *torpedo)
{
torpedos.insert(torpedo);
connect(torpedo, &Torpedo::torpedoExecutionFinished,
this, &GraphicsScene::onTorpedoExecutionFinished);
QGraphicsScene::addItem(torpedo);
}
void GraphicsScene::addItem(SubMarine *submarine)
{
submarines.insert(submarine);
connect(submarine, &SubMarine::subMarineExecutionFinished,
this, &GraphicsScene::onSubMarineExecutionFinished);
QGraphicsScene::addItem(submarine);
}
void GraphicsScene::addItem(QGraphicsItem *item)
{
QGraphicsScene::addItem(item);
}
void GraphicsScene::onBombExecutionFinished()
{
Bomb *bomb = qobject_cast<Bomb *>(sender());
if (!bomb)
return;
bombs.remove(bomb);
bomb->deleteLater();
boat->setBombsLaunched(boat->bombsLaunched() - 1);
}
void GraphicsScene::onTorpedoExecutionFinished()
{
Torpedo *torpedo = qobject_cast<Torpedo *>(sender());
if (!torpedo)
return;
torpedos.remove(torpedo);
torpedo->deleteLater();
}
void GraphicsScene::onSubMarineExecutionFinished()
{
SubMarine *submarine = qobject_cast<SubMarine *>(sender());
if (!submarine)
return;
submarines.remove(submarine);
if (submarines.count() == 0)
emit allSubMarineDestroyed(submarine->points());
else
emit subMarineDestroyed(submarine->points());
submarine->deleteLater();
}
void GraphicsScene::clearScene()
{
for (SubMarine *sub : qAsConst(submarines)) {
// make sure to not go into onSubMarineExecutionFinished
sub->disconnect(this);
sub->destroy();
sub->deleteLater();
}
for (Torpedo *torpedo : qAsConst(torpedos)) {
// make sure to not go into onTorpedoExecutionFinished
torpedo->disconnect(this);
torpedo->destroy();
torpedo->deleteLater();
}
for (Bomb *bomb : qAsConst(bombs)) {
// make sure to not go into onBombExecutionFinished
bomb->disconnect(this);
bomb->destroy();
bomb->deleteLater();
}
submarines.clear();
bombs.clear();
torpedos.clear();
AnimationManager::self()->unregisterAllAnimations();
boat->stop();
boat->hide();
boat->setEnabled(true);
}

View File

@ -1,130 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H
//Qt
#include <QGraphicsScene>
#include <QSet>
class Boat;
class SubMarine;
class Torpedo;
class Bomb;
class PixmapItem;
class ProgressItem;
class TextInformationItem;
QT_BEGIN_NAMESPACE
class QAction;
QT_END_NAMESPACE
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
enum Mode {
Big = 0,
Small
};
struct SubmarineDescription {
int type = 0;
int points = 0;
QString name;
};
struct LevelDescription {
int id = 0;
QString name;
QList<QPair<int, int>> submarines;
};
GraphicsScene(int x, int y, int width, int height, Mode mode, QObject *parent = nullptr);
qreal sealLevel() const;
void setupScene(QAction *newAction, QAction *quitAction);
void addItem(Bomb *bomb);
void addItem(Torpedo *torpedo);
void addItem(SubMarine *submarine);
void addItem(QGraphicsItem *item);
void clearScene();
signals:
void subMarineDestroyed(int);
void allSubMarineDestroyed(int);
private slots:
void onBombExecutionFinished();
void onTorpedoExecutionFinished();
void onSubMarineExecutionFinished();
private:
Mode mode;
ProgressItem *progressItem;
TextInformationItem *textInformationItem;
Boat *boat;
QSet<SubMarine *> submarines;
QSet<Bomb *> bombs;
QSet<Torpedo *> torpedos;
QList<SubmarineDescription> submarinesData;
QHash<int, LevelDescription> levelsData;
friend class PauseState;
friend class PlayState;
friend class LevelState;
friend class LostState;
friend class WinState;
friend class WinTransition;
friend class UpdateScoreTransition;
};
#endif // GRAPHICSSCENE_H

View File

@ -1,64 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtWidgets>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Q_INIT_RESOURCE(subattaq);
MainWindow w;
w.show();
return app.exec();
}

View File

@ -1,84 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
//Own
#include "mainwindow.h"
#include "graphicsscene.h"
//Qt
#include <QGraphicsView>
#include <QApplication>
#include <QMenu>
#include <QMenuBar>
#include <QLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QMenu *file = menuBar()->addMenu(tr("&File"));
QAction *newAction = file->addAction(tr("New Game"));
newAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
QAction *quitAction = file->addAction(tr("Quit"));
quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
if (QApplication::arguments().contains("-fullscreen")) {
scene = new GraphicsScene(0, 0, 750, 400, GraphicsScene::Small, this);
setWindowState(Qt::WindowFullScreen);
} else {
scene = new GraphicsScene(0, 0, 880, 630, GraphicsScene::Big, this);
layout()->setSizeConstraint(QLayout::SetFixedSize);
}
view = new QGraphicsView(scene, this);
view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
scene->setupScene(newAction, quitAction);
setCentralWidget(view);
}

View File

@ -1,72 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
//Qt
#include <QMainWindow>
class GraphicsScene;
QT_BEGIN_NAMESPACE
class QGraphicsView;
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
private:
GraphicsScene *scene;
QGraphicsView *view;
};
#endif // MAINWINDOW_H

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 760 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 951 B

View File

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2588"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="background-n810.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<metadata
id="metadata28">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:window-height="1141"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
showgrid="false"
inkscape:zoom="1.2399902"
inkscape:cx="375"
inkscape:cy="461.074"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:current-layer="layer1" />
<defs
id="defs2590">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective30" />
<linearGradient
id="linearGradient3746">
<stop
id="stop3748"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3750"
style="stop-color:#0074b7;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="82.966125"
cy="-178.42453"
r="526.79456"
fx="82.966125"
fy="-178.42453"
id="radialGradient3880"
xlink:href="#linearGradient3746"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4952094,0.2388475,-0.1040669,0.3734391,-208.61982,418.216)" />
<linearGradient
id="linearGradient3624">
<stop
id="stop3626"
style="stop-color:#3a8daf;stop-opacity:1"
offset="0" />
<stop
id="stop3636"
style="stop-color:#252525;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="552.98486"
y1="390.56842"
x2="549.39465"
y2="702.3479"
id="linearGradient3630"
xlink:href="#linearGradient3624"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.3373776,0,0,1.186038,-986.88716,67.776416)" />
<linearGradient
id="linearGradient3816">
<stop
id="stop3818"
style="stop-color:#ad8b00;stop-opacity:1"
offset="0" />
<stop
id="stop3820"
style="stop-color:#ad8b00;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="573"
y1="755.46222"
x2="573"
y2="700.13464"
id="linearGradient3826"
xlink:href="#linearGradient3816"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.2561681,-151.5,-34.518664)" />
<linearGradient
id="linearGradient5097">
<stop
id="stop5099"
style="stop-color:#19a2db;stop-opacity:0"
offset="0" />
<stop
id="stop5109"
style="stop-color:#1379a7;stop-opacity:0.49803922"
offset="0.30000001" />
<stop
id="stop5101"
style="stop-color:#0e5173;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="590.84674"
y1="274.57559"
x2="590.84674"
y2="334.01376"
id="linearGradient5103"
xlink:href="#linearGradient5097"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-151.5,156.75229)"
spreadMethod="pad" />
</defs>
<g
id="layer1">
<rect
width="1053.5891"
height="206.64989"
x="-151.79456"
y="330.16019"
id="rect3638"
style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="1054.4708"
height="364.81519"
x="-152.23541"
y="533.48895"
id="rect3622"
style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -152.5,877.11847 C 120.5,865.81296 -202.86309,769.3663 109.5,871.29717 C 172.96247,892.00636 243.5,872.55334 297.5,871.29717 C 351.5,870.041 311.5,859.80335 358.5,876.13354 C 405.5,892.46372 553.5,861.09903 598.5,854.8182 C 643.5,848.53736 756.5,841.79698 795.5,853.10249 C 834.5,864.408 904.5,866.2725 904.5,866.2725 L 901.5,903.95754 L -154.5,902.70137 L -152.5,877.11847 z"
id="path3814"
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 902.20121,894.16261 C 632.01828,889.43035 756.73005,860.2801 614.20403,894.1311 C 596.58819,898.315 408.23621,883.21212 400.43291,894.1311 C 376.86263,927.11261 75.265447,868.1243 34.250926,886.79082 C 31.281885,888.14209 12.514878,884.22134 -12.264082,889.72008 C -48.555335,897.77353 -64.717178,885.62471 -103.31472,890.35697 C -141.91229,895.08922 -145.87102,891.93439 -145.87102,891.93439 L -152.79879,903.10131 L 892.3044,902.5755 L 902.20121,894.16261 z"
id="path3828"
style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2588"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="background.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<metadata
id="metadata28">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:window-height="1141"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
showgrid="false"
inkscape:zoom="0.93884027"
inkscape:cx="473.72605"
inkscape:cy="538.63678"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:current-layer="layer1" />
<defs
id="defs2590">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective30" />
<linearGradient
id="linearGradient3746">
<stop
id="stop3748"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3750"
style="stop-color:#0074b7;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="82.966125"
cy="-178.42453"
r="526.79456"
fx="82.966125"
fy="-178.42453"
id="radialGradient3880"
xlink:href="#linearGradient3746"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4952094,0.3367191,-0.1040669,0.5264617,-208.61982,282.52272)" />
<linearGradient
id="linearGradient3624">
<stop
id="stop3626"
style="stop-color:#3a8daf;stop-opacity:1"
offset="0" />
<stop
id="stop3636"
style="stop-color:#252525;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="552.98486"
y1="390.56842"
x2="549.39465"
y2="702.3479"
id="linearGradient3630"
xlink:href="#linearGradient3624"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.3373776,0,0,1.5004634,-986.88716,-154.07447)" />
<linearGradient
id="linearGradient3816">
<stop
id="stop3818"
style="stop-color:#ad8b00;stop-opacity:1"
offset="0" />
<stop
id="stop3820"
style="stop-color:#ad8b00;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="573"
y1="755.46222"
x2="573"
y2="700.13464"
id="linearGradient3826"
xlink:href="#linearGradient3816"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.6033628,-151.5,-294.0167)" />
<linearGradient
id="linearGradient5097">
<stop
id="stop5099"
style="stop-color:#19a2db;stop-opacity:0"
offset="0" />
<stop
id="stop5109"
style="stop-color:#1379a7;stop-opacity:0.49803922"
offset="0.30000001" />
<stop
id="stop5101"
style="stop-color:#0e5173;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="590.84674"
y1="274.57559"
x2="590.84674"
y2="334.01376"
id="linearGradient5103"
xlink:href="#linearGradient5097"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-151.5,156.75229)"
spreadMethod="pad" />
</defs>
<g
id="layer1">
<rect
width="1053.5891"
height="291.32797"
x="-151.79456"
y="158.38464"
id="rect3638"
style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="1054.4708"
height="461.52972"
x="-152.23541"
y="435.10107"
id="rect3622"
style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -152.5,869.5896 C 120.5,855.15934 -202.86309,732.0556 109.5,862.15934 C 172.96247,888.59238 243.5,863.7627 297.5,862.15934 C 351.5,860.55598 311.5,847.48872 358.5,868.33244 C 405.5,889.17615 553.5,849.14252 598.5,841.12571 C 643.5,833.1089 756.5,824.50553 795.5,838.9358 C 834.5,853.36606 904.5,855.74589 904.5,855.74589 L 901.5,903.84677 L -154.5,902.24341 L -152.5,869.5896 z"
id="path3814"
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 902.20121,891.3446 C 632.01828,885.30439 756.73005,848.09724 614.20403,891.30439 C 596.58819,896.64468 408.23621,877.36748 400.43291,891.30439 C 376.86263,933.40172 75.265447,858.10952 34.250926,881.93531 C 31.281885,883.66006 12.514878,878.65564 -12.264082,885.67419 C -48.555335,895.95355 -64.717178,880.4469 -103.31472,886.48711 C -141.91229,892.52732 -145.87102,888.50052 -145.87102,888.50052 L -152.79879,902.75389 L 892.3044,902.08275 L 902.20121,891.3446 z"
id="path3828"
style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -1,279 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2584">
<defs
id="defs2666">
<linearGradient
x1="542.5"
y1="222.59448"
x2="559"
y2="222.59448"
id="linearGradient3387"
xlink:href="#linearGradient3746"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.6791,190.19124)" />
<linearGradient
id="linearGradient3167">
<stop
id="stop3169"
style="stop-color:#464646;stop-opacity:1"
offset="0" />
<stop
id="stop3345"
style="stop-color:#848788;stop-opacity:1"
offset="0.44021741" />
<stop
id="stop3347"
style="stop-color:#9ca0a2;stop-opacity:1"
offset="0.56799388" />
<stop
id="stop3171"
style="stop-color:#b5babd;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="474.23065"
y1="229.92336"
x2="474.1944"
y2="218.27365"
id="linearGradient3416"
xlink:href="#linearGradient3167"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-125.98032,185.95625)" />
<linearGradient
id="linearGradient3692">
<stop
id="stop3694"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3696"
style="stop-color:#b6b6b6;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="573.5"
y1="244.2056"
x2="578.25"
y2="216.9556"
id="linearGradient3972"
xlink:href="#linearGradient3692"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-126.5541,188.56624)" />
<linearGradient
id="linearGradient3438">
<stop
id="stop3440"
style="stop-color:#939393;stop-opacity:1"
offset="0" />
<stop
id="stop3444"
style="stop-color:#d6d6d6;stop-opacity:1"
offset="0.12354442" />
<stop
id="stop3446"
style="stop-color:#dadada;stop-opacity:1"
offset="0.74055624" />
<stop
id="stop3442"
style="stop-color:#ffffff;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="660.29303"
y1="256.53284"
x2="444.79303"
y2="255.62085"
id="linearGradient3948"
xlink:href="#linearGradient3438"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-126.5541,185.56624)" />
<linearGradient
x1="542.5"
y1="222.59448"
x2="559"
y2="222.59448"
id="linearGradient3990"
xlink:href="#linearGradient3746"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-132.8041,190.19124)" />
<linearGradient
id="linearGradient3746">
<stop
id="stop3748"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3750"
style="stop-color:#0074b7;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="542.5"
y1="222.59448"
x2="559"
y2="222.59448"
id="linearGradient3994"
xlink:href="#linearGradient3746"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-88.054101,190.19124)" />
<linearGradient
id="linearGradient3428">
<stop
id="stop3430"
style="stop-color:#464646;stop-opacity:1"
offset="0" />
<stop
id="stop3432"
style="stop-color:#848788;stop-opacity:1"
offset="0.18306103" />
<stop
id="stop3434"
style="stop-color:#9ca0a2;stop-opacity:1"
offset="0.66368055" />
<stop
id="stop3436"
style="stop-color:#b5babd;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="592.92798"
y1="199.43727"
x2="557.05743"
y2="196.5448"
id="linearGradient3426"
xlink:href="#linearGradient3428"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-102.5217,149.09845)" />
</defs>
<g
id="layer1">
<g
id="boat">
<path
d="M 296.669,434.15623 C 376.12538,436.50959 448.282,436.46711 542.42304,434.15623 C 542.42304,434.15623 544.22253,425.03531 542.42304,422.57953 C 432.90655,403.86953 296.669,418.12547 296.669,422.57953 L 296.669,434.15623 z"
id="path3469"
style="fill:#a9a9a9;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3.4975698;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
<rect
width="3.4280596"
height="29.611124"
x="647.59613"
y="173.91156"
transform="matrix(0.9327494,0.3605254,-0.3633626,0.9316478,0,0)"
id="rect3408"
style="opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="48.499989"
height="8.5"
x="318.48221"
y="405.82172"
transform="matrix(0.9999952,3.0887777e-3,-3.0887777e-3,0.9999952,0,0)"
id="rect3376"
style="opacity:1;fill:url(#linearGradient3416);fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 382.4459,430.66072 C 382.4459,430.66072 420.85999,388.74829 397.4459,385.66072 L 488.4459,397.66072 L 488.4459,432.66072 L 382.4459,430.66072 z"
id="path3952"
style="fill:url(#linearGradient3972);fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 301.4459,429.66072 C 301.4459,429.66072 330.46329,468.66072 343.4459,468.66072 C 355.42851,471.91072 507.57644,473.70653 525.4459,465.91072 C 534.58031,461.59104 537.90602,455.58662 539.4459,429.66072 C 473.70193,439.43306 371.2651,439.78219 301.4459,429.66072 z"
id="path3938"
style="fill:url(#linearGradient3948);fill-opacity:1;fill-rule:evenodd;stroke:#545454;stroke-width:3.0999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 339.44863,416.12222 L 357.69854,416.17859 L 368.1622,427.96097 L 339.41234,427.87217 L 339.44863,416.12222 z"
id="rect3378"
style="fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
<rect
width="13.5"
height="17"
x="411.19589"
y="404.28574"
id="rect3974"
style="opacity:1;fill:url(#linearGradient3990);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="13.5"
height="17"
x="455.94589"
y="404.28574"
id="rect3992"
style="opacity:1;fill:url(#linearGradient3994);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 295.6959,421.91072 C 360.77923,430.41072 446.61257,432.91072 541.9459,421.91072 C 541.9459,421.91072 543.74902,428.6076 541.9459,430.41072 C 432.20839,444.14823 295.6959,433.68104 295.6959,430.41072 L 295.6959,421.91072 z"
id="rect2558"
style="fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
<rect
width="94.427879"
height="7.236649"
x="437.10614"
y="342.2645"
transform="matrix(0.9947793,0.1020501,-0.1079723,0.9941539,0,0)"
id="rect2569"
style="opacity:1;fill:#c1c1c1;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:3.0365274;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="13.5"
height="17"
x="433.32089"
y="404.28574"
id="rect3385"
style="opacity:1;fill:url(#linearGradient3387);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 402.86916,380.21847 L 489.80407,388.85485 L 491.52271,394.54919 L 397.58781,384.91281 L 402.86916,380.21847 z"
id="rect3466"
style="fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:3.03650045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
<rect
width="34.5"
height="14.5"
x="456.4783"
y="336.94293"
transform="matrix(0.997157,7.5351915e-2,-7.5351915e-2,0.997157,0,0)"
id="rect3418"
style="opacity:1;fill:url(#linearGradient3426);fill-opacity:1;fill-rule:nonzero;stroke:#494949;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
transform="matrix(0.9246214,0.3808874,-0.3808874,0.9246214,-13.252851,-40.129692)"
id="flag">
<rect
width="19.75"
height="27.75"
x="193.34448"
y="-709"
transform="matrix(0,1,-1,0,0,0)"
id="rect3389"
style="opacity:1;fill:#b20000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="27.25"
height="5.75"
x="681.5"
y="200.59448"
id="rect3393"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="5.75"
height="19.5"
x="691.25"
y="193.59448"
id="rect3395"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="27.75"
height="2.5"
x="681.5"
y="202.34448"
id="rect3397"
style="opacity:1;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
width="3"
height="19.25"
x="692.5"
y="193.59448"
id="rect3399"
style="opacity:1;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,138 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg3121">
<defs
id="defs3123">
<radialGradient
cx="-135.625"
cy="148.71948"
r="7.625"
fx="-135.625"
fy="148.71948"
id="radialGradient3439"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="-132.85063"
y1="173.6969"
x2="-145.3662"
y2="177.59828"
id="linearGradient3418"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.2134297,-0.5943658,0.6658882,-0.2391126,-274.53441,123.00067)" />
<linearGradient
x1="-141.85466"
y1="181.49153"
x2="-144.95044"
y2="175.90179"
id="linearGradient3414"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2134297,-0.5943658,-0.6658882,-0.2391126,-15.893355,122.67824)" />
<linearGradient
x1="-149.5"
y1="177.59448"
x2="-145.7928"
y2="180.05936"
id="linearGradient3410"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.6315243,0,0,0.7075182,-227.03781,54.321514)" />
<linearGradient
x1="-140.46242"
y1="177.40488"
x2="-147.04802"
y2="172.66473"
id="linearGradient3406"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.6315243,0,0,-0.7075182,-226.40365,274.91611)" />
<linearGradient
x1="-147.2406"
y1="180.95567"
x2="-140.01878"
y2="175.57777"
id="linearGradient3402"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6315243,0,0,-0.7075182,-64.045217,275.07466)" />
<linearGradient
x1="-146.98956"
y1="174.00922"
x2="-142.60332"
y2="179.38712"
id="linearGradient3398"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6315243,0,0,0.7075182,-62.683611,54.187362)" />
<linearGradient
id="linearGradient3366">
<stop
id="stop3368"
style="stop-color:#bcbcbc;stop-opacity:1"
offset="0" />
<stop
id="stop3370"
style="stop-color:#191b1c;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="-208.95004"
cy="173.10576"
r="31.667252"
fx="-208.95004"
fy="173.10576"
id="radialGradient3364"
xlink:href="#linearGradient3366"
gradientUnits="userSpaceOnUse" />
</defs>
<g
id="layer1">
<g
transform="translate(419.4996,488.13454)"
id="mine">
<path
d="M -167.5843,186.54079 A 31.466251,31.466251 0 1 1 -230.5168,186.54079 A 31.466251,31.466251 0 1 1 -167.5843,186.54079 z"
transform="matrix(0.6341613,0,0,0.6341613,-18.521242,45.718192)"
id="path2586"
style="opacity:1;fill:url(#radialGradient3364);fill-opacity:1;stroke:#131313;stroke-width:3.54799318;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -155.20193,175.4167 C -157.60085,176.6451 -156.78074,184.26068 -156.78074,184.26068 C -156.78074,184.26068 -148.33787,181.58301 -148.57092,178.60053 C -148.74283,176.40051 -153.23774,174.41092 -155.20193,175.4167 z"
id="path3382"
style="fill:url(#linearGradient3398);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -156.56354,153.84532 C -158.96246,152.61693 -158.14235,145.00135 -158.14235,145.00135 C -158.14235,145.00135 -149.69948,147.67902 -149.93253,150.66149 C -150.10444,152.86151 -154.59935,154.85111 -156.56354,153.84532 z"
id="path3400"
style="fill:url(#linearGradient3402);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -133.88532,153.68678 C -131.48641,152.45838 -132.30652,144.8428 -132.30652,144.8428 C -132.30652,144.8428 -140.74938,147.52047 -140.51633,150.50295 C -140.34442,152.70297 -135.84951,154.69256 -133.88532,153.68678 z"
id="path3404"
style="fill:url(#linearGradient3406);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -134.51948,175.55085 C -132.12057,176.77925 -132.94068,184.39483 -132.94068,184.39483 C -132.94068,184.39483 -141.38355,181.71716 -141.15049,178.73469 C -140.97858,176.53467 -136.48367,174.54507 -134.51948,175.55085 z"
id="path3408"
style="fill:url(#linearGradient3410);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -161.25709,168.78221 C -163.22395,170.62484 -170.11427,165.85236 -170.11427,165.85236 C -170.11427,165.85236 -164.7408,160.23808 -162.01257,161.46538 C -160.00011,162.37068 -159.64667,167.27352 -161.25709,168.78221 z"
id="path3412"
style="fill:url(#linearGradient3414);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -129.17068,169.10464 C -127.20382,170.94727 -120.3135,166.17478 -120.3135,166.17478 C -120.3135,166.17478 -125.68697,160.5605 -128.41519,161.7878 C -130.42766,162.69311 -130.7811,167.59595 -129.17068,169.10464 z"
id="path3416"
style="fill:url(#linearGradient3418);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M -126,151.21948 A 6.625,6.625 0 1 1 -139.25,151.21948 A 6.625,6.625 0 1 1 -126,151.21948 z"
transform="matrix(0.6341613,0,0,0.6341613,-61.039517,68.324922)"
id="path3426"
style="opacity:1;fill:url(#radialGradient3439);fill-opacity:1;stroke:#131313;stroke-width:3.54799318;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -1,103 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2596">
<defs
id="defs2598">
<linearGradient
id="linearGradient3708">
<stop
id="stop3710"
style="stop-color:#202020;stop-opacity:1"
offset="0" />
<stop
id="stop3712"
style="stop-color:#ffffff;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="518.26996"
y1="497.31476"
x2="533.02924"
y2="497.31476"
id="linearGradient3794"
xlink:href="#linearGradient3708"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3718">
<stop
id="stop3720"
style="stop-color:#bcbcbc;stop-opacity:0.28169015"
offset="0" />
<stop
id="stop3722"
style="stop-color:#bcbcbc;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="516.89508"
y1="503.50137"
x2="516.89508"
y2="543.80646"
id="linearGradient3792"
xlink:href="#linearGradient3718"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.9947644,0,0,1.3346457,2.7877039,-166.60153)" />
<linearGradient
id="linearGradient3692">
<stop
id="stop3694"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3696"
style="stop-color:#b6b6b6;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="506.95975"
y1="469.73706"
x2="525.41608"
y2="469.73706"
id="linearGradient3790"
xlink:href="#linearGradient3692"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3816">
<stop
id="stop3818"
style="stop-color:#ad8b00;stop-opacity:1"
offset="0" />
<stop
id="stop3820"
style="stop-color:#ad8b00;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="573"
y1="755.46222"
x2="573"
y2="700.13464"
id="linearGradient3826"
xlink:href="#linearGradient3816"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.6033628,-150.63569,-350.3846)" />
</defs>
<g
id="layer1">
<path
d="M -151.63569,813.2217 C 121.3643,798.79144 -201.99878,675.6877 110.3643,805.79144 C 173.82677,832.22448 244.3643,807.3948 298.3643,805.79144 C 352.3643,804.18808 312.3643,791.12082 359.3643,811.96454 C 406.3643,832.80825 554.3643,792.77462 599.3643,784.75781 C 644.3643,776.741 757.36426,768.13763 796.36426,782.5679 C 835.36426,796.99816 905.36426,799.37799 905.36426,799.37799 L 902.36426,847.47887 L -153.63569,845.87551 L -151.63569,813.2217 z"
id="path3814"
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 908.86426,836.95812 C 635.8643,830.91791 761.87636,793.71076 617.8643,836.91791 C 600.0648,842.2582 409.74894,822.981 401.8643,836.91791 C 378.04825,879.01524 73.306465,803.72304 31.864305,827.54883 C 28.864305,829.27358 9.9016246,824.26916 -15.135695,831.28771 C -51.805335,841.56707 -68.135695,826.06042 -107.1357,832.10063 C -146.1357,838.14084 -150.13569,834.11404 -150.13569,834.11404 L -157.13569,848.36741 L 898.86426,847.69627 L 908.86426,836.95812 z"
id="path3828"
style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2650">
<defs
id="defs2652">
<linearGradient
id="linearGradient3624">
<stop
id="stop3626"
style="stop-color:#3a8daf;stop-opacity:1"
offset="0" />
<stop
id="stop3636"
style="stop-color:#252525;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="552.98486"
y1="390.56842"
x2="549.39465"
y2="702.3479"
id="linearGradient3630"
xlink:href="#linearGradient3624"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.3373776,0,0,1.5004634,-996.17287,-279.00679)" />
</defs>
<g
id="layer1">
<rect
width="1054.4708"
height="461.52972"
x="-161.52115"
y="310.16876"
id="rect3622"
style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2721">
<defs
id="defs2723">
<linearGradient
id="linearGradient3746">
<stop
id="stop3748"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3750"
style="stop-color:#0074b7;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="82.966125"
cy="-178.42453"
r="526.79456"
fx="82.966125"
fy="-178.42453"
id="radialGradient3880"
xlink:href="#linearGradient3746"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4952094,0.3367191,-0.1040669,0.5264617,-235.04839,425.12197)" />
</defs>
<g
id="layer1">
<rect
width="1053.5891"
height="291.32797"
x="-178.22313"
y="300.98392"
id="rect3638"
style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 58 KiB

View File

@ -1,214 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2594">
<defs
id="defs2596">
<linearGradient
id="linearGradient3345">
<stop
id="stop3348"
style="stop-color:#898989;stop-opacity:1"
offset="0" />
<stop
id="stop3350"
style="stop-color:#9ea1a2;stop-opacity:1"
offset="0.44021741" />
<stop
id="stop3352"
style="stop-color:#bbbdbf;stop-opacity:1"
offset="0.56799388" />
<stop
id="stop3354"
style="stop-color:#f0f1f2;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="510.99884"
y1="161.99408"
x2="396.48914"
y2="161.99408"
id="linearGradient3311"
xlink:href="#linearGradient3345"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.466978,0,0,0.4500435,231.58508,159.95135)" />
<linearGradient
id="linearGradient3532">
<stop
id="stop3534"
style="stop-color:#545454;stop-opacity:1"
offset="0" />
<stop
id="stop3536"
style="stop-color:#848788;stop-opacity:1"
offset="0.44021741" />
<stop
id="stop3538"
style="stop-color:#9ca0a2;stop-opacity:1"
offset="0.56799388" />
<stop
id="stop3540"
style="stop-color:#565d60;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="525"
y1="371.09448"
x2="525"
y2="395.09448"
id="linearGradient3520"
xlink:href="#linearGradient3532"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5865192,0,0,0.2518015,219.30885,192.6957)" />
<linearGradient
id="linearGradient3227">
<stop
id="stop3229"
style="stop-color:#444444;stop-opacity:1"
offset="0" />
<stop
id="stop3232"
style="stop-color:#b0b0b0;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="543.5"
y1="205.19257"
x2="587.52002"
y2="205.19257"
id="linearGradient3812"
xlink:href="#linearGradient3227"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1223608,0,0,0.3849769,-137.93938,185.11074)" />
<linearGradient
id="linearGradient3167">
<stop
id="stop3169"
style="stop-color:#464646;stop-opacity:1"
offset="0" />
<stop
id="stop3345"
style="stop-color:#848788;stop-opacity:1"
offset="0.44021741" />
<stop
id="stop3347"
style="stop-color:#9ca0a2;stop-opacity:1"
offset="0.56799388" />
<stop
id="stop3171"
style="stop-color:#b5babd;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="443.95602"
y1="315.31854"
x2="443.95602"
y2="247.85609"
id="linearGradient3175"
xlink:href="#linearGradient3167"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.4908502,0,0,0.4579593,230.56224,161.8228)" />
<linearGradient
id="linearGradient3421">
<stop
id="stop3423"
style="stop-color:#444444;stop-opacity:1"
offset="0" />
<stop
id="stop3425"
style="stop-color:#444444;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="432.33429"
cy="233.80295"
r="59.056835"
fx="432.33429"
fy="233.80295"
id="radialGradient3339"
xlink:href="#linearGradient3421"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.4181493,0,0,0.1282619,265.67128,239.85868)" />
<linearGradient
id="linearGradient3435">
<stop
id="stop3437"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3439"
style="stop-color:#c0c0c0;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="290.5"
cy="244.34448"
r="37.5"
fx="290.5"
fy="244.34448"
id="radialGradient3441"
xlink:href="#linearGradient3435"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8202102,0.8202102,-0.7960458,0.7960458,246.73838,-189.686)" />
</defs>
<g
id="submarine">
<rect
width="10.557344"
height="6.0432386"
x="521.95276"
y="286.13785"
id="rect3512"
style="opacity:1;fill:url(#linearGradient3520);fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:0.56879884;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 472.62489,271.38195 C 472.62489,271.38195 533.23236,235.19412 518.64167,256.75283 C 504.05098,278.31152 504.05098,278.31152 504.05098,278.31152 L 472.62489,271.38195 z"
id="path2455"
style="fill:url(#linearGradient3812);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.77744257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 364.84606,263.41905 C 322.73174,271.36528 338.10857,300.23647 381.79153,305.97905 C 431.25896,312.48206 448.02709,310.71241 484.92494,305.97905 C 537.1851,299.27497 537.2581,271.48536 484.92494,262.95644 C 433.55798,254.58499 395.6858,257.60014 364.84606,263.41905 z"
id="path2385"
style="fill:url(#linearGradient3175);fill-opacity:1;fill-rule:evenodd;stroke:#393939;stroke-width:1.90693891;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 421.75698,267.81211 C 428.13994,285.12832 488.00064,276.42836 466.51218,262.27195 C 466.51218,262.27195 422.9096,268.31187 421.75698,267.81211 z"
id="path3403"
style="fill:url(#radialGradient3339);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 416.97069,261.60997 C 416.97069,276.46141 463.19914,276.0068 463.19914,261.15536 L 463.19914,255.76162 C 463.19914,240.91094 416.97069,233.57552 416.97069,248.4262 L 416.97069,261.60997 z"
id="path3291"
style="fill:url(#linearGradient3311);fill-opacity:1;fill-rule:evenodd;stroke:#2d2d2d;stroke-width:2.07042313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 341,263.09448 A 37.5,40 0 1 1 266,263.09448 A 37.5,40 0 1 1 341,263.09448 z"
transform="matrix(0.692163,0,1.4106583e-2,0.289185,154.89061,202.07342)"
id="path3433"
style="opacity:1;fill:url(#radialGradient3441);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.227;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 397,316.09448 A 27.5,7 0 1 1 342,316.09448 A 27.5,7 0 1 1 397,316.09448 z"
transform="matrix(0.5642633,0,0,0.5642633,227.60762,70.172035)"
id="path3458"
style="opacity:1;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.06500006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 397,316.09448 A 27.5,7 0 1 1 342,316.09448 A 27.5,7 0 1 1 397,316.09448 z"
transform="matrix(0,0.30778,-0.5642633,0,708.24166,183.29531)"
id="path3510"
style="opacity:1;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:4.23126984;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<use
transform="translate(0.5000044,-17.235115)"
id="use3544"
x="0"
y="0"
width="1052.3622"
height="744.09448"
xlink:href="#path3510" />
<path
d="M 246,366.09448 A 8.5,8 0 1 1 229,366.09448 A 8.5,8 0 1 1 246,366.09448 z"
transform="matrix(1.7798114,-4.2997512e-2,1.3318941e-2,0.5513151,76.233334,95.845205)"
id="path3584"
style="opacity:1;fill:#787878;fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:2.38492584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.5 KiB

View File

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="744.09448"
height="1052.3622"
id="svg2685">
<defs
id="defs2687">
<linearGradient
id="linearGradient5097">
<stop
id="stop5099"
style="stop-color:#19a2db;stop-opacity:0"
offset="0" />
<stop
id="stop5109"
style="stop-color:#1379a7;stop-opacity:0.49803922"
offset="0.30000001" />
<stop
id="stop5101"
style="stop-color:#0e5173;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="590.84674"
y1="274.57559"
x2="590.84674"
y2="334.01376"
id="linearGradient5103"
xlink:href="#linearGradient5097"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-172.21428,209.55976)"
spreadMethod="pad" />
</defs>
<g
id="layer1">
<rect
width="1053.5891"
height="67.882248"
x="-172.50883"
y="484.13535"
id="rect3448"
style="opacity:1;fill:url(#linearGradient5103);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

Some files were not shown because too many files have changed in this diff Show More