-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSpikes.cpp
78 lines (66 loc) · 1.77 KB
/
Spikes.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
#include "Spikes.hpp"
#include "RectangleFunctions.hpp"
#include "Renderer.hpp"
namespace TappyPlane {
constexpr int spikeTipDistance{720};
Spikes::Spikes(const int spikePairDistance, const int scrollSpeed)
: mSpikePairFactory(spikeTipDistance)
, mSpikePairDistance(spikePairDistance)
, mScrollSpeed(scrollSpeed)
{
reset();
}
std::pair<std::vector<SpikePair>::const_iterator,
std::vector<SpikePair>::const_iterator> Spikes::bounds() const noexcept
{
return {cbegin(mSpikePairs), cend(mSpikePairs)};
}
bool Spikes::isPlaying() const noexcept
{
return mIsPlaying;
}
void Spikes::play() noexcept
{
mIsPlaying = true;
}
void Spikes::pause() noexcept
{
mIsPlaying = false;
}
void Spikes::reset() noexcept
{
constexpr int numSpikePairs{5};
mSpikePairs.reserve(numSpikePairs);
for (int i{0}; i < numSpikePairs; ++i) {
mSpikePairs.push_back(mSpikePairFactory.make());
}
const auto stride = mSpikePairs.front().topSpikeBounds.width()
+ mSpikePairDistance;
auto currentX = rightOf(canvasBounds);
for (auto& spikePair : mSpikePairs) {
spikePair.setX(currentX);
currentX += stride;
}
}
void Spikes::update() noexcept
{
if (!isPlaying()) {
return;
}
for (auto& spikePair : mSpikePairs) {
spikePair.setX(spikePair.x() - mScrollSpeed);
}
if (rightOf(mSpikePairs.front().topSpikeBounds) < leftOf(canvasBounds)) {
mSpikePairs.erase(cbegin(mSpikePairs));
mSpikePairs.emplace_back(mSpikePairFactory.make()).setX(
mSpikePairs.back().x() + mSpikePairs.back().topSpikeBounds.width()
+ mSpikePairDistance);
}
}
void Spikes::draw() const
{
for (const auto& spikePair : mSpikePairs) {
spikePair.draw();
}
}
} // namespace TappyPlane