/** Animations are structured in AnimationData as follows: .colors contains .color_count*3 uint8_t values for R, G and B. .offsets contains the frame start offsets within .data + the length of the data. (So you can always do something like `for (int i=anim.offsets[i]; i #include "prototypes.h" #include "my_fastled.h" class Animation { protected: AnimationData* data; unsigned long currentFrameSince; uint8_t currentFrame = 0; uint8_t* animation_data; CRGB* colors; CRGB* fgColor; CRGB* bgColor; int8_t xOffset = 0; int8_t yOffset = 0; uint8_t startFrame; uint8_t endFrame; virtual CRGB* getColor(uint8_t color_index); void drawFrame(uint8_t frame_index); void drawPixel(int index, CRGB* color); uint16_t getFrameDelay(int frame); public: Animation(AnimationData* d) : Animation(d, new CRGB(0x000000), 0, 0) {}; Animation(AnimationData* d, CRGB* bg_color): Animation(d, bg_color, 0, 0) {}; Animation(AnimationData* d, CRGB* bg_color, int8_t xOffset, int8_t yOffset); virtual ~Animation(); void draw(); void drawFrame(); virtual bool advance(); }; class AnimationSlice : public Animation { public: AnimationSlice(AnimationData* d, uint8_t start, uint8_t end) : AnimationSlice(d, start, end, new CRGB(0x000000), 0, 0) {}; AnimationSlice(AnimationData* d, uint8_t start, uint8_t end, CRGB* color) : AnimationSlice(d, start, end, color, 0, 0) {}; AnimationSlice(AnimationData* d, uint8_t start, uint8_t end, CRGB* color, int8_t x, int8_t y); }; class Image : public AnimationSlice { public: Image(AnimationData* d) : AnimationSlice(d, 0, 0, new CRGB(0x000000), 0, 0) {}; Image(AnimationData* d, CRGB* color) : AnimationSlice(d, 0, 0, color, 0, 0) {}; Image(AnimationData* d, CRGB* color, int8_t x, int8_t y) : AnimationSlice(d, 0, 0, color, x, y) {}; }; class Sprite : public Image { protected: virtual CRGB* getColor(uint8_t color_index); public: void setFgColor(CRGB c); void setBgColor(CRGB c); void setColors(CRGB c1, CRGB c2); };