// // $Id$ // // Nenya library - tools for developing networked games // Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved // http://www.threerings.net/code/nenya/ // // This library is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published // by the Free Software Foundation; either version 2.1 of the License, or // (at your option) any later version. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package com.threerings.media.tile; import static com.threerings.media.Log.log; import java.lang.ref.SoftReference; import java.util.Map; import com.google.common.collect.Maps; import com.samskivert.io.PersistenceException; import com.threerings.media.image.ImageManager; /** * The tile manager provides a simplified interface for retrieving and caching tiles. Tiles can be * loaded in two different ways. An application can load a tileset by hand, specifying the path to * the tileset image and all of the tileset metadata necessary for extracting the image tiles, or * it can provide a tileset repository which loads up tilesets using whatever repository mechanism * is implemented by the supplied repository. In the latter case, tilesets are loaded by a unique * identifier. * *
Loading tilesets by hand is intended for things like toolbar icons or games with a single
* set of tiles (think Stratego, for example). Loading tilesets from a repository supports games
* with vast numbers of tiles to which more tiles may be added on the fly (think the tiles for an
* isometric-display graphical MUD).
*/
public class TileManager
{
/**
* Creates a tile manager and provides it with a reference to the image manager from which it
* will load tileset images.
*
* @param imgr the image manager via which the tile manager will decode and cache images.
*/
public TileManager (ImageManager imgr)
{
_imgr = imgr;
_defaultProvider = new IMImageProvider(_imgr, (String)null);
}
/**
* Loads up a tileset from the specified image with the specified metadata parameters.
*/
public UniformTileSet loadTileSet (String imgPath, int width, int height)
{
return loadCachedTileSet("", imgPath, width, height);
}
/**
* Loads up a tileset from the specified image (located in the specified resource set) with
* the specified metadata parameters.
*/
public UniformTileSet loadTileSet (String rset, String imgPath, int width, int height)
{
return loadTileSet(getImageProvider(rset), rset, imgPath, width, height);
}
/**
*/
public UniformTileSet loadTileSet (
ImageProvider improv, String improvKey, String imgPath,
int width, int height)
{
UniformTileSet uts = loadCachedTileSet(improvKey, imgPath, width, height);
uts.setImageProvider(improv);
return uts;
}
/**
* Returns an image provider that will load images from the specified
* resource set.
*/
public ImageProvider getImageProvider (String rset)
{
return new IMImageProvider(_imgr, rset);
}
/**
* Used to load and cache tilesets loaded via {@link #loadTileSet}.
*/
protected UniformTileSet loadCachedTileSet (String bundle, String imgPath, int width,
int height)
{
String key = bundle + "::" + imgPath;
SoftReference