-
Notifications
You must be signed in to change notification settings - Fork 1
/
Animation.cpp
119 lines (106 loc) · 2.91 KB
/
Animation.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "Animation.h"
#include <iostream>
#include <utility>
#include "Event.h"
#include "Level.h"
Animation::Animation() = default;
Animation::Animation(sf::Sprite& activeSprite,
size_t numRect,
size_t xOffset,
size_t yOffset,
size_t width,
size_t height,
size_t borderSize,
bool repeat,
std::vector<sf::IntRect> actionRectangles,
size_t ticsPerFrame,
const std::string& name) :
mRemainingTicsThisFrame(ticsPerFrame),
mTicsPerFrame(ticsPerFrame),
mSpriteIndex(0),
mNumRect(numRect),
mXOffset(xOffset),
mYOffset(yOffset),
mWidth(width),
mHeight(height),
mBorderSize(borderSize),
mRepeat(repeat),
mName(name),
mActionRectangles(std::move(actionRectangles)),
mActiveSprite(&activeSprite)
{
if (mActionRectangles.empty())
{
mActionRectangles = generateActionRectangles();
}
mActiveSprite->setTextureRect(mActionRectangles[0]);
}
void Animation::processAction()
{
--mRemainingTicsThisFrame;
if (mRemainingTicsThisFrame == 0)
{
if (fireEventAndReturnTrueIfFinished())
{
if (mRepeat)
{
mSpriteIndex = 0;
}
}
else
{
++mSpriteIndex;
}
mRemainingTicsThisFrame = mTicsPerFrame;
}
mActiveSprite->setTextureRect(mActionRectangles[mSpriteIndex]);
}
bool Animation::fireEventAndReturnTrueIfFinished() const
{
const auto result = mSpriteIndex == mActionRectangles.size() - 1;
if (result && !mName.empty() && !mRepeat)
{
addEvent(Event::constructAnimationCompleted(mName));
}
return result;
}
size_t Animation::getSpriteIndex() const
{
return mSpriteIndex;
}
size_t Animation::xOffsetForCurrentFrame(size_t frameIndex) const
{
return mXOffset + ((mWidth + mBorderSize) * frameIndex);
}
void Animation::setActionRectangles(
const std::vector<sf::IntRect>& actionRectangles)
{
mActionRectangles = actionRectangles;
mSpriteIndex = 0;
}
sf::IntRect Animation::getCurrentFrame() const
{
return mActionRectangles[mSpriteIndex];
}
std::vector<sf::IntRect> Animation::generateActionRectangles() const
{
std::vector<sf::IntRect> rectangles;
rectangles.reserve(mNumRect);
for (size_t ii = 0; ii < mNumRect; ++ii)
{
rectangles.emplace_back(xOffsetForCurrentFrame(ii),
mYOffset,
mWidth,
mHeight);
}
return rectangles;
}
void Animation::switchPalette(const sf::Vector2f& offset,
const sf::Vector2f& size)
{
mXOffset = offset.x;
mYOffset = offset.y;
mWidth = size.x;
mHeight = size.y;
mActionRectangles = generateActionRectangles();
}