61 lines
1.3 KiB
C++
61 lines
1.3 KiB
C++
|
#include "effect_matrix.h"
|
||
|
#include "functions.h"
|
||
|
|
||
|
MatrixEffectColumn::MatrixEffectColumn() { }
|
||
|
|
||
|
MatrixEffectColumn::MatrixEffectColumn(Window* win, int xPos) {
|
||
|
window = win;
|
||
|
x = xPos;
|
||
|
start();
|
||
|
y = random8(0, win->h);
|
||
|
}
|
||
|
|
||
|
void MatrixEffectColumn::start() {
|
||
|
y=-1;
|
||
|
length = random8(EFFECT_MATRIX_LENGTH_MIN, EFFECT_MATRIX_LENGTH_MAX);
|
||
|
running = true;
|
||
|
speed = random8(EFFECT_MATRIX_SPEED_MIN, EFFECT_MATRIX_SPEED_MAX);
|
||
|
}
|
||
|
|
||
|
void MatrixEffectColumn::advance() {
|
||
|
y++;
|
||
|
if (y-length > window->h) running = false;
|
||
|
}
|
||
|
|
||
|
void MatrixEffectColumn::draw() {
|
||
|
for(int i=0; i<length; i++) {
|
||
|
CRGB color;
|
||
|
if (i==0) color=CHSV(85, 0, 192);
|
||
|
else color=CHSV(85, 255, 255/(length-1)*(length-i));
|
||
|
|
||
|
setPixel(*window, x, y-i, color);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void MatrixEffectColumn::loop() {
|
||
|
if (!running) {
|
||
|
if (random8() < 20) {
|
||
|
// Start the column again.
|
||
|
start();
|
||
|
}
|
||
|
} else {
|
||
|
if (millis() - last_move > speed) {
|
||
|
advance();
|
||
|
last_move = millis();
|
||
|
}
|
||
|
|
||
|
draw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
boolean MatrixEffect::can_be_shown_with_clock() { return true; };
|
||
|
|
||
|
MatrixEffect::MatrixEffect() {
|
||
|
for (int i=0; i<LED_WIDTH; i++) columns[i] = MatrixEffectColumn(&window, i);
|
||
|
}
|
||
|
|
||
|
void MatrixEffect::loop() {
|
||
|
clear(window);
|
||
|
for (int i=0; i<LED_WIDTH; i++) columns[i].loop();
|
||
|
}
|