-
Notifications
You must be signed in to change notification settings - Fork 1
/
abstractitem.h
107 lines (92 loc) · 2.64 KB
/
abstractitem.h
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
106
107
#ifndef ABSTRACTITEM_H
#define ABSTRACTITEM_H
// File must include
#include <QPointF>
#include "gamemath.h"
// Forward declaration
class QPainter;
/**
* @brief An abstract class of an item.
* It should have the ability to paint itself.
*/
class AbstractItem
{
public:
/**
*@brief Paint the item.
*
*@param painter The QPainter to do the paint.
*@param width The width of the whole QPaintDevice.
*@param height The height of the whole QPaintDevice.
*@param frame The index of the frame to show
* (An item may have lots of frames which will realize an animation).
*/
virtual void paint(QPainter *painter, int width, int height, int frame)=0;
/**
*@brief Set the position of the item(The position is relative one,
* NOT absolute one!).
*/
void setPos(QPointF pos)
{position = pos;}
/**
*@brief Get the position of the item(The position is relative one,
* NOT absolute one!).
*/
QPointF getPos()
{return position;}
/**
*@brief Judget whether a mouse is in the item(The position is absolute one,
* NOT relative one!).
*/
virtual bool in(QPointF mousePos, int width, int height)=0;
private:
// The position of the item
// (The position is relative one, NOT absolute one!)
QPointF position;
};
/**
* @brief An abstract class of an item which is rectangle.
*/
class AbstractRectItem : public AbstractItem
{
public:
virtual void paint(QPainter *painter, int width, int height, int frame)=0;
virtual bool in(QPointF mousePos, int windowWidth, int windowHeight)
{
QPointF centerPos = getPos();
centerPos.setX(centerPos.x() * windowWidth);
centerPos.setY(centerPos.y() * windowHeight);
return mousePos.x() - centerPos.x() < width() / 2 &&
mousePos.x() - centerPos.x() > -width() / 2 &&
mousePos.y() - centerPos.y() < height() / 2 &&
mousePos.y() - centerPos.y() > -height() / 2;
}
/**
*@brief Get the width of the item(used in "in").
*/
virtual double width()=0;
/**
*@brief Get the height of the item(used in "in").
*/
virtual double height()=0;
};
/**
* @brief An abstract class of an item which is circle.
*/
class AbstractCircleItem : public AbstractItem
{
public:
virtual void paint(QPainter *painter, int width, int height, int frame)=0;
virtual bool in(QPointF mousePos, int windowWidth, int windowHeight)
{
QPointF centerPos = getPos();
centerPos.setX(centerPos.x() * windowWidth);
centerPos.setY(centerPos.y() * windowHeight);
return distanceOfTwoPoints(mousePos, centerPos) <= r();
}
/**
*@brief Get the radius of the item(used in "in").
*/
virtual double r()=0;
};
#endif // ABSTRACTITEM_H