00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "Flame.h"
00015
00016 using namespace Game;
00017
00018 FlameImageManager* FlameImageManager::instance = NULL;
00019
00020 Flame::Flame() :
00021 maxSparkDuration(0),
00022 sparkList()
00023 {
00024
00025 }
00026
00027 Flame::~Flame() {
00028 Util::freeDynamicContainer(sparkList);
00029 }
00030
00031 bool Flame::isOnFire() {
00032 return maxSparkDuration > 0;
00033 }
00034
00035 void Flame::drawAt(SDL_Surface* surf, SDL_Rect* loc) {
00036 if (maxSparkDuration > 0) {
00037
00038 maxSparkDuration--;
00039 for (std::list<Spark*>::iterator i = sparkList.begin(); i != sparkList.end(); i++) {
00040 FlameImageManager::getInstance()->getImage((*i)->spark)->drawAt(surf, loc);
00041 (*i)->duration--;
00042 if ((*i)->duration <= 0) {
00043 delete *i;
00044 if (Util::safeIteratorRemove<Spark*>(sparkList, i) == Util::LIST_END) break;
00045 }
00046 }
00047 }
00048 }
00049
00050 void Flame::addSpark(FlameType spark, int duration) {
00051 if (duration > maxSparkDuration) {
00052 maxSparkDuration = duration;
00053 }
00054 sparkList.push_back(new Spark(spark, duration));
00055 }
00056
00057 Flame::Spark::Spark(FlameType f, int dur) :
00058 spark(f),
00059 duration(dur)
00060 { }
00061
00062 FlameImageManager::FlameImageManager() {
00063 typedef Graphics::SingleFrameImage SFI;
00064 flames.resize(7);
00065
00066
00067 flames[FLAME_HORIZ_CONNECTOR] = new SFI("GameData/Flame/uglyHorizFlameConnector.bmp");
00068 flames[FLAME_VERT_CONNECTOR] = new SFI("GameData/Flame/uglyVertFlameConnector.bmp");
00069 flames[FLAME_MIDDLE_CONNECTOR] = new SFI("GameData/Flame/uglyMiddleFlameConnector.bmp");
00070 flames[FLAME_LEFT_END] = new SFI("GameData/Flame/uglyHorizFlameLeftEnd.bmp");
00071 flames[FLAME_RIGHT_END] = new SFI("GameData/Flame/uglyHorizFlameRightEnd.bmp");
00072 flames[FLAME_DOWN_END] = new SFI("GameData/Flame/uglyVertFlameDownEnd.bmp");
00073 flames[FLAME_UP_END] = new SFI("GameData/Flame/uglyVertFlameUpEnd.bmp");
00074
00075 for (size_t j = 0; j < 7; j++) {
00076
00077 flames[j]->setTransparency(SDL_SRCCOLORKEY);
00078 }
00079 }
00080
00081 Graphics::DrawableAt* FlameImageManager::getImage(FlameType t) {
00082 return flames[t];
00083 }
00084
00085 FlameImageManager::~FlameImageManager() {
00086 Util::freeDynamicContainer(flames);
00087 }
00088
00089 FlameImageManager* FlameImageManager::getInstance() {
00090 if (instance == NULL) {
00091 instance = new FlameImageManager();
00092 }
00093 return instance;
00094 }
00095
00096 void FlameImageManager::destroy() {
00097 delete instance;
00098 instance = NULL;
00099 }