00001 #include "ShowOneSprite.h" 00002 00003 using namespace std; 00004 00005 ShowOneSprite::ShowOneSprite( std::string filename, List *spriteInfo ) 00006 :_index(0) 00007 { 00008 _filename = filename; 00009 00010 while(!spriteInfo->empty()) { 00011 List *nextSprite = spriteInfo->firstList(); 00012 00013 if(nextSprite->firstString() == "sprite") { 00014 List *spriteParams = nextSprite->rest(); 00015 Sprite *sprite; 00016 00017 while(!spriteParams->empty()) { 00018 if(spriteParams->firstList()->firstString() == "filename") { 00019 sprite = Sprite::loadSprite(spriteParams->firstList()->rest()->firstString()); 00020 } 00021 spriteParams = spriteParams->rest(); 00022 } 00023 00024 _sprites.push_back(sprite); 00025 } 00026 00027 spriteInfo = spriteInfo->rest(); 00028 } 00029 00030 if(_sprites.size() > 0) { 00031 _rect = _sprites[0]->rect(); 00032 for(size_t i = 1; i < _sprites.size(); i++) { 00033 if(_sprites[i]->rect().h != _rect.h || _sprites[i]->rect().w != _rect.w) { 00034 cerr << "Showone sprite not of consistent size: " << _sprites[i]->filename() 00035 << " conflicts in " << _filename << endl; 00036 } 00037 } 00038 } 00039 else { 00040 cerr << "Malformed showone sprite file: " << _filename << endl; 00041 } 00042 } 00043 00044 ShowOneSprite::~ShowOneSprite() 00045 { 00046 for(size_t i = 0; i < _createdSprites.size(); i++) 00047 delete _createdSprites[i]; 00048 } 00049 00050 ShowOneSprite::ShowOneSprite(ShowOneSprite *sprite) 00051 :Sprite(sprite),_index(0) 00052 { 00053 _sprites = sprite->_sprites; 00054 } 00055 00056 void ShowOneSprite::draw(int x, int y, bool origin) 00057 { 00058 xDirection tempDir = _sprites[_index]->getDirection(); 00059 SDL_Rect tempRect = _sprites[ _index ]->rect(); 00060 _sprites[_index]->setDirection(_direction); 00061 _sprites[_index]->setRect( _rect ); 00062 _sprites[_index]->draw(x, y, origin); 00063 _sprites[_index]->setDirection(tempDir); 00064 _sprites[_index]->setRect( tempRect ); 00065 } 00066 00067 Sprite *ShowOneSprite::instance() 00068 { 00069 Sprite *sprite = new ShowOneSprite(this); 00070 _createdSprites.push_back(sprite); 00071 return sprite; 00072 } 00073 00074 void ShowOneSprite::reset() 00075 { 00076 for(size_t i = 0; i < _sprites.size(); i++) 00077 _sprites[i]->reset(); 00078 }