blob: b921394573236205293a01d1896804d851a0010a (
plain)
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
108
|
#include "Sprite.h"
Sprite::Sprite(QGraphicsItem *parent, QGraphicsScene *scene)
: QObject(0),
QGraphicsPixmapItem(parent, scene),
m_currentFrame(0),
m_interval(1000/20)
{
addAnimation("default", FrameList());
setAnimation("default");
m_timer.invalidate();
}
void Sprite::addFrame(const QString &anim, QPixmap frame)
{
if (!m_animations.contains(anim))
{
FrameList l;
m_animations[anim] = l;
}
m_animations[anim].append(frame);
}
void Sprite::addAnimation(const QString &anim, const FrameList &frames)
{
if (!m_animations.contains(anim))
{
m_animations[anim] = frames;
}
else
{
m_animations[anim].append(frames);
}
}
void Sprite::setFrame(int frame)
{
if (frame < 0 || frame >= getCurrentAnimation().size())
{
qWarning("invalid frame number %d", frame);
return;
}
m_currentFrame = frame;
setPixmap(getFramePixmap());
}
int Sprite::getFrame() const
{
return m_currentFrame;
}
QPixmap Sprite::getFramePixmap() const
{
return getCurrentAnimation()[m_currentFrame];
}
int Sprite::getFrameCount() const
{
return getCurrentAnimation().size();
}
Sprite::FrameList Sprite::getCurrentAnimation() const
{
return m_animations[m_currentAnimation];
}
void Sprite::nextFrame()
{
m_currentFrame++;
if (m_currentFrame >= getCurrentAnimation().size())
m_currentFrame = 0;
setFrame(m_currentFrame);
}
void Sprite::setAnimation(const QString &anim)
{
if (!m_animations.contains(anim))
{
qWarning("animation '%s' doesn't exist", anim.toUtf8().data());
return;
}
if (m_currentAnimation != anim)
m_currentAnimation = anim;
}
void Sprite::advance(int phase)
{
if (phase == 1)
return;
if (m_timer.isValid() && m_timer.elapsed() >= m_interval)
{
nextFrame();
m_timer.start();
}
// this should be run the first time advance() is called
if (!m_timer.isValid())
{
m_timer.start();
}
}
|