pitrix/src/effect_matrix.cpp

63 lines
1.5 KiB
C++

#include "effect_matrix.h"
#include "my_color_palettes.h"
#include "functions.h"
MatrixEffectColumn::MatrixEffectColumn() {
}
MatrixEffectColumn::MatrixEffectColumn(Window* win, int xPos) : MatrixEffectColumn() {
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++) {
if (i==0) {
setPixel(*window, x, y-i, CRGB(255, 255, 255));
} else {
setPixel(*window, x, y-i, ColorFromPalette((CRGBPalette16)palette_matrix, 255 * (length - i) / length));
}
}
}
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();
}