-
Notifications
You must be signed in to change notification settings - Fork 0
/
widget.cpp
105 lines (88 loc) · 5.06 KB
/
widget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "widget.h"
#include "ui_widget.h"
static int randomBetween(int low, int high)
{
return (qrand() % ((high + 1) - low) + low);
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
// Устанавливаем параметры окна приложения
this->resize(600,600);
this->setFixedSize(600,600);
ui->setupUi(this);
scene = new CustomeScene(); // Инициализируем кастомизированную сцену
ui->graphicsView->setScene(scene); /// Устанавливаем графическую сцену в graphicsView
ui->graphicsView->setRenderHint(QPainter::Antialiasing); /// Устанавливаем сглаживание
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); /// Отключаем скроллбар по вертикали
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); /// Отключаем скроллбар по горизонтали
scene->setSceneRect(0,0,500,500); // Устанавливаем размеры графической сцены
// Создаем кастомизированный курсор из ресурсного файла
QCursor cursor = QCursor(QPixmap(":/cursor/cursorTarget.png"));
ui->graphicsView->setCursor(cursor); // Устанавливаем курсор в QGraphicsView
triangle = new HSE(); // Инициализируем треугольник
triangle->setPos(200,200); // Устанавливаем стартовую позицию треугольника
scene->addItem(triangle); // Добавляем треугольник на графическую сцену
/* Разрешаем отслеживание положение курсора мыши
* без необходимости нажатия на кнопки мыши
* Применяем это свойство именно для QGraphicsView,
* в котором установлена графическая сцена
* */
ui->graphicsView->setMouseTracking(true);
// Подключаем сигнал от графической сцены к слоту треугольника
connect(scene, &CustomeScene::signalTargetCoordinate, triangle, &HSE::slotTarget);
// Соединяем сигнала стрельбы с графической сцены со слотом разрешения стрельбы треугольника
connect(scene, &CustomeScene::signalShot, triangle, &HSE::slotShot);
// Соединяем сигнал на создание пули со слотом, создающим пули в игре
connect(triangle, &HSE::signalBullet, this, &Widget::slotBullet);
timerTarget = new QTimer();
connect(timerTarget, &QTimer::timeout, this, &Widget::slotCreateTarget);
timerTarget->start(1500);
scene->addRect(0,0,520,20,QPen(Qt::NoPen),QBrush(Qt::darkGray));
scene->addRect(0,0,20,520,QPen(Qt::NoPen),QBrush(Qt::darkGray));
scene->addRect(0,500,520,20,QPen(Qt::NoPen),QBrush(Qt::darkGray));
scene->addRect(500,0,20,520,QPen(Qt::NoPen),QBrush(Qt::darkGray));
scene->addRect(170,250,180,20,QPen(Qt::NoPen),QBrush(Qt::darkGray));
scene->addRect(250,170,20,180,QPen(Qt::NoPen),QBrush(Qt::darkGray));
targets.append(triangle);
}
Widget::~Widget()
{
delete ui;
}
void Widget::slotBullet(QPointF start, QPointF end)
{
// Добавляем на сцену пулю
Bullet* bullet = new Bullet(start, end, triangle);
bullet->setCallbackFunc(slotHitTarget);
scene->addItem(bullet);
}
void Widget::slotCreateTarget()
{
Target *target = new Target(); // Создаём цель
connect(scene, &CustomeScene::signalShot, target, &Target::slotShot);
// Соединяем сигнал на создание пули со слотом, создающим пули в игре
connect(target, &Target::signalBullet, this, &Widget::slotBullet);
scene->addItem(target); // Помещаем цель в сцену со случайной позицией
target->setPos(qrand() % ((500 - 40 + 1) - 40) + 40,
qrand() % ((500 - 40 + 1) - 40) + 40);
target->setZValue(-1); // Помещаем цель ниже Героя
targets.append(target); // Добавляем цель в список
}
void Widget::slotHitTarget(QGraphicsItem *item)
{
/* Получив сигнал от Пули
* Перебираем весь список целей и наносим ему случайный урон
* */
foreach (QGraphicsItem *targ, targets) {
if(targ == item){
// Кастуем объект из списка в класс Target
Target *t = qgraphicsitem_cast <Target *> (targ);
t->hit(randomBetween(1,3)); // Наносим урон
HSE *g = qgraphicsitem_cast <HSE *> (targ);
g->hit(randomBetween(1,3)); // Наносим урон
}
}
}
QList<QGraphicsItem *> Widget::targets; // реализация списка