X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ftile.h;h=a5f5856fc19943c3d943f326794e8f95d737829a;hb=0df5885ece3a2a64bffc73c536296ad47ce1a1d6;hp=40feb806db92cd1c14e8b811b24a0a12929e1bf8;hpb=8fa514bf18494f19ca1fbae3512354f0fab22bce;p=supertux.git diff --git a/src/tile.h b/src/tile.h index 40feb806d..a5f5856fc 100644 --- a/src/tile.h +++ b/src/tile.h @@ -1,98 +1,142 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2004 Tobias Glaesser // -// C++ Interface: tile -// -// Description: -// -// -// Author: Tobias Glaesser , (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution -// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. // +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. #ifndef TILE_H #define TILE_H -#include #include -#include "texture.h" -#include "globals.h" -#include "lispreader.h" -#include "setup.h" +#include "video/surface.h" +#include "math/rectangle.h" +#include "lisp/lisp.h" + +using namespace SuperTux; /** Tile Class */ -struct Tile +class Tile { - int id; +public: + /// bitset for tile attributes + enum { + /** solid tile that is indestructable by Tux */ + SOLID = 0x0001, + /** uni-directional solid tile */ + UNISOLID = 0x0002, + /** a brick that can be destroyed by jumping under it */ + BRICK = 0x0004, + /** an ice brick that makes tux sliding more than usual */ + ICE = 0x0008, + /** a water tile in which tux starts to swim */ + WATER = 0x0010, + /** a tile that hurts the player if he touches it */ + SPIKE = 0x0020, + /** Bonusbox, content is stored in \a data */ + FULLBOX = 0x0040, + /** Tile is a coin */ + COIN = 0x0080, + /** the level should be finished when touching a goaltile. + * if data is 0 then the endsequence should be triggered, if data is 1 + * then we can finish the level instantly. + */ + GOAL = 0x0100, + /** slope tile */ + SLOPE = 0x0200, + }; - std::vector images; - std::vector editor_images; + /// worldmap flags + enum { + WORLDMAP_NORTH = 0x0001, + WORLDMAP_SOUTH = 0x0002, + WORLDMAP_EAST = 0x0004, + WORLDMAP_WEST = 0x0008, + + WORLDMAP_STOP = 0x0010 + }; - std::vector filenames; +private: + unsigned int id; - /** solid tile that is indestructable by Tux */ - bool solid; + struct ImageSpec { + ImageSpec(const std::string& newfile, const Rectangle& newrect) + : file(newfile), rect(newrect) + { } - /** a brick that can be destroyed by jumping under it */ - bool brick; + std::string file; + Rectangle rect; + }; + std::vector imagespecs; + std::vector images; - /** FIXME: ? */ - bool ice; + std::string editor_imagefile; + Surface* editor_image; + + /** tile attributes */ + Uint32 attributes; + + /** General purpose data attached to a tile (content of a box, type of coin)*/ + int data; - /** water */ - bool water; + float anim_fps; - /** Bonusbox, content is stored in \a data */ - bool fullbox; +public: + ~Tile(); + + /** Draw a tile on the screen */ + void draw(DrawingContext& context, const Vector& pos, int layer) const; - /** Tile is a distro/coin */ - bool distro; + Surface* get_editor_image() const; - /** General purpose data attached to a tile (content of a box, type of coin) */ - int data; + unsigned int getID() const + { return id; } - /** Id of the tile that is going to replace this tile once it has - been collected or jumped at */ - int next_tile; + Uint32 getAttributes() const + { return attributes; } - int anim_speed; - - /** Draw a tile on the screen: */ - static void draw(float x, float y, unsigned int c, Uint8 alpha = 255); -}; + int getData() const + { return data; } -struct TileGroup -{ - std::string name; - std::vector tiles; -}; + /// returns the width of the tile in pixels + int getWidth() const + { + if(!images.size()) + return 0; + return images[0]->w; + } -class TileManager -{ - private: - TileManager(); - std::vector tiles; - static TileManager* instance_ ; - static std::vector* tilegroups_; - void load_tileset(std::string filename); - - public: - static TileManager* instance() { return instance_ ? instance_ : instance_ = new TileManager(); } - static std::vector* tilegroups() { return tilegroups_ ? tilegroups_ : tilegroups_ = new std::vector; } - Tile* get(unsigned int id) { - if(id < tiles.size()) - { - return tiles[id]; - } - else - { - // Never return 0, but return the 0th tile instead so that - // user code doesn't have to check for NULL pointers all over - // the place - return tiles[0]; - } + /// returns the height of the tiles in pixels + int getHeight() const + { + if(!images.size()) + return 0; + return images[0]->h; } + +protected: + friend class TileManager; + Tile(); + + void load_images(const std::string& tilesetpath); + + /// parses the tile and returns it's id number + void parse(const lisp::Lisp& reader); + void parse_images(const lisp::Lisp& cur); }; #endif