X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.h;h=c2a7154a887bfe311047cff41687c11958f6d970;hb=599adb53dbdfdcc4ac4e4dfab1e0868ff0412110;hp=d8317936c9a1c98e6b2c62f656d37d6d14e64d1b;hpb=2cea58600cea4838a6f7ba00f66f9ede187eba39;p=supertux.git diff --git a/src/worldmap.h b/src/worldmap.h index d8317936c..c2a7154a8 100644 --- a/src/worldmap.h +++ b/src/worldmap.h @@ -17,41 +17,42 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef HEADER_WORLDMAP_HXX -#define HEADER_WORLDMAP_HXX +#ifndef SUPERTUX_WORLDMAP_H +#define SUPERTUX_WORLDMAP_H #include #include +#include "musicref.h" + namespace WorldMapNS { struct Point { Point() : x(0), y(0) {} - Point(int x_, int y_) - : x(x_), y(y_) {} + Point(const Point& pos) + : x(pos.x), y(pos.y) {} - int x; - int y; -}; + Point& operator=(const Point& pos) + { x = pos.x; + y = pos.y; + return *this; } -struct Pointf -{ - float x; - float y; -}; + Point(int x_, int y_) + : x(x_), y(y_) {} -struct Level -{ int x; int y; - std::string name; }; -struct Tile +class Tile { - texture_type sprite; +public: + Tile(); + ~Tile(); + + Surface* sprite; // Directions in which Tux is allowed to walk from this tile bool north; @@ -61,6 +62,10 @@ struct Tile /** Stop on this tile or walk over it? */ bool stop; + + /** When set automatically turn directions when walked over such a + tile (ie. walk smoothly a curve) */ + bool auto_walk; }; class TileManager @@ -68,24 +73,68 @@ class TileManager private: typedef std::vector Tiles; Tiles tiles; - static TileManager* instance_ ; - TileManager(); public: - static TileManager* instance() { return instance_ ? instance_ : instance_ = new TileManager(); } + TileManager(); + ~TileManager(); - void load(); Tile* get(int i); }; +enum Direction { NONE, WEST, EAST, NORTH, SOUTH }; + +std::string direction_to_string(Direction d); +Direction string_to_direction(const std::string& d); +Direction reverse_dir(Direction d); + +class WorldMap; + +class Tux +{ +public: + Direction back_direction; +private: + WorldMap* worldmap; + Surface* largetux_sprite; + Surface* firetux_sprite; + Surface* smalltux_sprite; + + Direction input_direction; + Direction direction; + Point tile_pos; + /** Length by which tux is away from its current tile, length is in + input_direction direction */ + float offset; + bool moving; + + void stop(); +public: + Tux(WorldMap* worldmap_); + ~Tux(); + + void draw(const Point& offset); + void update(float delta); + + void set_direction(Direction d) { input_direction = d; } + + bool is_moving() const { return moving; } + Point get_pos(); + Point get_tile_pos() const { return tile_pos; } + void set_tile_pos(Point p) { tile_pos = p; } +}; + /** */ class WorldMap { private: - texture_type tux_sprite; - texture_type level_sprite; + Tux* tux; + bool quit; + Surface* level_sprite; + Surface* leveldot_green; + Surface* leveldot_red; + std::string name; std::string music; @@ -93,23 +142,39 @@ private: int width; int height; + TileManager* tile_manager; + +public: + struct Level + { + int x; + int y; + std::string name; + std::string title; + bool solved; + + // Directions which are walkable from this level + bool north; + bool east; + bool south; + bool west; + }; + +private: typedef std::vector Levels; Levels levels; - Mix_Music* song; - - enum Direction { NONE, WEST, EAST, NORTH, SOUTH }; - Direction tux_direction; - Point tux_tile_pos; - /** Length by which tux is away from its current tile, length is in - input_direction direction */ - float tux_offset; - bool tux_moving; + MusicRef song; Direction input_direction; bool enter_level; - Tile* at(Point pos); + Point offset; + std::string savegame_file; + + void get_level_title(Levels::pointer level); + + void draw_status(); public: WorldMap(); ~WorldMap(); @@ -125,15 +190,26 @@ public: void update(); /** Draw one frame */ - void draw(); + void draw(const Point& offset); + + Point get_next_tile(Point pos, Direction direction); + Tile* at(Point pos); + WorldMap::Level* at_level(); + + /** Check if it is possible to walk from \a pos into \a direction, + if possible, write the new position to \a new_pos */ + bool path_ok(Direction direction, Point pos, Point* new_pos); + + void savegame(const std::string& filename); + void loadgame(const std::string& filename); +private: + void on_escape_press(); }; } // namespace WorldMapNS -void worldmap_run(); - #endif /* Local Variables: */ /* mode:c++ */ -/* End */ +/* End: */