MatrixEffect can now have multiple columns in the same column. In RandomMatrix, they even run in all directions.

This commit is contained in:
Fabian Schlenz 2019-06-19 22:22:03 +02:00
parent e897c6bdcd
commit d2c0268dce
2 changed files with 80 additions and 22 deletions

View File

@ -9,16 +9,23 @@
class MatrixEffectColumn { class MatrixEffectColumn {
protected: protected:
Window* window; Window* window;
int x, y; uint8_t x, y;
int length = 1; uint8_t length = 1;
uint8_t _direction = 2;
bool _random_direction = false;
virtual CRGB _getColor(uint8_t height); virtual CRGB _getColor(uint8_t height);
virtual void restart(); virtual void restart(bool completely_random);
private: private:
uint16_t speed; uint16_t speed;
boolean running; boolean running;
unsigned long last_move = 0; unsigned long last_move = 0;
public: public:
MatrixEffectColumn(Window* win, int xPos); static const uint8_t DIR_NORTH = 0;
static const uint8_t DIR_EAST = 1;
static const uint8_t DIR_SOUTH = 2;
static const uint8_t DIR_WEST = 3;
MatrixEffectColumn(Window* win, uint8_t direction=0, bool random_direction=false);
virtual ~MatrixEffectColumn() {}; virtual ~MatrixEffectColumn() {};
void advance(); void advance();
void draw(); void draw();
@ -29,16 +36,16 @@ class RainbowMatrixEffectColumn : public MatrixEffectColumn {
protected: protected:
CRGB _getColor(uint8_t height) override; CRGB _getColor(uint8_t height) override;
public: public:
RainbowMatrixEffectColumn(Window* win, int xPos) : MatrixEffectColumn(win, xPos) {}; RainbowMatrixEffectColumn(Window* win, uint8_t dir, bool rnd=false) : MatrixEffectColumn(win, dir, rnd) {};
}; };
class RandomMatrixEffectColumn : public MatrixEffectColumn { class RandomMatrixEffectColumn : public MatrixEffectColumn {
protected: protected:
uint8_t _hue = 42; uint8_t _hue = 42;
CRGB _getColor(uint8_t height) override; CRGB _getColor(uint8_t height) override;
void restart() override; void restart(bool completely_random) override;
public: public:
RandomMatrixEffectColumn(Window* win, int xPos) : MatrixEffectColumn(win, xPos) {}; RandomMatrixEffectColumn(Window* win, uint8_t dir, bool rnd=false) : MatrixEffectColumn(win, dir, rnd) {};
}; };
class MatrixEffect : public Effect { class MatrixEffect : public Effect {

View File

@ -2,29 +2,80 @@
#include "my_color_palettes.h" #include "my_color_palettes.h"
#include "functions.h" #include "functions.h"
MatrixEffectColumn::MatrixEffectColumn(Window* win, int xPos) { MatrixEffectColumn::MatrixEffectColumn(Window* win, uint8_t dir, bool rand) {
window = win; window = win;
x = xPos; _direction = dir;
restart(); _random_direction = rand;
y = random8(0, window->height); restart(true);
} }
void MatrixEffectColumn::restart() { void MatrixEffectColumn::restart(bool completely_random) {
y=-1; if (_random_direction) {
_direction = random8(4);
}
if (completely_random) {
x = random8(window->width);
y = random8(window->height);
} else {
switch(_direction) {
case DIR_NORTH:
x = random8(window->width);
y = window->height - 1;
break;
case DIR_EAST:
x = 0;
y = random8(window->height);
break;
case DIR_SOUTH:
x = random8(window->width);
y = 0;
break;
case DIR_WEST:
x = window->width - 1;
y = random8(window->height);
break;
}
}
length = random8(EFFECT_MATRIX_LENGTH_MIN, EFFECT_MATRIX_LENGTH_MAX); length = random8(EFFECT_MATRIX_LENGTH_MIN, EFFECT_MATRIX_LENGTH_MAX);
running = true; running = true;
speed = random8(EFFECT_MATRIX_SPEED_MIN, EFFECT_MATRIX_SPEED_MAX); speed = random8(EFFECT_MATRIX_SPEED_MIN, EFFECT_MATRIX_SPEED_MAX);
} }
void MatrixEffectColumn::advance() { void MatrixEffectColumn::advance() {
y++; switch(_direction) {
if (y-length > window->height) running = false; case DIR_NORTH:
y--;
if (y > window->height && y + length > window->height) running=false;
break;
case DIR_EAST:
x++;
if (x - length > window->width) running=false;
break;
case DIR_SOUTH:
y++;
if (y - length > window->height) running=false;
break;
case DIR_WEST:
x--;
if (x > window->width && y + length > window->width) running=false;
break;
}
} }
void MatrixEffectColumn::draw() { void MatrixEffectColumn::draw() {
int8_t xdir = 0;
int8_t ydir = 0;
switch (_direction) {
case DIR_NORTH: ydir = 1; break;
case DIR_EAST: xdir = 1; break;
case DIR_SOUTH: ydir = -1; break;
case DIR_WEST: xdir = -1; break;
}
for(int i=0; i<length; i++) { for(int i=0; i<length; i++) {
CRGB color = _getColor(i); CRGB color = _getColor(i);
window->setPixel(x, y-i, &color); window->raisePixel(x+(xdir*i), y+(ydir*i), &color);
} }
} }
@ -32,7 +83,7 @@ void MatrixEffectColumn::loop() {
if (!running) { if (!running) {
if (random8() < 20) { if (random8() < 20) {
// Start the column again. // Start the column again.
restart(); restart(false);
} }
} else { } else {
if (millis() - last_move > speed) { if (millis() - last_move > speed) {
@ -75,8 +126,8 @@ CRGB RandomMatrixEffectColumn::_getColor(uint8_t i) {
return color; return color;
} }
void RandomMatrixEffectColumn::restart() { void RandomMatrixEffectColumn::restart(bool completely_random) {
MatrixEffectColumn::restart(); MatrixEffectColumn::restart(completely_random);
_hue = random8(); _hue = random8();
} }
@ -97,15 +148,15 @@ MatrixEffect::MatrixEffect() {
} }
void MatrixEffect::_init() { void MatrixEffect::_init() {
for (int i=0; i<window->width; i++) _columns[i] = new MatrixEffectColumn(window, i); for (int i=0; i<window->width; i++) _columns[i] = new MatrixEffectColumn(window, MatrixEffectColumn::DIR_SOUTH);
} }
void RandomMatrixEffect::_init() { void RandomMatrixEffect::_init() {
for (int i=0; i<window->width; i++) _columns[i] = new RandomMatrixEffectColumn(window, i); for (int i=0; i<window->width; i++) _columns[i] = new RandomMatrixEffectColumn(window, random8(4), true);
} }
void RainbowMatrixEffect::_init() { void RainbowMatrixEffect::_init() {
for (int i=0; i<window->width; i++) _columns[i] = new RainbowMatrixEffectColumn(window, i); for (int i=0; i<window->width; i++) _columns[i] = new RainbowMatrixEffectColumn(window, MatrixEffectColumn::DIR_SOUTH);
} }
MatrixEffect::~MatrixEffect() { MatrixEffect::~MatrixEffect() {