diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/map.cpp | 94 | ||||
-rw-r--r-- | src/map.h | 14 | ||||
-rw-r--r-- | src/resources/ambientoverlay.cpp | 73 | ||||
-rw-r--r-- | src/resources/ambientoverlay.h | 51 | ||||
-rw-r--r-- | src/resources/mapreader.cpp | 38 |
6 files changed, 175 insertions, 97 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index d523422c..2315a7af 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -157,6 +157,8 @@ tmw_SOURCES = graphic/imagerect.h \ net/skillhandler.h \ net/tradehandler.cpp \ net/tradehandler.h \ + resources/ambientoverlay.cpp \ + resources/ambientoverlay.h \ resources/image.cpp \ resources/image.h \ resources/imagewriter.cpp \ diff --git a/src/map.cpp b/src/map.cpp index 6277b424..23dd4350 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -27,10 +27,12 @@ #include <queue> #include "beingmanager.h" +#include "game.h" #include "graphics.h" #include "sprite.h" #include "tileset.h" +#include "resources/ambientoverlay.h" #include "resources/image.h" #include "utils/dtor.h" @@ -79,11 +81,7 @@ Map::~Map() for_each(mTilesets.begin(), mTilesets.end(), make_dtor(mTilesets)); mTilesets.clear(); // clean up overlays - std::list<AmbientOverlay>::iterator i; - for (i = mOverlays.begin(); i != mOverlays.end(); i++) - { - (*i).image->decRef(); - } + for_each(mOverlays.begin(), mOverlays.end(), make_dtor(mOverlays)); } void @@ -182,14 +180,6 @@ Map::drawOverlay(Graphics *graphics, float scrollX, float scrollY, int detail) // detail 0: no overlays if (detail <= 0) return; - std::list<AmbientOverlay>::iterator i; - - // Avoid freaking out when tick_time overflows - if (tick_time < lastTick) - { - lastTick = tick_time; - } - if (mLastScrollX == 0.0f && mLastScrollY == 0.0f) { // first call - initialisation @@ -198,80 +188,38 @@ Map::drawOverlay(Graphics *graphics, float scrollX, float scrollY, int detail) } //update Overlays - while (lastTick < tick_time) - { - for (i = mOverlays.begin(); i != mOverlays.end(); i++) - { - if ((*i).image != NULL) - { - //apply self scrolling - (*i).scrollX -= (*i).scrollSpeedX; - (*i).scrollY -= (*i).scrollSpeedY; - - //apply parallaxing - (*i).scrollX += (scrollX - mLastScrollX) * (*i).parallax; - (*i).scrollY += (scrollY - mLastScrollY) * (*i).parallax; - - //keep the image pattern on the screen - while ((*i).scrollX > (*i).image->getWidth()) - { - (*i).scrollX -= (*i).image->getWidth(); - } - while ((*i).scrollY > (*i).image->getHeight()) - { - (*i).scrollY -= (*i).image->getHeight(); - } - while ((*i).scrollX < 0) - { - (*i).scrollX += (*i).image->getWidth(); - } - while ((*i).scrollY < 0) - { - (*i).scrollY += (*i).image->getHeight(); - } - } - } - mLastScrollX = scrollX; - mLastScrollY = scrollY; - lastTick++; + int timePassed = get_elapsed_time(lastTick); + float dx = scrollX - mLastScrollX; + float dy = scrollY - mLastScrollY; - // detail 1: only one overlay, higher: all overlays - if (detail == 1) break; + std::list<AmbientOverlay*>::iterator i; + for (i = mOverlays.begin(); i != mOverlays.end(); i++) + { + (*i)->update(timePassed, dx, dy); } + mLastScrollX = scrollX; + mLastScrollY = scrollY; + lastTick = tick_time; //draw overlays for (i = mOverlays.begin(); i != mOverlays.end(); i++) { - if ((*i).image != NULL) - { - graphics->drawImagePattern ( (*i).image, - 0 - (int)(*i).scrollX, - 0 - (int)(*i).scrollY, - graphics->getWidth() + (int)(*i).scrollX, - graphics->getHeight() + (int)(*i).scrollY - ); - }; + (*i)->draw(graphics, graphics->getWidth(), graphics->getHeight()); + // detail 1: only one overlay, higher: all overlays - if (detail == 1) break; + if (detail == 1) + break; }; } void Map::setOverlay(Image *image, float speedX, float speedY, float parallax) { - if (image != NULL) - { - AmbientOverlay newOverlay; + if (!image) + return; - newOverlay.image = image; - newOverlay.parallax = parallax; - newOverlay.scrollSpeedX = speedX; - newOverlay.scrollSpeedY = speedY; - newOverlay.scrollX = 0; - newOverlay.scrollY = 0; - - mOverlays.push_back(newOverlay); - } + mOverlays.push_back( + new AmbientOverlay(image, parallax, 0, 0, speedX, speedX)); } void @@ -29,6 +29,7 @@ #include "properties.h" +class AmbientOverlay; class Graphics; class Image; class Tileset; @@ -65,16 +66,6 @@ struct MetaTile bool walkable; /**< Can beings walk on this tile */ }; -struct AmbientOverlay -{ - Image *image; - float parallax; - float scrollX; - float scrollY; - float scrollSpeedX; - float scrollSpeedY; -}; - /** * A tile map. */ @@ -222,8 +213,7 @@ class Map : public Properties int mOnClosedList, mOnOpenList; //overlay Data - AmbientOverlay mFoo; - std::list<AmbientOverlay> mOverlays; + std::list<AmbientOverlay*> mOverlays; float mLastScrollX; float mLastScrollY; }; diff --git a/src/resources/ambientoverlay.cpp b/src/resources/ambientoverlay.cpp new file mode 100644 index 00000000..b5304627 --- /dev/null +++ b/src/resources/ambientoverlay.cpp @@ -0,0 +1,73 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World 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 + * any later version. + * + * The Mana World 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 The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "ambientoverlay.h" + +#include "image.h" + +#include "../graphics.h" + +AmbientOverlay::AmbientOverlay(Image *img, float parallax, + float scrollX, float scrollY, float speedX, float speedY): + mImage(img), mParallax(parallax), + mScrollX(scrollX), mScrollY(scrollY), + mSpeedX(speedX), mSpeedY(speedY) +{ + mImage->incRef(); +} + +AmbientOverlay::~AmbientOverlay() +{ + mImage->decRef(); +} + +void AmbientOverlay::update(int timePassed, float dx, float dy) +{ + // Self scrolling of the overlay + mScrollX -= mSpeedX * timePassed / 10; + mScrollY -= mSpeedY * timePassed / 10; + + // Parallax scrolling + mScrollX += dx * mParallax; + mScrollY += dy * mParallax; + + int imgW = mImage->getWidth(); + int imgH = mImage->getHeight(); + + // Wrap values + while (mScrollX > imgW) + mScrollX -= imgW; + while (mScrollX < 0) + mScrollX += imgW; + + while (mScrollY > imgH) + mScrollY -= imgH; + while (mScrollY < 0) + mScrollY += imgH; +} + +void AmbientOverlay::draw(Graphics *graphics, int x, int y) +{ + graphics->drawImagePattern(mImage, (int)(-mScrollX), (int)(-mScrollY), + x + (int)mScrollX, y + (int)mScrollY); +} diff --git a/src/resources/ambientoverlay.h b/src/resources/ambientoverlay.h new file mode 100644 index 00000000..25bc28ef --- /dev/null +++ b/src/resources/ambientoverlay.h @@ -0,0 +1,51 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World 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 + * any later version. + * + * The Mana World 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 The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_RESOURCES_AMBIENTOVERLAY_H_ +#define _TMW_RESOURCES_AMBIENTOVERLAY_H_ + +class Graphics; +class Image; + +class AmbientOverlay +{ + public: + AmbientOverlay(Image *img, float parallax, + float scrollX, float scrollY, float speedX, float speedY); + + ~AmbientOverlay(); + + void update(int timePassed, float dx, float dy); + + void draw(Graphics *graphics, int x, int y); + + private: + Image *mImage; + float mParallax; + float mScrollX; + float mScrollY; + float mSpeedX; + float mSpeedY; +}; + +#endif diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index c1ae911c..2377a8f4 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -24,6 +24,7 @@ #include "mapreader.h" #include <cassert> +#include <iostream> #include <zlib.h> #include "resourcemanager.h" @@ -215,29 +216,37 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) } //set Overlays - int i = 0; ResourceManager *resman = ResourceManager::getInstance(); - - while (map->hasProperty("overlay" + toString(i) + "image")) + for (int i = 0; ; i++) { - Image *overlayImage = resman->getImage(map->getProperty("overlay" + toString(i) + "image")); + const std::string name = "overlay" + toString(i); + + if (!map->hasProperty(name + "image")) + break; // Finished + + Image *img = resman->getImage(map->getProperty(name + "image")); float scrollX = 0.0f; float scrollY = 0.0f; float parallax = 0.0f; - if (map->hasProperty("overlay" + toString(i) + "scrollX")) + std::stringstream ss; + + if (map->hasProperty(name + "scrollX")) { - scrollX = atof(map->getProperty("overlay" + toString(i) + "scrollX").c_str()); + ss.str(map->getProperty(name + "scrollX")); + ss >> scrollX; } - if (map->hasProperty("overlay" + toString(i) + "scrollY")) + if (map->hasProperty(name + "scrollY")) { - scrollY = atof(map->getProperty("overlay" + toString(i) + "scrollY").c_str()); + ss.str(map->getProperty(name + "scrollY")); + ss >> scrollY; } - if (map->hasProperty("overlay" + toString(i) + "parallax")) + if (map->hasProperty(name + "parallax")) { - parallax = atof(map->getProperty("overlay" + toString(i) + "parallax").c_str()); + ss.str(map->getProperty(name + "parallax")); + ss >> parallax; } - map->setOverlay (overlayImage, scrollX, scrollY, parallax); - i++; + map->setOverlay(img, scrollX, scrollY, parallax); + img->decRef(); } return map; @@ -351,6 +360,11 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) } } + if (y < h) + std::cerr << "TOO SMALL!\n"; + if (x) + std::cerr << "TOO SMALL!\n"; + // There can be only one data element break; } |