-
Notifications
You must be signed in to change notification settings - Fork 1
/
Anim.hpp
136 lines (104 loc) · 2.07 KB
/
Anim.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef _ANIM_HPP
#define _ANIM_HPP
#include <sifteo.h>
static const int kMaxFrames = 8;
class Frame
{
public:
const PinnedAssetImage* asset;
int frameNum;
Frame() : asset(NULL), frameNum(-1)
{
}
Frame( const PinnedAssetImage* _asset, int _frameNum ) :
asset(_asset),
frameNum(_frameNum)
{
}
};
class Animation
{
public:
Frame frames[kMaxFrames];
float fps;
Animation() :
fps(8.0),
nextFreeFrame(0)
{
}
void addFrame( const PinnedAssetImage& img, int frameNum )
{
if( nextFreeFrame < arraysize(frames) )
frames[nextFreeFrame++] = Frame(&img, frameNum);
}
void updateSprite( const SpriteRef& ref, float playTime ) const
{
const Frame& f = frames[getFrameNum(playTime)];
ref.setImage( *f.asset, f.frameNum );
}
int getNumFrames() const { return nextFreeFrame; }
float getTotalTime() const { return getNumFrames()/fps; }
int getFrameNum( float playTime ) const
{
if( abs(playTime-getTotalTime()) < 1e-4 )
return nextFreeFrame-1;
unsigned num = (int)(playTime * fps) % nextFreeFrame;
return num;
}
const Frame& getFrame( float playTime ) const
{
//LOG("frame num = %d nframes = %d\n", getFrameNum(playTime), nextFreeFrame);
return frames[ getFrameNum(playTime) ];
}
private:
int nextFreeFrame;
};
class AnimPlayer
{
public:
const Animation* anim;
float playTime;
bool loop;
AnimPlayer() : anim(NULL),
playTime(0.0),
loop(true)
{
}
bool getIsDone()
{
if( loop )
return false;
else
{
return playTime >= anim->getTotalTime();
}
}
void restart() { playTime = 0.0; }
void update(float dt)
{
playTime += dt;
if( !loop && playTime > anim->getTotalTime() )
{
playTime == anim->getTotalTime();
}
}
void setAnim( const Animation* _anim, bool _loop )
{
playTime = 0.0;
anim = _anim;
loop = _loop;
}
void updateSprite( const SpriteRef& ref ) const
{
anim->updateSprite( ref, playTime );
}
const Frame& getCurrFrame() const
{
return anim->getFrame(playTime);
}
const PinnedAssetImage* getCurrAsset() const
{
return anim->frames[ anim->getFrameNum(playTime) ].asset;
}
};
#endif