00001 #include "Animatedsprite.h"
00002 #include "Screen.h"
00003
00004 using namespace std;
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 AnimatedSprite::AnimatedSprite( std::string filename, List *spriteInfo )
00018 :_time(0),_index(0),_loop(false),_totalTime(0)
00019 {
00020 _filename = filename;
00021
00022 while(!spriteInfo->empty()) {
00023 List *nextSprite = spriteInfo->firstList();
00024
00025 if(nextSprite->firstString() == "sprite") {
00026 List *spriteParams = nextSprite->rest();
00027 SpriteTime spriteTime;
00028
00029 while(!spriteParams->empty()) {
00030 if(spriteParams->firstList()->firstString() == "filename") {
00031 spriteTime.s = Sprite::loadSprite(spriteParams->firstList()->rest()->firstString());
00032 }
00033 else if(spriteParams->firstList()->firstString() == "time") {
00034 spriteTime.time = _totalTime;
00035 _totalTime += atoi( spriteParams->firstList()->rest()->firstString().c_str() );
00036 }
00037 spriteParams = spriteParams->rest();
00038 }
00039
00040 _sprites.push_back(spriteTime);
00041 }
00042 else if(nextSprite->firstString() == "loop")
00043 _loop = true;
00044
00045 spriteInfo = spriteInfo->rest();
00046 }
00047
00048 if(_sprites.size() > 0) {
00049 _rect = _sprites[0].s->rect();
00050 for(size_t i = 1; i < _sprites.size(); i++) {
00051 if(_sprites[i].s->rect().h != _rect.h || _sprites[i].s->rect().w != _rect.w) {
00052 cerr << "Animated sprite not of consistent size: " << _sprites[i].s->filename()
00053 << " conflicts in " << _filename << endl;
00054 }
00055 }
00056 }
00057 else {
00058 cerr << "Malformed animated sprites file: " << _filename << endl;
00059 }
00060 }
00061
00062 AnimatedSprite::AnimatedSprite(AnimatedSprite *sprite)
00063 :Sprite(sprite),_index(0),_time(0)
00064 {
00065 _sprites = sprite->_sprites;
00066 _totalTime = sprite->_totalTime;
00067 _loop = sprite->_loop;
00068 }
00069
00070 AnimatedSprite::~AnimatedSprite()
00071 {
00072 for(size_t i = 0; i < _createdSprites.size(); i++)
00073 delete _createdSprites[i];
00074 }
00075
00076 void AnimatedSprite::update()
00077 {
00078 if(_time > _totalTime)
00079 return;
00080
00081 _time++;
00082
00083 if(_loop)
00084 _time %= _totalTime;
00085
00086 _index = _sprites.size() - 1;
00087 for(size_t i = 0; i < _sprites.size(); i++) {
00088 if(_time < _sprites[i].time) {
00089 _index = i-1;
00090 break;
00091 }
00092 }
00093 }
00094
00095 void AnimatedSprite::draw(int x, int y, bool origin)
00096 {
00097 _sprites[_index].s->draw(x,y, origin);
00098 }
00099
00100 Sprite *AnimatedSprite::instance()
00101 {
00102 Sprite *animatedSprite = new AnimatedSprite(this);
00103 _createdSprites.push_back(animatedSprite);
00104 return animatedSprite;
00105 }