summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2007-11-20 12:27:56 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2007-11-20 12:27:56 +0000
commitca58ec1faedca0081ecd233f2cefa1ba783cebf4 (patch)
tree11216c01bb8867a9bd4ad6d4b8bdefc3c61a952a
parent5a7abdafdac8f6ddd7972cadbc7e20563a0a29fc (diff)
downloadmana-client-ca58ec1faedca0081ecd233f2cefa1ba783cebf4.tar.gz
mana-client-ca58ec1faedca0081ecd233f2cefa1ba783cebf4.tar.bz2
mana-client-ca58ec1faedca0081ecd233f2cefa1ba783cebf4.tar.xz
mana-client-ca58ec1faedca0081ecd233f2cefa1ba783cebf4.zip
Merged revisions 3642,3662-3664,3667 via svnmerge from
https://themanaworld.svn.sourceforge.net/svnroot/themanaworld/tmw/trunk ........ r3642 | gmelquio | 2007-10-19 19:46:46 +0200 (Fri, 19 Oct 2007) | 1 line Factored code between resource handlers. Implemented failure-friendly sprite loader. ........ r3662 | gmelquio | 2007-10-21 21:01:16 +0200 (Sun, 21 Oct 2007) | 1 line Added persistent positioning. ........ r3663 | gmelquio | 2007-10-21 21:03:43 +0200 (Sun, 21 Oct 2007) | 1 line Fixed missing pixels at bottom and right. ........ r3664 | gmelquio | 2007-10-21 21:05:56 +0200 (Sun, 21 Oct 2007) | 1 line Changed to use default values when restoring missing settings. ........ r3667 | gmelquio | 2007-10-21 22:09:08 +0200 (Sun, 21 Oct 2007) | 1 line Fixed invisible text in dropboxes and shopboxes. ........
-rw-r--r--ChangeLog20
-rw-r--r--src/gui/listbox.cpp1
-rw-r--r--src/gui/menuwindow.cpp9
-rw-r--r--src/gui/ministatus.cpp1
-rw-r--r--src/gui/shoplistbox.cpp1
-rw-r--r--src/gui/trade.cpp2
-rw-r--r--src/gui/window.cpp15
-rw-r--r--src/gui/window.h7
-rw-r--r--src/resources/image.cpp35
-rw-r--r--src/resources/image.h12
-rw-r--r--src/resources/imageloader.cpp2
-rw-r--r--src/resources/imageset.cpp5
-rw-r--r--src/resources/imageset.h2
-rw-r--r--src/resources/music.cpp23
-rw-r--r--src/resources/music.h8
-rw-r--r--src/resources/resource.cpp6
-rw-r--r--src/resources/resource.h2
-rw-r--r--src/resources/resourcemanager.cpp144
-rw-r--r--src/resources/resourcemanager.h34
-rw-r--r--src/resources/soundeffect.cpp14
-rw-r--r--src/resources/soundeffect.h6
-rw-r--r--src/resources/spritedef.cpp47
-rw-r--r--src/resources/spritedef.h27
-rw-r--r--src/tileset.h2
24 files changed, 196 insertions, 229 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c480370..9510b750 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -85,11 +85,31 @@
* src/resources/monsterdb.cpp: Plugged memory leak in database reader.
* src/engine.cpp, src/engine.h, src/game.cpp: Fixed current map not
deleted on server change.
+ * src/gui/trade.cpp: Added persistent positioning.
+ * src/gui/menuwindow.cpp: Fixed missing pixels at bottom and right.
+ * src/gui/window.cpp, src/gui/window.h: Changed to use default values
+ when restoring missing settings.
+ * src/gui/shoplistbox.cpp, src/gui/listbox.cpp: Fixed invisible text.
2007-10-20 Guillaume Melquiond <guillaume.melquiond@gmail.com>
* src/gui/playerbox.cpp: Centered sprite inside selection box.
+2007-10-19 Guillaume Melquiond <guillaume.melquiond@gmail.com>
+
+ * src/resources/resource.cpp, src/resources/resource.h,
+ src/resources/imageset.cpp, src/resources/imageset.h: Removed mandatory
+ identifier path.
+ * src/resources/resourcemanager.cpp, src/resources/resourcemanager.h:
+ Factored code between resource handlers.
+ * src/resources/soundeffect.h, src/resources/soundeffect.cpp,
+ src/resources/music.h, src/resources/music.cpp, src/resources/image.h,
+ src/resources/image.cpp: Reworked resource loaders.
+ * src/resources/spritedef.h, src/resources/spritedef.cpp: Implemented
+ a failure-friendly loader.
+ * src/gui/truetypefont.cpp, src/resources/imageloader.cpp,
+ src/tileset.h: Removed dummy parameter.
+
2007-10-19 Philipp Sehmisch <tmw@crushnet.org>
* data/graphics/images/ambient/fog.png: Added fog effect overlay
diff --git a/src/gui/listbox.cpp b/src/gui/listbox.cpp
index a7f6df8d..94e8b38c 100644
--- a/src/gui/listbox.cpp
+++ b/src/gui/listbox.cpp
@@ -52,6 +52,7 @@ void ListBox::draw(gcn::Graphics *graphics)
}
// Draw the list elements
+ graphics->setColor(gcn::Color(0, 0, 0));
for (int i = 0, y = 0;
i < mListModel->getNumberOfElements();
++i, y += fontHeight)
diff --git a/src/gui/menuwindow.cpp b/src/gui/menuwindow.cpp
index e6b35f5a..2043b7d1 100644
--- a/src/gui/menuwindow.cpp
+++ b/src/gui/menuwindow.cpp
@@ -66,22 +66,19 @@ MenuWindow::MenuWindow():
"Setup",
0
};
- int x = 0, y = 3, h = 0;
+ int x = 0, h = 0;
for (const char **curBtn = buttonNames; *curBtn; curBtn++)
{
gcn::Button *btn = new Button(*curBtn, *curBtn, &listener);
- btn->setPosition(x, y);
+ btn->setPosition(x, 0);
add(btn);
x += btn->getWidth() + 3;
h = btn->getHeight();
}
+ setPosition(windowContainer->getWidth() - x - 3, 3);
setContentSize(x - 3, h);
- setDefaultSize(windowContainer->getWidth() - getWidth() - 1,
- 0,
- x - 3,
- y + h);
}
void MenuWindow::draw(gcn::Graphics *graphics)
diff --git a/src/gui/ministatus.cpp b/src/gui/ministatus.cpp
index 694a6f32..8f121368 100644
--- a/src/gui/ministatus.cpp
+++ b/src/gui/ministatus.cpp
@@ -78,6 +78,7 @@ MiniStatusWindow::MiniStatusWindow():
setDefaultSize(0, 0, mXpBar->getX() + mXpBar->getWidth(),
mXpBar->getY() + mXpBar->getHeight());
+ loadWindowState();
}
void MiniStatusWindow::update()
diff --git a/src/gui/shoplistbox.cpp b/src/gui/shoplistbox.cpp
index 4efd6e64..610ad76c 100644
--- a/src/gui/shoplistbox.cpp
+++ b/src/gui/shoplistbox.cpp
@@ -95,6 +95,7 @@ void ShopListBox::draw(gcn::Graphics *gcnGraphics)
graphics->drawImage(icon, 1, y);
}
}
+ graphics->setColor(gcn::Color(0, 0, 0));
graphics->drawText(mListModel->getElementAt(i), ITEM_ICON_SIZE + 5,
y + (ITEM_ICON_SIZE - getFont()->getHeight()) / 2);
}
diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp
index 06daf3ef..744afe1e 100644
--- a/src/gui/trade.cpp
+++ b/src/gui/trade.cpp
@@ -99,6 +99,8 @@ TradeWindow::TradeWindow(Network *network):
add(mMoneyField);
add(mMoneyLabel);
+ loadWindowState();
+
gcn::Rectangle area = getChildrenArea();
int width = area.width;
int height = area.height;
diff --git a/src/gui/window.cpp b/src/gui/window.cpp
index 8317684a..90031545 100644
--- a/src/gui/window.cpp
+++ b/src/gui/window.cpp
@@ -526,17 +526,21 @@ Window::loadWindowState()
{
const std::string &name = mWindowName;
- setPosition((int) config.getValue(name + "WinX", getX()),
- (int) config.getValue(name + "WinY", getY()));
+ setPosition((int) config.getValue(name + "WinX", mDefaultX),
+ (int) config.getValue(name + "WinY", mDefaultY));
if (mGrip)
{
- setSize((int) config.getValue(name + "WinWidth", getWidth()),
- (int) config.getValue(name + "WinHeight", getHeight()));
+ setSize((int) config.getValue(name + "WinWidth", mDefaultWidth),
+ (int) config.getValue(name + "WinHeight", mDefaultHeight));
const gcn::Rectangle area = getChildrenArea();
mChrome->setSize(area.width, area.height);
}
+ else
+ {
+ setContentSize(mDefaultWidth, mDefaultHeight);
+ }
}
void Window::setDefaultSize(int defaultX, int defaultY,
@@ -546,9 +550,6 @@ void Window::setDefaultSize(int defaultX, int defaultY,
mDefaultY = defaultY;
mDefaultWidth = defaultWidth;
mDefaultHeight = defaultHeight;
-
- setPosition(mDefaultX, mDefaultY);
- setContentSize(mDefaultWidth, mDefaultHeight);
}
void Window::resetToDefaultSize()
diff --git a/src/gui/window.h b/src/gui/window.h
index 8e3fdef9..18f97cec 100644
--- a/src/gui/window.h
+++ b/src/gui/window.h
@@ -255,10 +255,9 @@ class Window : public gcn::Window
getWindowName() { return mWindowName; }
/**
- * Read the x, y, and width and height for resizables in the config
- * based on the name of the window.
- * That function let the values set with set{X, Y, Height, width}()
- * if no config value is found.
+ * Reads the position (and the size for resizable windows) in the
+ * configuration based on the given string.
+ * Uses the default values when config values are missing.
* Don't forget to set these default values and resizable before
* calling this function.
*/
diff --git a/src/resources/image.cpp b/src/resources/image.cpp
index 995e34b0..7a394edb 100644
--- a/src/resources/image.cpp
+++ b/src/resources/image.cpp
@@ -33,8 +33,7 @@ int Image::mTextureType = 0;
int Image::mTextureSize = 0;
#endif
-Image::Image(const std::string &idPath, SDL_Surface *image):
- Resource(idPath),
+Image::Image(SDL_Surface *image):
#ifdef USE_OPENGL
mGLImage(0),
#endif
@@ -48,9 +47,8 @@ Image::Image(const std::string &idPath, SDL_Surface *image):
}
#ifdef USE_OPENGL
-Image::Image(const std::string &idPath, GLuint glimage, int width, int height,
+Image::Image(GLuint glimage, int width, int height,
int texWidth, int texHeight):
- Resource(idPath),
mGLImage(glimage),
mTexWidth(texWidth),
mTexHeight(texHeight),
@@ -69,36 +67,25 @@ Image::~Image()
unload();
}
-Image* Image::load(void *buffer, unsigned int bufferSize,
- const std::string &idPath)
+Resource *Image::load(void *buffer, unsigned bufferSize)
{
// Load the raw file data from the buffer in an RWops structure
SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize);
- SDL_Surface *tmpImage;
+ SDL_Surface *tmpImage = IMG_Load_RW(rw, 1);
- // Use SDL_Image to load the raw image data and have it free the data
- if (!idPath.compare(idPath.length() - 4, 4, ".tga"))
+ if (!tmpImage)
{
- tmpImage = IMG_LoadTyped_RW(rw, 1, const_cast<char*>("TGA"));
- }
- else
- {
- tmpImage = IMG_Load_RW(rw, 1);
- }
-
- if (!tmpImage) {
logger->log("Error, image load failed: %s", IMG_GetError());
return NULL;
}
- Image *image = load(tmpImage, idPath);
+ Image *image = load(tmpImage);
SDL_FreeSurface(tmpImage);
-
return image;
}
-Image *Image::load(SDL_Surface *tmpImage, std::string const &idPath)
+Image *Image::load(SDL_Surface *tmpImage)
{
#ifdef USE_OPENGL
if (mUseOpenGL)
@@ -198,7 +185,7 @@ Image *Image::load(SDL_Surface *tmpImage, std::string const &idPath)
return NULL;
}
- return new Image(idPath, texture, width, height, realWidth, realHeight);
+ return new Image(texture, width, height, realWidth, realHeight);
}
#endif
@@ -238,7 +225,7 @@ Image *Image::load(SDL_Surface *tmpImage, std::string const &idPath)
return NULL;
}
- return new Image(idPath, image);
+ return new Image(image);
}
void Image::unload()
@@ -324,7 +311,7 @@ Image::powerOfTwo(int input)
SubImage::SubImage(Image *parent, SDL_Surface *image,
int x, int y, int width, int height):
- Image("", image), mParent(parent)
+ Image(image), mParent(parent)
{
mParent->incRef();
@@ -339,7 +326,7 @@ SubImage::SubImage(Image *parent, SDL_Surface *image,
SubImage::SubImage(Image *parent, GLuint image,
int x, int y, int width, int height,
int texWidth, int texHeight):
- Image("", image, width, height, texWidth, texHeight), mParent(parent)
+ Image(image, width, height, texWidth, texHeight), mParent(parent)
{
mParent->incRef();
diff --git a/src/resources/image.h b/src/resources/image.h
index 34515dda..485ca227 100644
--- a/src/resources/image.h
+++ b/src/resources/image.h
@@ -62,18 +62,16 @@ class Image : public Resource
*
* @param buffer The memory buffer containing the image data.
* @param bufferSize The size of the memory buffer in bytes.
- * @param idPath The path identifying the resource.
*
* @return <code>NULL</code> if the an error occurred, a valid pointer
* otherwise.
*/
- static Image*
- load(void* buffer, unsigned int bufferSize, const std::string &idPath);
+ static Resource *load(void *buffer, unsigned bufferSize);
/**
* Loads an image from an SDL surface.
*/
- static Image *load(SDL_Surface *, std::string const &idPath);
+ static Image *load(SDL_Surface *);
/**
* Frees the resources created by SDL.
@@ -129,8 +127,8 @@ class Image : public Resource
* Constructor.
*/
#ifdef USE_OPENGL
- Image(const std::string &idPath, GLuint glimage, int width, int height,
- int texWidth, int texHeight);
+ Image(GLuint glimage, int width, int height,
+ int texWidth, int texHeight);
/**
* Returns the first power of two equal or bigger than the input.
@@ -138,7 +136,7 @@ class Image : public Resource
static int
powerOfTwo(int input);
#endif
- Image(const std::string &idPath, SDL_Surface *image);
+ Image(SDL_Surface *image);
SDL_Rect mBounds;
bool mLoaded;
diff --git a/src/resources/imageloader.cpp b/src/resources/imageloader.cpp
index 81a5cf63..d6539b05 100644
--- a/src/resources/imageloader.cpp
+++ b/src/resources/imageloader.cpp
@@ -85,7 +85,7 @@ void ProxyImage::convertToDisplayFormat()
font. Get rid of them. */
SDL_SetColorKey(mSDLImage, SDL_SRCCOLORKEY,
SDL_MapRGB(mSDLImage->format, 255, 0, 255));
- mImage = ::Image::load(mSDLImage, std::string());
+ mImage = ::Image::load(mSDLImage);
SDL_FreeSurface(mSDLImage);
mSDLImage = NULL;
}
diff --git a/src/resources/imageset.cpp b/src/resources/imageset.cpp
index 677c024b..565e8860 100644
--- a/src/resources/imageset.cpp
+++ b/src/resources/imageset.cpp
@@ -29,10 +29,7 @@
#include "../utils/dtor.h"
-ImageSet::ImageSet(const std::string& idPath,
- Image *img,
- int width, int height):
- Resource(idPath)
+ImageSet::ImageSet(Image *img, int width, int height)
{
for (int y = 0; y + height <= img->getHeight(); y += height)
{
diff --git a/src/resources/imageset.h b/src/resources/imageset.h
index 3469a3bb..15c21d90 100644
--- a/src/resources/imageset.h
+++ b/src/resources/imageset.h
@@ -40,7 +40,7 @@ class ImageSet : public Resource
/*
* Cuts the passed image in a grid of sub images.
*/
- ImageSet(const std::string &idPath, Image *img, int w, int h);
+ ImageSet(Image *img, int w, int h);
/**
* Destructor.
diff --git a/src/resources/music.cpp b/src/resources/music.cpp
index 09e2752a..161d8b01 100644
--- a/src/resources/music.cpp
+++ b/src/resources/music.cpp
@@ -23,8 +23,9 @@
#include "music.h"
-Music::Music(const std::string &idPath, Mix_Chunk *music):
- Resource(idPath),
+#include "../log.h"
+
+Music::Music(Mix_Chunk *music):
mChunk(music),
mChannel(-1)
{
@@ -36,20 +37,24 @@ Music::~Music()
Mix_FreeChunk(mChunk);
}
-Music*
-Music::load(void *buffer, unsigned int bufferSize, const std::string &idPath)
+Resource *Music::load(void *buffer, unsigned bufferSize)
{
// Load the raw file data from the buffer in an RWops structure
SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize);
// Use Mix_LoadMUS to load the raw music data
//Mix_Music* music = Mix_LoadMUS_RW(rw); Need to be implemeted
- Mix_Chunk *tmpMusic = Mix_LoadWAV_RW(rw, 0);
-
- // Now free the SDL_RWops data
- SDL_FreeRW(rw);
+ Mix_Chunk *tmpMusic = Mix_LoadWAV_RW(rw, 1);
- return new Music(idPath, tmpMusic);
+ if (tmpMusic)
+ {
+ return new Music(tmpMusic);
+ }
+ else
+ {
+ logger->log("Error, failed to load music: %s", Mix_GetError());
+ return NULL;
+ }
}
bool
diff --git a/src/resources/music.h b/src/resources/music.h
index 2888eaa0..72e76295 100644
--- a/src/resources/music.h
+++ b/src/resources/music.h
@@ -40,17 +40,15 @@ class Music : public Resource
virtual ~Music();
/**
- * Loads an image from a buffer in memory.
+ * Loads a music from a buffer in memory.
*
* @param buffer The memory buffer containing the music data.
* @param bufferSize The size of the memory buffer in bytes.
- * @param idPath The path identifying the resource.
*
* @return <code>NULL</code> if the an error occurred, a valid pointer
* otherwise.
*/
- static Music*
- load(void* buffer, unsigned int bufferSize, const std::string &idPath);
+ static Resource *load(void *buffer, unsigned bufferSize);
/**
* Plays the music.
@@ -73,7 +71,7 @@ class Music : public Resource
/**
* Constructor.
*/
- Music(const std::string &idPath, Mix_Chunk *music);
+ Music(Mix_Chunk *music);
//Mix_Music *music;
Mix_Chunk *mChunk;
diff --git a/src/resources/resource.cpp b/src/resources/resource.cpp
index bd8cd437..07f31b8f 100644
--- a/src/resources/resource.cpp
+++ b/src/resources/resource.cpp
@@ -27,12 +27,6 @@
#include "resourcemanager.h"
-
-Resource::Resource(const std::string &idPath):
- mRefCount(0), mIdPath(idPath)
-{
-}
-
Resource::~Resource()
{
}
diff --git a/src/resources/resource.h b/src/resources/resource.h
index d8b93e2d..7c39f176 100644
--- a/src/resources/resource.h
+++ b/src/resources/resource.h
@@ -37,7 +37,7 @@ class Resource
/**
* Constructor
*/
- Resource(const std::string &idPath);
+ Resource(): mRefCount(0) {}
/**
* Increments the internal reference count.
diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp
index 5e3f3bc7..e507835a 100644
--- a/src/resources/resourcemanager.cpp
+++ b/src/resources/resourcemanager.cpp
@@ -157,56 +157,23 @@ ResourceManager::isDirectory(const std::string &path)
return PHYSFS_isDirectory(path.c_str());
}
-Resource*
-ResourceManager::get(const E_RESOURCE_TYPE &type, const std::string &idPath)
+Resource *ResourceManager::get(std::string const &idPath, generator fun, void *data)
{
// Check if the id exists, and return the value if it does.
ResourceIterator resIter = mResources.find(idPath);
- if (resIter != mResources.end() && resIter->second) {
+ if (resIter != mResources.end())
+ {
resIter->second->incRef();
return resIter->second;
}
- int fileSize;
- void *buffer = loadFile(idPath, fileSize);
- if (!buffer) {
- return NULL;
- }
-
- Resource *resource = NULL;
-
- // Create an object of the specified type.
- switch (type)
- {
- case MUSIC:
- {
- // Let the music class load it
- resource = Music::load(buffer, fileSize, idPath);
- }
- break;
- case IMAGE:
- {
- // Let the image class load it
- resource = Image::load(buffer, fileSize, idPath);
- }
- break;
- case SOUND_EFFECT:
- {
- // Let the sound effect class load it
- resource = SoundEffect::load(buffer, fileSize, idPath);
- }
- break;
- default:
- /* Nothing to do here, just avoid compiler warnings... */
- break;
- }
-
- free(buffer);
+ Resource *resource = fun(data);
if (resource)
{
resource->incRef();
+ resource->mIdPath = idPath;
mResources[idPath] = resource;
}
@@ -214,79 +181,90 @@ ResourceManager::get(const E_RESOURCE_TYPE &type, const std::string &idPath)
return resource;
}
+struct ResourceLoader
+{
+ ResourceManager *manager;
+ std::string path;
+ ResourceManager::loader fun;
+ static Resource *load(void *v)
+ {
+ ResourceLoader *l = static_cast< ResourceLoader * >(v);
+ int fileSize;
+ void *buffer = l->manager->loadFile(l->path, fileSize);
+ if (!buffer) return NULL;
+ Resource *res = l->fun(buffer, fileSize);
+ free(buffer);
+ return res;
+ }
+};
+
+Resource *ResourceManager::load(std::string const &path, loader fun)
+{
+ ResourceLoader l = { this, path, fun };
+ return get(path, ResourceLoader::load, &l);
+}
+
Image*
ResourceManager::getImage(const std::string &idPath)
{
- return dynamic_cast<Image*>(get(IMAGE, idPath));
+ return static_cast<Image*>(load(idPath, Image::load));
}
Music*
ResourceManager::getMusic(const std::string &idPath)
{
- return dynamic_cast<Music*>(get(MUSIC, idPath));
+ return static_cast<Music*>(load(idPath, Music::load));
}
SoundEffect*
ResourceManager::getSoundEffect(const std::string &idPath)
{
- return dynamic_cast<SoundEffect*>(get(SOUND_EFFECT, idPath));
+ return static_cast<SoundEffect*>(load(idPath, SoundEffect::load));
}
+struct ImageSetLoader
+{
+ ResourceManager *manager;
+ std::string path;
+ int w, h;
+ static Resource *load(void *v)
+ {
+ ImageSetLoader *l = static_cast< ImageSetLoader * >(v);
+ Image *img = l->manager->getImage(l->path);
+ if (!img) return NULL;
+ ImageSet *res = new ImageSet(img, l->w, l->h);
+ img->decRef();
+ return res;
+ }
+};
+
ImageSet*
ResourceManager::getImageSet(const std::string &imagePath, int w, int h)
{
+ ImageSetLoader l = { this, imagePath, w, h };
std::stringstream ss;
ss << imagePath << "[" << w << "x" << h << "]";
- const std::string idPath = ss.str();
-
- ResourceIterator resIter = mResources.find(idPath);
-
- if (resIter != mResources.end()) {
- resIter->second->incRef();
- return dynamic_cast<ImageSet*>(resIter->second);
- }
-
- Image *img = getImage(imagePath);
+ return static_cast<ImageSet*>(get(ss.str(), ImageSetLoader::load, &l));
+}
- if (!img) {
- return NULL;
+struct SpriteDefLoader
+{
+ std::string path;
+ int variant;
+ static Resource *load(void *v)
+ {
+ SpriteDefLoader *l = static_cast< SpriteDefLoader * >(v);
+ return SpriteDef::load(l->path, l->variant);
}
-
- ImageSet *imageSet = new ImageSet(idPath, img, w, h);
- imageSet->incRef();
- mResources[idPath] = imageSet;
-
- img->decRef();
-
- return imageSet;
-}
+};
SpriteDef*
ResourceManager::getSprite(const std::string &path, int variant)
{
+ SpriteDefLoader l = { path, variant };
std::stringstream ss;
ss << path << "[" << variant << "]";
- const std::string idPath = ss.str();
-
- ResourceIterator resIter = mResources.find(idPath);
-
- if (resIter != mResources.end()) {
- resIter->second->incRef();
- return dynamic_cast<SpriteDef*>(resIter->second);
- }
-
- // FIXME: modify SpriteDef so that it gracefully fails on missing sprite.
- if (!exists(path) || isDirectory(path))
- {
- logger->log("Failed to load file: %s", path.c_str());
- return NULL;
- }
-
- SpriteDef *sprite = new SpriteDef(idPath, path, variant);
- sprite->incRef();
- mResources[idPath] = sprite;
-
- return sprite;
+ return static_cast<SpriteDef*>(get(ss.str(), SpriteDefLoader::load, &l));
}
void
diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h
index db29e6d3..150b773c 100644
--- a/src/resources/resourcemanager.h
+++ b/src/resources/resourcemanager.h
@@ -42,18 +42,8 @@ class SpriteDef;
class ResourceManager
{
public:
- /**
- * An enumeration of resource types.
- */
- enum E_RESOURCE_TYPE
- {
- //MAP,
- MUSIC,
- IMAGE,
- //SCRIPT,
- //TILESET,
- SOUND_EFFECT
- };
+ typedef Resource *(*loader)(void *, unsigned);
+ typedef Resource *(*generator)(void *);
/**
* Constructor.
@@ -109,17 +99,25 @@ class ResourceManager
isDirectory(const std::string &path);
/**
- * Creates a resource and adds it to the resource map. The idPath is
- * converted into the appropriate path for the current operating system
- * and the resource is loaded.
+ * Creates a resource and adds it to the resource map.
*
- * @param type The type of resource to load.
* @param idPath The resource identifier path.
+ * @param fun A function for generating the resource.
+ * @param data Extra parameters for the generator.
+ * @return A valid resource or <code>NULL</code> if the resource could
+ * not be generated.
+ */
+ Resource *get(std::string const &idPath, generator fun, void *data);
+
+ /**
+ * Loads a resource from a file and adds it to the resource map.
+ *
+ * @param path The file name.
+ * @param fun A function for parsing the file.
* @return A valid resource or <code>NULL</code> if the resource could
* not be loaded.
*/
- Resource*
- get(const E_RESOURCE_TYPE &type, const std::string &idPath);
+ Resource *load(std::string const &path, loader fun);
/**
* Convenience wrapper around ResourceManager::get for loading
diff --git a/src/resources/soundeffect.cpp b/src/resources/soundeffect.cpp
index bb35218e..ec9bc65c 100644
--- a/src/resources/soundeffect.cpp
+++ b/src/resources/soundeffect.cpp
@@ -25,20 +25,12 @@
#include "../log.h"
-SoundEffect::SoundEffect(const std::string &idPath, Mix_Chunk *soundEffect):
- Resource(idPath),
- mChunk(soundEffect)
-{
-}
-
SoundEffect::~SoundEffect()
{
Mix_FreeChunk(mChunk);
}
-SoundEffect*
-SoundEffect::load(void *buffer, unsigned int bufferSize,
- const std::string &idPath)
+Resource *SoundEffect::load(void *buffer, unsigned bufferSize)
{
// Load the raw file data from the buffer in an RWops structure
SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize);
@@ -48,11 +40,11 @@ SoundEffect::load(void *buffer, unsigned int bufferSize,
if (tmpSoundEffect)
{
- return new SoundEffect(idPath, tmpSoundEffect);
+ return new SoundEffect(tmpSoundEffect);
}
else
{
- logger->log("Error while loading sound effect (%s)", idPath.c_str());
+ logger->log("Error, failed to load sound effect: %s", Mix_GetError());
return NULL;
}
}
diff --git a/src/resources/soundeffect.h b/src/resources/soundeffect.h
index 007f5a77..866c53ec 100644
--- a/src/resources/soundeffect.h
+++ b/src/resources/soundeffect.h
@@ -45,13 +45,11 @@ class SoundEffect : public Resource
*
* @param buffer The memory buffer containing the sample data.
* @param bufferSize The size of the memory buffer in bytes.
- * @param idPath The path identifying the resource.
*
* @return <code>NULL</code> if the an error occurred, a valid pointer
* otherwise.
*/
- static SoundEffect*
- load(void* buffer, unsigned int bufferSize, const std::string &idPath);
+ static Resource *load(void *buffer, unsigned bufferSize);
/**
* Plays the sample.
@@ -69,7 +67,7 @@ class SoundEffect : public Resource
/**
* Constructor.
*/
- SoundEffect(const std::string &idPath, Mix_Chunk *soundEffect);
+ SoundEffect(Mix_Chunk *soundEffect): mChunk(soundEffect) {}
Mix_Chunk *mChunk;
};
diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp
index 6eb2365b..45a52d2e 100644
--- a/src/resources/spritedef.cpp
+++ b/src/resources/spritedef.cpp
@@ -35,16 +35,6 @@
#include "../utils/xml.h"
-SpriteDef::SpriteDef(const std::string &idPath,
- const std::string &file, int variant):
- Resource(idPath),
- mAction(NULL),
- mDirection(DIRECTION_DOWN),
- mLastTime(0)
-{
- load(file, variant);
-}
-
Action*
SpriteDef::getAction(SpriteAction action) const
{
@@ -59,29 +49,29 @@ SpriteDef::getAction(SpriteAction action) const
return i->second;
}
-void
-SpriteDef::load(const std::string &animationFile, int variant)
+SpriteDef *SpriteDef::load(std::string const &animationFile, int variant)
{
int size;
ResourceManager *resman = ResourceManager::getInstance();
char *data = (char*) resman->loadFile(animationFile.c_str(), size);
- if (!data) {
- logger->error("Animation: Could not find " + animationFile + "!");
- }
+ if (!data) return NULL;
xmlDocPtr doc = xmlParseMemory(data, size);
free(data);
- if (!doc) {
- logger->error(
- "Animation: Error while parsing " + animationFile + " file!");
+ if (!doc)
+ {
+ logger->log("Error, failed to parse %s.", animationFile.c_str());
+ return NULL;
}
xmlNodePtr rootNode = xmlDocGetRootElement(doc);
- if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "sprite")) {
- logger->error(
- "Animation: this is not a valid " + animationFile + " file!");
+ if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "sprite"))
+ {
+ logger->log("Error, failed to parse %s.", animationFile.c_str());
+ xmlFreeDoc(doc);
+ return NULL;
}
// Get the variant
@@ -93,25 +83,32 @@ SpriteDef::load(const std::string &animationFile, int variant)
variant_offset = variant * XML::getProperty(rootNode, "variant_offset", 0);
}
+ SpriteDef *def = new SpriteDef;
+
for_each_xml_child_node(node, rootNode)
{
if (xmlStrEqual(node->name, BAD_CAST "imageset"))
{
- loadImageSet(node);
+ def->loadImageSet(node);
}
else if (xmlStrEqual(node->name, BAD_CAST "action"))
{
- loadAction(node, variant_offset);
+ def->loadAction(node, variant_offset);
}
else if (xmlStrEqual(node->name, BAD_CAST "include"))
{
- includeSprite(node);
+ def->includeSprite(node);
}
}
xmlFreeDoc(doc);
- // Complete missing actions
+ def->substituteActions();
+ return def;
+}
+
+void SpriteDef::substituteActions()
+{
substituteAction(ACTION_STAND, ACTION_DEFAULT);
substituteAction(ACTION_WALK, ACTION_STAND);
substituteAction(ACTION_WALK, ACTION_RUN);
diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h
index 55d7f459..121f23cc 100644
--- a/src/resources/spritedef.h
+++ b/src/resources/spritedef.h
@@ -71,28 +71,26 @@ class SpriteDef : public Resource
{
public:
/**
- * Constructor.
+ * Loads a sprite definition file.
*/
- SpriteDef(const std::string &idPath,
- const std::string &file, int variant);
+ static SpriteDef *load(std::string const &file, int variant);
/**
- * Destructor.
+ * Returns the specified action.
*/
- ~SpriteDef();
+ Action *getAction(SpriteAction action) const;
+
+ private:
/**
- * Returns the specified action.
+ * Constructor.
*/
- Action*
- getAction(SpriteAction action) const;
+ SpriteDef(): mAction(NULL), mDirection(DIRECTION_DOWN), mLastTime(0) {}
- private:
/**
- * Loads a sprite definition file.
+ * Destructor.
*/
- void
- load(const std::string &file, int variant);
+ ~SpriteDef();
/**
* Loads an imageset element.
@@ -121,6 +119,11 @@ class SpriteDef : public Resource
includeSprite(xmlNodePtr includeNode);
/**
+ * Complete missing actions by copying existing ones.
+ */
+ void substituteActions();
+
+ /**
* When there are no animations defined for the action "complete", its
* animations become a copy of those of the action "with".
*/
diff --git a/src/tileset.h b/src/tileset.h
index 7521a3e5..6af69235 100644
--- a/src/tileset.h
+++ b/src/tileset.h
@@ -36,7 +36,7 @@ class Tileset : public ImageSet
* Constructor.
*/
Tileset(Image *img, int w, int h, int firstGid):
- ImageSet("", img, w, h),
+ ImageSet(img, w, h),
mFirstGid(firstGid)
{
}