1 /* 2 * The ManaPlus Client 3 * Copyright (C) 2010 The Mana Developers 4 * Copyright (C) 2011-2019 The ManaPlus Developers 5 * Copyright (C) 2019-2021 Andrei Karas 6 * 7 * This file is part of The ManaPlus Client. 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 */ 22 23 #ifndef BEING_COMPOUNDSPRITE_H 24 #define BEING_COMPOUNDSPRITE_H 25 26 #include "resources/sprite/sprite.h" 27 28 #include "utils/vector.h" 29 30 #include <list> 31 32 #include "localconsts.h" 33 34 class CompoundItem; 35 class Image; 36 37 class CompoundSprite notfinal : public Sprite 38 { 39 public: 40 typedef STD_VECTOR<Sprite*>::iterator SpriteIterator; 41 typedef STD_VECTOR<Sprite*>::const_iterator SpriteConstIterator; 42 43 CompoundSprite(); 44 45 A_DELETE_COPY(CompoundSprite) 46 47 ~CompoundSprite() override; 48 49 bool reset() override final; 50 51 bool play(const std::string &action) override final; 52 53 bool update(const int time) override final; 54 55 void drawSimple(Graphics *const graphics, 56 const int posX, 57 const int posY) const A_NONNULL(2); 58 59 /** 60 * Gets the width in pixels of the first sprite in the list. 61 */ 62 int getWidth() const override A_WARN_UNUSED; 63 64 /** 65 * Gets the height in pixels of the first sprite in the list. 66 */ 67 int getHeight() const override A_WARN_UNUSED; 68 69 const Image *getImage() const override final A_WARN_UNUSED; 70 71 bool setSpriteDirection(const SpriteDirection::Type direction) 72 override final; 73 74 int getNumberOfLayers() const A_WARN_UNUSED; 75 76 unsigned int getCurrentFrame() const override final A_WARN_UNUSED; 77 78 unsigned int getFrameCount() const override final A_WARN_UNUSED; 79 80 void addSprite(Sprite *const sprite); 81 82 void setSprite(const size_t layer, Sprite *const sprite); 83 84 void removeSprite(const int layer); 85 86 void clear(); 87 88 void ensureSize(const size_t layerCount); 89 90 void drawSprites(Graphics *const graphics, 91 const int posX, 92 const int posY) const; 93 94 virtual void drawSpritesSDL(Graphics *const graphics, 95 const int posX, 96 const int posY) const; 97 98 void setAlpha(float alpha) override; 99 100 bool updateNumber(const unsigned num) override final; 101 setEnableDelay(bool b)102 constexpr2 static void setEnableDelay(bool b) noexcept2 103 { mEnableDelay = b; } 104 getLastTime()105 int getLastTime() const noexcept2 A_WARN_UNUSED 106 { return mLastTime; } 107 getStartTime()108 int getStartTime() const noexcept2 A_WARN_UNUSED 109 { return mStartTime; } 110 111 STD_VECTOR<Sprite*> mSprites; 112 113 protected: 114 void redraw() const; 115 116 void updateImages() const; 117 118 bool updateFromCache() const; 119 120 void initCurrentCacheItem() const; 121 122 typedef std::list<CompoundItem*> ImagesCache; 123 mutable ImagesCache imagesCache; 124 mutable CompoundItem *mCacheItem; 125 126 mutable Image *mImage; 127 mutable Image *mAlphaImage; 128 129 mutable int mOffsetX; 130 mutable int mOffsetY; 131 int mStartTime; 132 int mLastTime; 133 #ifndef USE_SDL2 134 mutable int mNextRedrawTime; 135 #endif // USE_SDL2 136 137 static bool mEnableDelay; 138 mutable bool mNeedsRedraw; 139 bool mEnableAlphaFix; 140 bool mDisableAdvBeingCaching; 141 bool mDisableBeingCaching; 142 }; 143 144 #endif // BEING_COMPOUNDSPRITE_H 145