00001 #include "glfuncs.h"
00002 #include "Screen.h"
00003 #include "Sprite.h"
00004 #include "Parser.h"
00005 #include "AnimatedSprite.h"
00006 #include "ShowOneSprite.h"
00007
00008 using namespace std;
00009
00010 map<string,Sprite *> Sprite::SPRITES;
00011
00012 Sprite* Sprite::instance()
00013 {
00014 return this;
00015 }
00016
00017 Sprite::Sprite(std::string filename)
00018 :_filename(filename),_direction(LEFT)
00019 {
00020 _hTexture = glfuncs::instance()->loadTexture(_filename,_coords,_rect);
00021
00022
00023
00024
00025
00026
00027
00028
00029 }
00030
00031 Sprite::Sprite(std::string filename, int width, int height)
00032 :_filename(filename)
00033 {
00034 _hTexture = glfuncs::instance()->loadTexture(_filename,_coords,_rect);
00035 _rect.w = width;
00036 _rect.h = height;
00037 }
00038
00039 Sprite::Sprite(Sprite *sprite)
00040 {
00041 _filename = sprite->_filename;
00042 _rect = sprite->_rect;
00043 _direction = _direction;
00044 }
00045
00046 void Sprite::draw(int x, int y, bool origin)
00047 {
00048 _rect.x+=x;
00049 _rect.y+=y;
00050 if(_direction == RIGHT) {
00051 double temp = _coords[0];
00052 _coords[0] = _coords[2];
00053 _coords[2] = temp;
00054 }
00055
00056 if(origin == LEVEL)
00057 Screen::instance()->drawLevel(_hTexture,_coords,_rect);
00058 else if(origin == SCREEN)
00059 Screen::instance()->drawScreen(_hTexture,_coords,_rect);
00060
00061 if(_direction == RIGHT) {
00062 double temp = _coords[0];
00063 _coords[0] = _coords[2];
00064 _coords[2] = temp;
00065 }
00066 _rect.x-=x;
00067 _rect.y-=y;
00068 }
00069
00070 Sprite* Sprite::loadSprite( std::string filename )
00071 {
00072 if(SPRITES.find(filename) != SPRITES.end()) {
00073
00074 return SPRITES[filename]->instance();
00075 }
00076
00077 string ext = filename.substr(filename.size() - 3,3);
00078 if( ext == "png" )
00079 {
00080 Sprite *sprite = new Sprite( filename );
00081 SPRITES[filename] = sprite;
00082 return sprite;
00083 }
00084 else if ( ext == "txt" )
00085 {
00086 Sprite *sprite = Sprite::loadText( filename );
00087 SPRITES[filename] = sprite;
00088 return sprite;
00089 }
00090
00091 cerr << "Invalid sprite extension" << endl;
00092 return NULL;
00093 }
00094
00095 Sprite* Sprite::loadText( std::string filename )
00096 {
00097 List *spriteInfo = Parser::parse(filename);
00098
00099 if(spriteInfo->firstString() == "animated") {
00100 Sprite *newSprite = new AnimatedSprite(filename, spriteInfo->rest());
00101 delete spriteInfo;
00102 return newSprite;
00103 }
00104 else if(spriteInfo->firstString() == "showone") {
00105 Sprite *newSprite = new ShowOneSprite(filename, spriteInfo->rest());
00106 delete spriteInfo;
00107 return newSprite;
00108 }
00109 else {
00110 cerr << "Sprite type " << spriteInfo->firstString() << " unknown." << endl;
00111 delete spriteInfo;
00112 return NULL;
00113 }
00114 }