summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/map.cpp94
-rw-r--r--src/map.h14
-rw-r--r--src/resources/ambientoverlay.cpp73
-rw-r--r--src/resources/ambientoverlay.h51
-rw-r--r--src/resources/mapreader.cpp38
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
diff --git a/src/map.h b/src/map.h
index 317a0b59..18381d71 100644
--- a/src/map.h
+++ b/src/map.h
@@ -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;
}