Hosting courtesy of Sourceforge

SourceForge Logo
Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

Tile.cpp

Go to the documentation of this file.
00001 //
00002 //      Copyright (C) 2002 Robert Renaud
00003 //
00004 //      This program is free software; you can redistribute it and/or
00005 //      modify it under the terms of the GNU General Public License
00006 //      as published by the Free Software Foundation; either version 2
00007 //      of the License, or (at your option) any later version.
00008 //
00009 //      This program is distributed in the hope that it will be useful,
00010 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 //
00013 //      See the GNU General Public License for more details.
00014 //
00015 //      You should have received a copy of the GNU General Public License
00016 //      along with this program; if not, write to the Free Software
00017 //      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018 //
00019 
00020 #include "Tile.h"
00021 #include "../Util/STL_Helper.h"
00022 
00023 using namespace Game;
00024 
00025 MovementEffect::MovementEffect(Sint16 x_, Sint16 y_, bool relMotion) :
00026 x(x_),
00027 y(y_),
00028 motionIsRelative(relMotion)
00029 { }
00030 
00031 Sint16 MovementEffect::getXchange() const {
00032         return x;
00033 }
00034 
00035 Sint16 MovementEffect::getYchange() const {
00036         return y;
00037 }
00038 
00039 bool MovementEffect::isRelative() const{
00040         return motionIsRelative;
00041 }
00042 
00043 SingleImageTile::SingleImageTile() :
00044 img(NULL)
00045 {}
00046 
00047 SingleImageTile::SingleImageTile(Graphics::AbstractImage * image) {
00048         setImage(image);
00049 }
00050 
00051 SingleImageTile::~SingleImageTile() {
00052         delete img;
00053         img = NULL;
00054 }
00055 
00056 void SingleImageTile::drawAt(SDL_Surface * screen, SDL_Rect *loc) {
00057         img->drawAt(screen,loc);
00058 }
00059 
00060 AbstractTile::AbstractTile() :
00061 currentlyOccupied(false)
00062 { }
00063 
00064 AbstractTile::~AbstractTile() { }
00065 
00066 void AbstractTile::deOccupy() {
00067         currentlyOccupied = false;
00068 }
00069 
00070 void AbstractTile::occupy() {
00071         currentlyOccupied = true;
00072 }
00073 
00074 bool AbstractTile::isOccupied() const {
00075         return currentlyOccupied;
00076 }
00077 
00078 AbstractTile* IndestructibleTile::dynCopy() const {
00079         IndestructibleTile* newTile = new IndestructibleTile;
00080         newTile->img=img->dynCopyImage();
00081 
00082         return newTile;
00083 }
00084 
00085 AbstractTile* PassableTile::dynCopy() const {
00086         PassableTile* newTile = new PassableTile;
00087         newTile->img=img->dynCopyImage();
00088         return newTile;
00089 }
00090         
00091 Parse::Parser* SingleImageTile::makeParserToParseMe(std::istream &input) {
00092         Parse::SimpleParser* parser = new Parse::SimpleParser(input);
00093         parser->addAction("image", new Graphics::ReadImage(img));
00094         return parser;
00095 }
00096 
00097 void SingleImageTile::setImage(Graphics::AbstractImage *image) {
00098         delete img;
00099         img = image;
00100 }
00101 
00102 bool IndestructibleTile::isPassable() const{
00103         return false; // by definition
00104 }
00105 
00106 bool PassableTile::isPassable() const{
00107         if (isOccupied()) return false;
00108         return true; 
00109 }
00110 
00111 ExplodableTile::ExplodableTile() :
00112 hasExploded(false),
00113 bombedImage(NULL),
00114 unbombedImage(NULL)
00115 {}
00116 
00117 AbstractTile* ExplodableTile::dynCopy() const {
00118         ExplodableTile* newTile = new ExplodableTile;
00119         newTile->bombedImage = bombedImage->dynCopyImage();
00120         newTile->unbombedImage = unbombedImage->dynCopyImage();
00121         return newTile;
00122 }
00123 
00124 void ExplodableTile::drawAt(SDL_Surface *screen, SDL_Rect *loc) {
00125         if (hasExploded) bombedImage->drawAt(screen, loc);
00126         else                     unbombedImage->drawAt(screen,loc);
00127 }
00128 
00129 Parse::Parser* ExplodableTile::makeParserToParseMe(std::istream &input) {
00130         Parse::SimpleParser* parser = new Parse::SimpleParser(input);
00131         parser->addAction("BombedImage",        new Graphics::ReadImage(bombedImage));
00132         parser->addAction("UnbombedImage",      new Graphics::ReadImage(unbombedImage));
00133         return parser;
00134 }
00135 
00136 bool ExplodableTile::isPassable() const {
00137         if (isOccupied()) return false;
00138         return hasExploded; // it is passable if its been bombed
00139 }
00140 
00141 void ExplodableTile::hitWithExplosion() {
00142         hasExploded = true;
00143         // cout << "ExplodableTile::hitWithExplosion()" << endl;
00144 }
00145 
00146 ExplodableTile::~ExplodableTile() {
00147         delete unbombedImage;
00148         delete bombedImage;
00149 }
00150 
00151 ConveyorTile::ConveyorTile() :
00152 img(NULL),
00153 xSpeed(0),
00154 ySpeed(0)
00155 { }
00156 
00157 ConveyorTile::~ConveyorTile() {
00158         delete img;
00159 }
00160 
00161 bool ConveyorTile::isPassable() const {
00162         return (!isOccupied());
00163 }
00164 
00165 MovementEffect ConveyorTile::effect(MoveableItem& m) {
00166         return MovementEffect(xSpeed, ySpeed, true);
00167 }
00168 
00169 void ConveyorTile::drawAt(SDL_Surface* surf, SDL_Rect* loc) {
00170         img->drawAt(surf, loc);
00171 }
00172 
00173 AbstractTile* ConveyorTile::dynCopy() const {
00174         ConveyorTile* tile = new ConveyorTile(*this);
00175         tile->img = img->dynCopyImage();
00176         return tile;
00177 }
00178 
00179 Parse::Parser* ConveyorTile::makeParserToParseMe(std::istream& in) {
00180         Parse::Parser* parser = new Parse::SimpleParser(in);
00181         
00182         parser->addAction("image", new Graphics::ReadImage(img));
00183         parser->addAction("xspeed", new Parse::StdRead<Sint16>(xSpeed));
00184         parser->addAction("yspeed", new Parse::StdRead<Sint16>(ySpeed));
00185         
00186         return parser;
00187 }
00188         
00189 SlipperyTile::SlipperyTile() :
00190 front(NULL),
00191 back(NULL)
00192 { }
00193 
00194 SlipperyTile::~SlipperyTile() {
00195         delete front;
00196         delete back;
00197 }
00198 
00199 Parse::Parser* SlipperyTile::makeParserToParseMe(std::istream& in) {
00200         Parse::SimpleParser* p= new Parse::SimpleParser(in);
00201         p->addAction("front", new Graphics::ReadImage(front));
00202         p->addAction("back", new Graphics::ReadImage(back));
00203         return p;
00204 }
00205 
00206 void SlipperyTile::drawAt(SDL_Surface* surf,  SDL_Rect* loc) {
00207         if (back != NULL) back->drawAt(surf, loc);
00208         front->drawAt(surf, loc);
00209 }
00210 
00211 MovementEffect SlipperyTile::effect(MoveableItem& m) {
00212         if (m.getDirection() != Game::NO_DIRECTION) m.lockMovement();
00213         return MovementEffect(0,0);
00214 }
00215 
00216 bool SlipperyTile::isPassable() const {
00217         return !isOccupied();
00218 }
00219 
00220 AbstractTile* SlipperyTile::dynCopy() const {
00221         SlipperyTile* n = new SlipperyTile();
00222         n->front = front->dynCopyImage();
00223         n->back = back->dynCopyImage();
00224         return n;
00225 }
00226 
00227 TileSetReader::TileSetReader()
00228 // :
00229 //tileVec(0,NULL)
00230  { }
00231 
00232 TileSetReader::~TileSetReader() {
00233         Util::freeDynamicContainer(tileVec);
00234 }
00235 
00236 int TileSetReader::numTiles() const {
00237     return (int) tileVec.size();
00238 }
00239 
00240 MovementEffect AbstractTile::effect(MoveableItem& item) {
00241         item.unlockMovement();
00242         return MovementEffect(0,0, false);
00243 }
00244 
00245 Game::AbstractTile* TileSetReader::copyTile(int index) const {
00246         validateIndex(index);
00247         return tileVec[index]->dynCopy();
00248 }
00249 
00250 Game::AbstractTile* TileSetReader::getTile(int index) {
00251         validateIndex(index);
00252         return tileVec[index];
00253 }
00254 
00255 void TileSetReader::validateIndex(int index) const {
00256     if ((index >= (int) tileVec.size() || index < 0)) {
00257                 throw Util::GeneralException("Tile index " + Util::toString(index) + " out of range ", __FILE__, __LINE__);
00258         } else if (tileVec[index] == NULL) {
00259                 throw Util::GeneralException("Tile index " + Util::toString(index)
00260                  + " has no actual corresponding tile ", __FILE__, __LINE__);
00261         }
00262 }
00263 
00264 Parse::Parser* TileSetReader::makeParserToParseMe(std::istream& in) {
00265         Parse::SimpleParser *parser = new Parse::SimpleParser(in);
00266 
00267         parser->addAction("BombableTile",
00268                 new Parse::NaturalVectorParser<AbstractTile, ExplodableTile>(tileVec));
00269         parser->addAction("Conveyor",
00270                 new Parse::NaturalVectorParser<AbstractTile, ConveyorTile>(tileVec));
00271         parser->addAction("PassableTile",
00272                 new Parse::NaturalVectorParser<AbstractTile, PassableTile>(tileVec));
00273         parser->addAction("SlipperyTile",
00274                 new Parse::NaturalVectorParser<AbstractTile, SlipperyTile>(tileVec));
00275         parser->addAction("UnbombableTile",
00276                 new Parse::NaturalVectorParser<AbstractTile, IndestructibleTile>(tileVec));     
00277 
00278         return parser;
00279 }
00280 

Generated on Tue May 21 07:26:51 2002 for BomberLAN by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001