Resourcer => Reader, singletonize reader, music, getSong => Music
[Tsunagari.git] / src / animation.cpp
bloba4a25ad294bec23aedb8cf22a5166da8f8dbc227
1 /*********************************
2 ** Tsunagari Tile Engine **
3 ** animation.cpp **
4 ** Copyright 2011-2012 OmegaSDG **
5 *********************************/
7 // **********
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to
10 // deal in the Software without restriction, including without limitation the
11 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12 // sell copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 // IN THE SOFTWARE.
25 // **********
27 #include <cassert>
29 #include <Gosu/Graphics.hpp>
31 #include "animation.h"
33 Animation::Animation()
34 : cycles(0),
35 frameShowing(0)
39 Animation::Animation(const ImageRef& frame)
40 : cycles(0),
41 frameShowing(0)
43 frames.push_back(frame);
46 Animation::Animation(const std::vector<ImageRef>& _frames, time_t frameTime)
47 : cycles(0),
48 frameTime(frameTime),
49 frameShowing(0),
50 offset(0)
52 ImageVec::const_iterator it;
53 for (it = _frames.begin(); it != _frames.end(); it++)
54 frames.push_back(*it);
55 if (cycles == 0 && frames.size() > 1)
56 cycles = ANIM_INFINITE_CYCLES;
57 cycleTime = frameTime * frames.size();
60 void Animation::startOver(time_t now, int cycles)
62 assert(cycles >= 0 || cycles == ANIM_INFINITE_CYCLES);
64 this->cycles = cycles;
65 offset = now;
66 frameShowing = 0;
69 bool Animation::needsRedraw(time_t now) const
71 if (cycles) {
72 time_t pos = now - offset;
73 size_t frame = (pos % cycleTime) / frameTime;
74 return frame != frameShowing;
76 return false;
79 Image* Animation::frame(time_t now)
81 if (frames.size() == 0)
82 return NULL;
83 if (cycles == 0)
84 return frames[frameShowing].get();
86 time_t pos = now - offset;
87 frameShowing = (pos % cycleTime) / frameTime;
89 if (cycles != ANIM_INFINITE_CYCLES && pos / cycleTime >= cycles) {
90 cycles = 0;
91 frameShowing = frames.size() - 1; // last frame
94 return frames[frameShowing].get();