1
/****************************************************************************
3
** Copyright (C) 2005-2005 Trolltech AS. All rights reserved.
5
** This file is part of the example classes of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
29
/****************************************************************
31
** Implementation CannonField class, Qt tutorial 12
33
****************************************************************/
36
#include <QPaintEvent>
43
#include "cannonfield.h"
45
CannonField::CannonField(QWidget *parent)
51
autoShootTimer = new QTimer(this);
52
connect(autoShootTimer, SIGNAL(timeout()), this, SLOT(moveShot()));
55
target = QPoint(0, 0);
56
setPalette(QPalette(QColor(250, 250, 200)));
60
void CannonField::setAngle(int angle)
66
if (currentAngle == angle)
70
emit angleChanged(currentAngle);
73
void CannonField::setForce(int force)
77
if (currentForce == force)
80
emit forceChanged(currentForce);
83
void CannonField::shoot()
85
if (autoShootTimer->isActive())
88
shootAngle = currentAngle;
89
shootForce = currentForce;
90
autoShootTimer->start(5);
93
void CannonField::newTarget()
95
static bool firstTime = true;
99
QTime midnight(0, 0, 0);
100
srand(midnight.secsTo(QTime::currentTime()));
102
target = QPoint(200 + rand() % 190, 10 + rand() % 255);
106
void CannonField::moveShot()
108
QRegion region = shotRect();
111
QRect shotR = shotRect();
113
if (shotR.intersects(targetRect())) {
114
autoShootTimer->stop();
116
} else if (shotR.x() > width() || shotR.y() > height()) {
117
autoShootTimer->stop();
120
region = region.unite(shotR);
125
void CannonField::paintEvent(QPaintEvent * /* event */)
127
QPainter painter(this);
129
paintCannon(painter);
130
if (autoShootTimer->isActive())
132
paintTarget(painter);
135
void CannonField::paintShot(QPainter &painter)
137
painter.setPen(Qt::NoPen);
138
painter.setBrush(Qt::black);
139
painter.drawRect(shotRect());
142
void CannonField::paintTarget(QPainter &painter)
144
painter.setPen(Qt::black);
145
painter.setBrush(Qt::red);
146
painter.drawRect(targetRect());
149
const QRect barrelRect(33, -4, 15, 8);
151
void CannonField::paintCannon(QPainter &painter)
153
painter.setPen(Qt::NoPen);
154
painter.setBrush(Qt::blue);
157
painter.translate(0, height());
158
painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16);
159
painter.rotate(-currentAngle);
160
painter.drawRect(barrelRect);
164
QRect CannonField::cannonRect() const
166
QRect result(0, 0, 50, 50);
167
result.moveBottomLeft(rect().bottomLeft());
171
QRect CannonField::shotRect() const
173
const double gravity = 4;
175
double time = timerCount / 40.0;
176
double velocity = shootForce;
177
double radians = shootAngle * 3.14159265 / 180;
179
double velx = velocity * cos(radians);
180
double vely = velocity * sin(radians);
181
double x0 = (barrelRect.right() + 5) * cos(radians);
182
double y0 = (barrelRect.right() + 5) * sin(radians);
183
double x = x0 + velx * time;
184
double y = y0 + vely * time - 0.5 * gravity * time * time;
186
QRect result(0, 0, 6, 6);
187
result.moveCenter(QPoint(qRound(x), height() - 1 - qRound(y)));
191
QRect CannonField::targetRect() const
193
QRect result(0, 0, 20, 10);
194
result.moveCenter(QPoint(target.x(), height() - 1 - target.y()));