diff --git a/include/Animation.h b/include/Animation.h index ca1c005..14a2f2f 100644 --- a/include/Animation.h +++ b/include/Animation.h @@ -44,8 +44,10 @@ class Animation { CRGB* colors; CRGB* fgColor; CRGB* bgColor; - uint16_t xOffset = 0; - uint16_t yOffset = 0; + 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); @@ -54,16 +56,25 @@ class Animation { 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, uint16_t xOffset, uint16_t yOffset); + Animation(AnimationData* d, CRGB* bg_color, int8_t xOffset, int8_t yOffset); virtual ~Animation(); void draw(); void drawFrame(); virtual bool advance(); }; -class Image : public Animation { - protected: - 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 { diff --git a/src/Animation.cpp b/src/Animation.cpp index 40d1f46..f7432a1 100644 --- a/src/Animation.cpp +++ b/src/Animation.cpp @@ -33,12 +33,13 @@ #include "Animation.h" #include "functions.h" -Animation::Animation(AnimationData *d, CRGB *bg_color, uint16_t x, uint16_t y) { +Animation::Animation(AnimationData *d, CRGB *bg_color, int8_t x, int8_t y) { this->data = d; this->bgColor = bg_color; this->xOffset = x; this->yOffset = y; + this->endFrame = d->frame_count-1; this->colors = new CRGB[this->data->color_count]; uint8_t *color_data = new uint8_t[this->data->color_count * 3]; memcpy_P(color_data, this->data->colors, this->data->color_count * 3); @@ -88,7 +89,8 @@ bool Animation::advance() { if (this->currentFrameSince == 0) { this->currentFrameSince = millis(); } else if (this->currentFrameSince + this->getFrameDelay(currentFrame) < millis() || this->currentFrameSince > millis()) { - currentFrame = (currentFrame + 1) % this->data->frame_count; + currentFrame++; + if (currentFrame > endFrame) currentFrame = startFrame; this->currentFrameSince = millis(); return true; } @@ -108,3 +110,10 @@ CRGB* Animation::getColor(uint8_t index) { if (index==1) return this->bgColor; else return &this->colors[index - 2]; } + +AnimationSlice::AnimationSlice(AnimationData* d, uint8_t start, uint8_t end, CRGB* color, int8_t x, int8_t y) : Animation(d, color, x, y) { + if (start <= end && end < d->frame_count) { + this->startFrame = start; + this->endFrame = end; + } +}