forked from dbprof/ny-led-matrix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathg_runner.ino
90 lines (80 loc) · 2.63 KB
/
g_runner.ino
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
// игра "бегалка прыгалка"
// **************** НАСТРОЙКИ RUNNER ****************
// 1 пиксель = 10 мм
#define POP_SPEED 420 // скорость подскока (в мм/с)
#define GRAVITY 1400 // ускорение падения (в мм/с2)
#define DT 20 // период интегрирования (мс)
#define OBST_SPEED 50 // скорость препятствий
#define MIN_GAP 8 // минимальное расстояние между препятствиями
#define OBST_HEIGHT 4 // макс. высота препятствия
#define OBST_PROB 10 // шанс появления препятствия
#define DEMO_JUMP 6 // за какое расстояние делать прыжок в демо режиме
#if (USE_RUNNER == 1)
timerMinim runnerTimer(DT);
timerMinim obstTimer(OBST_SPEED);
int posRun = 0;
int velRun = 0; // в мм и мм/с
byte prevPosRun;
byte obstCounter;
int runnerScore;
void runnerRoutine() {
if (loadingFlag) {
FastLED.clear();
loadingFlag = false;
gamemodeFlag = true;
modeCode = 2;
}
if (gameDemo) {
if (getPixColorXY(DEMO_JUMP, 0) == GLOBAL_COLOR_2) buttons = 0; // автопрыжок
}
if (checkButtons()) {
if (buttons == 0) { // кнопка нажата
if (posRun == 0) {
velRun = POP_SPEED;
}
buttons = 4;
}
}
if (runnerTimer.isReady()) {
if (obstTimer.isReady()) {
for (byte i = 0; i < WIDTH - 1; i++) {
for (byte j = 0; j < HEIGHT; j++) {
leds[getPixelNumber(i, j)] = getPixColorXY(i + 1, j);
}
}
obstCounter++;
if (obstCounter >= MIN_GAP && random(0, OBST_PROB) == 0) {
obstCounter = 0;
runnerScore++;
byte thisHeight = random(1, OBST_HEIGHT + 1);
for (byte i = 0; i < thisHeight; i++)
drawPixelXY(WIDTH - 1, i, GLOBAL_COLOR_2);
} else {
for (byte i = 0; i < HEIGHT; i++)
drawPixelXY(WIDTH - 1, i, 0);
}
}
velRun -= (float)GRAVITY * DT / 1000;
posRun += (float)velRun * DT / 1000;
if (posRun < 0) {
posRun = 0;
velRun = 0;
}
if (getPixColorXY(1, posRun / 10) == GLOBAL_COLOR_2) {
displayScore(runnerScore);
runnerScore = 0;
loadingFlag = true;
delay(800);
return;
}
drawPixelXY(1, prevPosRun / 10, 0x000000);
drawPixelXY(1, posRun / 10, GLOBAL_COLOR_1);
prevPosRun = posRun;
FastLED.show();
}
}
#else
void runnerRoutine() {
return;
}
#endif