1 /*********************************
2 ** Tsunagari Tile Engine **
4 ** Copyright 2011-2012 OmegaSDG **
5 *********************************/
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
29 #include <Gosu/Graphics.hpp>
31 #include "animation.h"
33 Animation::Animation()
39 Animation::Animation(const ImageRef
& frame
)
43 frames
.push_back(frame
);
46 Animation::Animation(const std::vector
<ImageRef
>& _frames
, time_t frameTime
)
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
;
69 bool Animation::needsRedraw(time_t now
) const
72 time_t pos
= now
- offset
;
73 size_t frame
= (pos
% cycleTime
) / frameTime
;
74 return frame
!= frameShowing
;
79 Image
* Animation::frame(time_t now
)
81 if (frames
.size() == 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
) {
91 frameShowing
= frames
.size() - 1; // last frame
94 return frames
[frameShowing
].get();