-
Notifications
You must be signed in to change notification settings - Fork 540
/
dancing_kirby.cpp
55 lines (48 loc) · 1.4 KB
/
dancing_kirby.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
#include <chrono>
#include <iostream>
#include <algorithm>
#include "cppa/cppa.hpp"
using std::cout;
using std::endl;
using namespace cppa;
// ASCII art figures
constexpr const char* figures[] = {
"<(^.^<)",
"<(^.^)>",
"(>^.^)>"
};
// array of {figure, offset} pairs
constexpr size_t animation_steps[][2] = {
{1, 7}, {0, 7}, {0, 6}, {0, 5}, {1, 5}, {2, 5}, {2, 6},
{2, 7}, {2, 8}, {2, 9}, {2, 10}, {1, 10}, {0, 10}, {0, 9},
{1, 9}, {2, 10}, {2, 11}, {2, 12}, {2, 13}, {1, 13}, {0, 13},
{0, 12}, {0, 11}, {0, 10}, {0, 9}, {0, 8}, {0, 7}, {1, 7}
};
constexpr size_t animation_width = 20;
// "draws" an animation step: {offset_whitespaces}{figure}{padding}
void draw_kirby(size_t const (&animation)[2]) {
cout.width(animation_width);
cout << '\r';
std::fill_n(std::ostream_iterator<char>{cout}, animation[1], ' ');
cout << figures[animation[0]];
cout.fill(' ');
cout.flush();
}
void dancing_kirby() {
// let's get it started
send(self, atom("Step"));
// iterate over animation_steps
auto i = std::begin(animation_steps);
receive_for(i, std::end(animation_steps)) (
on<atom("Step")>() >> [&]() {
draw_kirby(*i);
// animate next step in 150ms
delayed_send(self, std::chrono::milliseconds(150), atom("Step"));
}
);
}
int main() {
cout << endl;
dancing_kirby();
cout << endl;
}