A bunch of intertwingled changes:

Refactored TileSet into TileSet, UniformTileSet, SwissArmyTileSet and
ObjectTileSet.

Removed dependence on the "root" system property from the
XMLSceneRepository (things either pass in full paths now or input streams
fetched via the resource manager).

Removed MisoUtil.createImageManager() because everyone does that by hand
now (which is good because some non-Miso things were using MisoUtil for
that).

I think that's it, but if there was something else, don't blame me. Blame
the monkeys.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@608 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2001-11-08 03:04:45 +00:00
parent 0b5d51a80c
commit feb2a2633e
12 changed files with 563 additions and 277 deletions
@@ -1,5 +1,5 @@
//
// $Id: TileUtil.java,v 1.1 2001/11/02 15:28:20 shaper Exp $
// $Id: TileUtil.java,v 1.2 2001/11/08 03:04:44 mdb Exp $
package com.threerings.cast.util;
@@ -84,7 +84,7 @@ public class TileUtil
}
// get the number of frames of animation
int frameCount = tset.getNumTiles() / Sprite.NUM_DIRECTIONS;
int frameCount = tset.getTileCount() / Sprite.NUM_DIRECTIONS;
for (int dir = 0; dir < Sprite.NUM_DIRECTIONS; dir++) {
// retrieve all images for the sequence and direction
@@ -0,0 +1,65 @@
//
// $Id: ObjectTileSet.java,v 1.1 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
import java.awt.Image;
import java.awt.Point;
import com.samskivert.util.HashIntMap;
import com.threerings.media.Log;
import com.threerings.media.ImageManager;
/**
* The objcet tileset supports the specification of object information for
* object tiles in addition to all of the features of the swiss army
* tileset.
*/
public class ObjectTileSet extends SwissArmyTileSet
{
/**
* Constructs a tileset with all of the swiss army configuration
* parameters, with the addition of object information for those tiles
* in the set that are object tiles.
*
* @param objects object information for those tiles that are objects.
*
* @see SwissArmyTileSet#SwissArmyTileSet
*/
public ObjectTileSet (
ImageManager imgmgr, String imgPath, String name, int tsid,
int[] tileCount, int[] rowWidth, int[] rowHeight,
Point offsetPos, Point gapDist, HashIntMap objects)
{
super(imgmgr, imgPath, name, tsid, tileCount, rowWidth, rowHeight,
offsetPos, gapDist);
// keep this for later
_objects = objects;
}
/**
* Creates instances of {@link ObjectTile} which can span more than a
* single tile's space in a display.
*/
protected Tile createTile (int tileId)
{
// default object dimensions to (1, 1)
int wid = 1, hei = 1;
// retrieve object dimensions if known
if (_objects != null) {
int size[] = (int[])_objects.get(tileId);
if (size != null) {
wid = size[0];
hei = size[1];
}
}
return new ObjectTile(_tsid, tileId, wid, hei);
}
/** Mapping of object tile ids to object dimensions. */
protected HashIntMap _objects;
}
@@ -0,0 +1,129 @@
//
// $Id: SwissArmyTileSet.java,v 1.1 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
import java.awt.Image;
import java.awt.Point;
import com.threerings.media.Log;
import com.threerings.media.ImageManager;
/**
* The swiss army tileset supports a diverse variety of tiles in the
* tileset image. Each row can contain varying numbers of tiles and each
* row can have its own width and height. Tiles can be separated from the
* edge of the tileset image by some border offset and can be separated
* from one another by a gap distance.
*/
public class SwissArmyTileSet extends TileSet
{
/**
* The full monty. Constructs a swiss army tile set object with the
* full panoply of parameters, specifying everything under the sun.
* Each row in the tileset image must contain tiles of the same width
* and height, but those values can vary from row to row. Each row can
* contain an arbitrary number of tiles. The tiles can be offset from
* the upper left of the image and can have a uniform horizontal and
* vertical distance between each tile (horizontal doesn't have to be
* the same as vertical but all horizontal distances must be the same,
* for example).
*
* @param imgmgr an image manager from which the tileset image can be
* loaded.
* @param imgPath the path to the tileset image.
* @param name the name of the tileset (optional, can be null).
* @param tsid the unique integer identifier of the tileset (optional,
* can be zero if the tileset is not to be loaded by id).
* @param tileCount an array containing the number of tiles in each
* row.
* @param rowWidth an array containing the width of the tiles in each
* row.
* @param rowHeight an array containing the height of the tiles in
* each row.
* @param offsetPos the offset to the upper left of the first tile.
* @param gapDist the number of pixels (x for horizontally and y for
* vertically) in between each tile in the tileset image.
*/
public SwissArmyTileSet (
ImageManager imgmgr, String imgPath, String name, int tsid,
int tileCount[], int rowWidth[], int rowHeight[],
Point offsetPos, Point gapDist)
{
super(imgmgr, imgPath, name, tsid);
// keep these around
_tileCount = tileCount;
_rowWidth = rowWidth;
_rowHeight = rowHeight;
_offsetPos = offsetPos;
_gapDist = gapDist;
// compute our number of tiles
for (int i = 0; i < tileCount.length; i++) {
_numTiles += tileCount[i];
}
}
// documentation inherited
public int getTileCount ()
{
return _numTiles;
}
// documentation inherited
protected Image getTileImage (int tileId)
{
Image tsimg = getTilesetImage();
if (tsimg == null) {
return null;
}
// find the row number containing the sought-after tile
int ridx, tcount, ty, tx;
ridx = tcount = 0;
// start tile image position at image start offset
tx = _offsetPos.x;
ty = _offsetPos.y;
while ((tcount += _tileCount[ridx]) < tileId + 1) {
// increment tile image position by row height and gap distance
ty += (_rowHeight[ridx++] + _gapDist.y);
}
// determine the horizontal index of this tile in the row
int xidx = tileId - (tcount - _tileCount[ridx]);
// final image x-position is based on tile width and gap distance
tx += (xidx * (_rowWidth[ridx] + _gapDist.x));
// Log.info("Retrieving tile image [tileId=" + tileId + ", ridx=" +
// ridx + ", xidx=" + xidx + ", tx=" + tx +
// ", ty=" + ty + "].");
// crop the tile-sized image chunk from the full image
return _imgmgr.getImageCropped(
tsimg, tx, ty, _rowWidth[ridx], _rowHeight[ridx]);
}
/** The number of tiles in each row. */
protected int[] _tileCount;
/** The number of tiles in the tileset. */
protected int _numTiles;
/** The width of the tiles in each row in pixels. */
protected int[] _rowWidth;
/** The height of the tiles in each row in pixels. */
protected int[] _rowHeight;
/** The offset distance (x, y) in pixels from the top-left of the
* image to the start of the first tile image. */
protected Point _offsetPos = new Point();
/** The distance (x, y) in pixels between each tile in each row
* horizontally, and between each row of tiles vertically. */
protected Point _gapDist = new Point();
}
@@ -1,5 +1,5 @@
//
// $Id: TileManager.java,v 1.19 2001/11/01 01:40:42 shaper Exp $
// $Id: TileManager.java,v 1.20 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
@@ -10,21 +10,70 @@ import java.util.ArrayList;
import com.samskivert.util.HashIntMap;
import com.threerings.media.Log;
import com.threerings.media.ImageManager;
/**
* The tile manager provides a simplified interface for retrieving and
* caching tiles.
* 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.
*
* <p> 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).
*
* <p> When the tile manager is used to load tiles via the tileset
* repository, it caches the resulting tile instance so that they can be
* fetched again without rebuilding the tile image. Tilesets that are
* fetched by hand are not cached and it is assumed that the requesting
* application will cache the tile objects itself (probably by retaining
* references directly to the tile instances in which it is interested).
* The tile creation process is not hugely expensive, but does involve
* extracting the tile image from the larger tileset image.
*/
public class TileManager
{
/**
* Initializes the tile manager.
*
* @param tilesetrepo the tile set repository.
* Creates a tile manager and provides it with a reference to the
* image manager from which it will load its tileset images.
*/
public TileManager (TileSetRepository tsrepo)
public TileManager (ImageManager imgmgr)
{
_tsrepo = tsrepo;
// keep this guy around for later
_imgmgr = imgmgr;
}
/**
* Loads up a tileset from the specified image with the specified
* metadata parameters.
*/
public TileSet loadTileSet (
String imgPath, int count, int width, int height)
{
return new UniformTileSet(_imgmgr, imgPath, count, width, height);
}
/**
* Sets the tileset repository that will be used by the tile manager
* when tiles are requested by tileset id.
*/
public void setTileSetRepository (TileSetRepository tsrepo)
{
_tsrepo = tsrepo;
}
/**
* Returns the tileset repository currently in use.
*/
public TileSetRepository getTileSetRepository ()
{
return _tsrepo;
}
/**
@@ -39,6 +88,11 @@ public class TileManager
public Tile getTile (int tsid, int tid)
throws NoSuchTileSetException, NoSuchTileException
{
// make sure we have a repository configured
if (_tsrepo == null) {
throw new NoSuchTileSetException(tsid);
}
// the fully unique tile id is the conjoined tile set and tile id
int utid = (tsid << 16) | tid;
@@ -61,13 +115,8 @@ public class TileManager
return tile;
}
/**
* Returns the tile set repository used by this tile manager.
*/
public TileSetRepository getTileSetRepository ()
{
return _tsrepo;
}
/** The entity through which we load images. */
protected ImageManager _imgmgr;
/** Cache of tiles that have been requested thus far. */
protected HashIntMap _tiles = new HashIntMap();
+128 -180
View File
@@ -1,5 +1,5 @@
//
// $Id: TileSet.java,v 1.18 2001/11/01 01:40:42 shaper Exp $
// $Id: TileSet.java,v 1.19 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
@@ -7,62 +7,45 @@ import java.awt.Image;
import java.awt.Point;
import java.awt.image.*;
import com.samskivert.util.HashIntMap;
import com.samskivert.util.StringUtil;
import com.threerings.media.Log;
import com.threerings.media.ImageManager;
/**
* A tile set stores information on a single logical set of tiles. It
* provides a clean interface for the {@link TileManager} to retrieve
* individual tiles from the tile set.
* A tileset stores information on a single logical set of tiles. It
* provides a clean interface for the {@link TileManager} or other
* entities to retrieve individual tiles from the tile set and
* encapsulates the potentially sophisticated process of extracting the
* tile image from a composite tileset image.
*
* <p> Tiles are referenced by their tile id. The tile id is
* essentially the tile number, assuming the tile at the top-left of
* the image is tile id 0 and tiles are numbered left to right, top to
* bottom, in ascending order.
* <p> Tiles are referenced by their tile id. The tile id is essentially
* the tile number, assuming the tile at the top-left of the image is tile
* id zero and tiles are numbered, in ascending order, left to right, top
* to bottom.
*/
public class TileSet implements Cloneable
public abstract class TileSet implements Cloneable
{
/**
* Constructs a tile set object with the given image manager as
* the source for retrieving tile images.
* Provides the basic information needed to load a tileset image to
* the tileset base class.
*
* @param imgmgr an image manager from which the tileset image can be
* loaded.
* @param imgPath the path to the tileset image.
* @param name the name of the tileset (optional, can be null).
* @param tsid the unique integer identifier of the tileset (optional,
* can be zero if the tileset is not to be loaded by id).
*/
public TileSet (
ImageManager imgmgr, int tsid, String name, String imgFile,
int tileCount[], int rowWidth[], int rowHeight[],
int numTiles, Point offsetPos, Point gapDist,
boolean isObjectSet, HashIntMap objects)
public TileSet (ImageManager imgmgr, String imgPath,
String name, int tsid)
{
_imgmgr = imgmgr;
_tsid = tsid;
_imgPath = imgPath;
_name = name;
_imgFile = imgFile;
_tileCount = tileCount;
_rowWidth = rowWidth;
_rowHeight = rowHeight;
_numTiles = numTiles;
_offsetPos = offsetPos;
_gapDist = gapDist;
_isObjectSet = isObjectSet;
_objects = objects;
_tsid = tsid;
}
/**
* Returns a new tile set that is a clone of this tile set with
* the image file updated to reference the given file name.
*/
public TileSet clone (String imgFile)
throws CloneNotSupportedException
{
TileSet dup = (TileSet)clone();
dup.setImageFile(imgFile);
return dup;
}
/**
* Returns the tile set identifier.
* Returns the tileset identifier.
*/
public int getId ()
{
@@ -70,7 +53,7 @@ public class TileSet implements Cloneable
}
/**
* Returns the tile set name.
* Returns the tileset name.
*/
public String getName ()
{
@@ -78,43 +61,64 @@ public class TileSet implements Cloneable
}
/**
* Returns the number of tiles in the tile set.
* Returns the number of tiles in the tileset.
*/
public int getNumTiles ()
public abstract int getTileCount ();
/**
* Sets the image file to be used as the source for the tile
* images produced by this tileset.
*/
public void setImageFile (String imgPath)
{
return _numTiles;
_imgPath = imgPath;
_tilesetImg = null;
}
/**
* Returns the {@link Tile} object from this tile set
* corresponding to the specified tile id, or null if an error
* Returns a new tileset that is a clone of this tileset with the
* image file updated to reference the given file name. Useful for
* configuring a single tileset and then generating additional
* tilesets with new images with the same configuration.
*/
public TileSet clone (String imgPath)
throws CloneNotSupportedException
{
TileSet dup = (TileSet)clone();
dup.setImageFile(imgPath);
return dup;
}
/**
* Creates a @link Tile} object from this tileset corresponding to the
* specified tile id and returns that tile, or null if an error
* occurred.
*
* @param tid the tile identifier.
* @param tileId the tile identifier. Tile identifiers start with zero
* as the upper left tile and increase by one as the tiles move left
* to right and top to bottom over the source image.
*
* @return the tile object, or null if an error occurred.
*
* @exception NoSuchTileException thrown if the specified tile id is
* out of range for this tileset.
*/
public Tile getTile (int tid)
public Tile getTile (int tileId)
throws NoSuchTileException
{
if (_imgmgr == null) {
Log.warning("No default image manager [tsid=" + _tsid +
", tid=" + tid + "].");
return null;
}
// bail if there's no such tile
if (tid < 0 || tid > (_numTiles - 1)) {
throw new NoSuchTileException(tid);
if (tileId < 0 || tileId > (getTileCount() - 1)) {
throw new NoSuchTileException(tileId);
}
// create and populate the tile object
Tile tile = createTile(tid);
Tile tile = createTile(tileId);
// retrieve the tile image
tile.img = getTileImage(_imgmgr, tile.tid);
tile.img = getTileImage(tile.tid);
if (tile.img == null) {
Log.warning("Null tile image [tile=" + tile + "].");
return null;
}
// populate the tile's dimensions
@@ -129,60 +133,30 @@ public class TileSet implements Cloneable
}
/**
* Sets the image file to be used as the source for the tile
* images produced by this tile set.
*/
public void setImageFile (String imgFile)
{
_imgFile = imgFile;
_imgTiles = null;
}
/**
* Return a string representation of the tileset information.
*/
public String toString ()
{
StringBuffer buf = new StringBuffer();
buf.append("[name=").append(_name);
buf.append(", file=").append(_imgFile);
buf.append(", tsid=").append(_tsid);
buf.append(", numtiles=").append(_numTiles);
return buf.append("]").toString();
}
/**
* Construct and return a new tile object for further population
* with tile-specific information. Derived classes can override
* this method to create their own sub-class of <code>Tile</code>.
* Construct and return a new tile object for further population with
* tile-specific information. Derived classes can override this method
* to create their own sub-class of {@link Tile}.
*
* @param tid the tile id for the new tile.
* @param tileId the tile id for the new tile.
*
* @return the new tile object.
*/
protected Tile createTile (int tid)
protected Tile createTile (int tileId)
{
// construct an object tile if the tile set was specified as such
if (_isObjectSet) {
// default object dimensions to (1, 1)
int wid = 1, hei = 1;
// retrieve object dimensions if known
if (_objects != null) {
int size[] = (int[])_objects.get(tid);
if (size != null) {
wid = size[0];
hei = size[1];
}
}
return new ObjectTile(_tsid, tid, wid, hei);
}
// construct a basic tile
return new Tile(_tsid, tid);
return new Tile(_tsid, tileId);
}
/**
* Returns the image corresponding to the specified tile within this
* tileset.
*
* @param tileId the index of the tile to be retrieved.
*
* @return the tile image.
*/
protected abstract Image getTileImage (int tileId);
/**
* Populates the given tile object with its detailed tile
* information. Derived classes can override this method to add
@@ -197,91 +171,65 @@ public class TileSet implements Cloneable
}
/**
* Returns the image corresponding to the specified tile id within
* this tile set.
* Returns the tileset image (which is loaded if it has not yet been
* loaded).
*
* @param imgmgr the image manager.
* @param tid the tile id.
*
* @return the tile image.
* @return the tileset image or null if an error occurred loading the
* image.
*/
protected Image getTileImage (ImageManager imgmgr, int tid)
protected Image getTilesetImage ()
{
// load the full tile image if we don't already have it
if (_imgTiles == null) {
if ((_imgTiles = imgmgr.getImage(_imgFile)) == null) {
Log.warning("Failed to retrieve full tileset image " +
"[file=" + _imgFile + "].");
return null;
}
// return it straight away if it's already loaded
if (_tilesetImg != null) {
return _tilesetImg;
}
// load up the tileset image via the image manager
if ((_tilesetImg = _imgmgr.getImage(_imgPath)) == null) {
Log.warning("Failed to retrieve tileset image " +
"[tsid=" + _tsid + ", path=" + _imgPath + "].");
}
// find the row number containing the sought-after tile
int ridx, tcount, ty, tx;
ridx = tcount = 0;
// start tile image position at image start offset
tx = _offsetPos.x;
ty = _offsetPos.y;
while ((tcount += _tileCount[ridx]) < tid + 1) {
// increment tile image position by row height and gap distance
ty += (_rowHeight[ridx++] + _gapDist.y);
}
// determine the horizontal index of this tile in the row
int xidx = tid - (tcount - _tileCount[ridx]);
// final image x-position is based on tile width and gap distance
tx += (xidx * (_rowWidth[ridx] + _gapDist.x));
// Log.info("Retrieving tile image [tid=" + tid + ", ridx=" +
// ridx + ", xidx=" + xidx + ", tx=" + tx +
// ", ty=" + ty + "].");
// crop the tile-sized image chunk from the full image
return imgmgr.getImageCropped(
_imgTiles, tx, ty, _rowWidth[ridx], _rowHeight[ridx]);
return _tilesetImg;
}
/**
* Generates a string representation of the tileset information.
*/
public String toString ()
{
StringBuffer buf = new StringBuffer("[");
toString(buf);
return buf.append("]").toString();
}
/**
* Tileset derived classes should override this, calling
* <code>super.toString(buf)</code> and then appending additional
* information to the buffer.
*/
protected void toString (StringBuffer buf)
{
buf.append("name=").append(_name);
buf.append(", tsid=").append(_tsid);
buf.append(", path=").append(_imgPath);
buf.append(", tileCount=").append(getTileCount());
}
/** The default image manager for retrieving tile images. */
protected ImageManager _imgmgr;
/** The path to the file containing the tile images. */
protected String _imgPath;
/** The tileset name. */
protected String _name;
/** The tileset unique identifier. */
protected int _tsid;
/** The file containing the tile images. */
protected String _imgFile;
/** The width of the tiles in each row in pixels. */
protected int[] _rowWidth;
/** The height of the tiles in each row in pixels. */
protected int[] _rowHeight;
/** The number of tiles in each row. */
protected int[] _tileCount;
/** The number of tiles in the tileset. */
protected int _numTiles;
/** Whether this set produces object tiles. */
protected boolean _isObjectSet = false;
/** The offset distance (x, y) in pixels from the top-left of the
* image to the start of the first tile image. */
protected Point _offsetPos = new Point();
/** The distance (x, y) in pixels between each tile in each row
* horizontally, and between each row of tiles vertically. */
protected Point _gapDist = new Point();
/** Mapping of object tile ids to object dimensions. */
protected HashIntMap _objects;
/** The image containing all tile images for this set. */
protected Image _imgTiles;
/** The default image manager for retrieving tile images. */
protected ImageManager _imgmgr;
/** The image containing all tile images for this set. This is private
* because it should be accessed via {@link #getTilesetImage} even by
* derived classes. */
private Image _tilesetImg;
}
@@ -0,0 +1,74 @@
//
// $Id: UniformTileSet.java,v 1.1 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
import java.awt.Image;
import com.threerings.media.Log;
import com.threerings.media.ImageManager;
/**
* A uniform tileset is one that is composed of tiles that are all the
* same width and height and are arranged into rows, with each row having
* the same number of tiles except possibly the final row which can
* contain the same as or less than the number of tiles contained by the
* previous rows.
*/
public class UniformTileSet extends TileSet
{
/**
* Constructs a tile set object with the specified tileset
* configuration parameters.
*
* @param imgmgr the image manager via which to load the tileset
* image.
* @param imgPath the path to supply to the image manager when loading
* the tile (which will fetch the image using the resource manager).
* @param count the number of tiles in the tile image.
* @param width the width of each tile, in pixels.
* @param height the height of each tile, in pixels.
*/
public UniformTileSet (ImageManager imgmgr, String imgPath,
int count, int width, int height)
{
super(imgmgr, imgPath, null, 0);
// keep these for later
_count = count;
_width = width;
_height = height;
}
// documentation inherited
public int getTileCount ()
{
return _count;
}
// documentation inherited
protected Image getTileImage (int tileId)
{
Image tsimg = getTilesetImage();
if (tsimg == null) {
return null;
}
// figure out from whence to crop the tile
int tilesPerRow = tsimg.getWidth(null) / _width;
int row = tilesPerRow / tileId;
int col = tilesPerRow % tileId;
// crop the tile-sized image chunk from the full image
return _imgmgr.getImageCropped(
tsimg, col * _width, row * _height, _width, _height);
}
/** The total number of tiles in this tileset. */
protected int _count;
/** The width (in pixels) of the tiles in this tileset. */
protected int _width;
/** The height (in pixels) of the tiles in this tileset. */
protected int _height;
}
@@ -1,5 +1,5 @@
//
// $Id: XMLTileSetParser.java,v 1.20 2001/11/01 01:40:42 shaper Exp $
// $Id: XMLTileSetParser.java,v 1.21 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
@@ -78,11 +78,6 @@ public class XMLTileSetParser
} else if (qName.equals("tilecount")) {
_info.tileCount = StringUtil.parseIntArray(data);
// calculate the total number of tiles in the tileset
for (int ii = 0; ii < _info.tileCount.length; ii++) {
_info.numTiles += _info.tileCount[ii];
}
} else if (qName.equals("offsetpos")) {
parsePoint(data, _info.offsetPos);
@@ -119,7 +114,13 @@ public class XMLTileSetParser
// documentation inherited
protected InputStream getInputStream (String fname) throws IOException
{
return ConfigUtil.getStream(fname);
InputStream is = ConfigUtil.getStream(fname);
if (is == null) {
String errmsg = "Can't load tileset description file from " +
"classpath [path=" + fname + "].";
throw new FileNotFoundException(errmsg);
}
return is;
}
/**
@@ -129,10 +130,18 @@ public class XMLTileSetParser
*/
protected TileSet createTileSet ()
{
return new TileSet(
_imgmgr, _info.tsid, _info.name, _info.imgFile, _info.tileCount,
_info.rowWidth, _info.rowHeight, _info.numTiles, _info.offsetPos,
_info.gapDist, _info.isObjectSet, _info.objects);
if (_info.isObjectSet) {
return new ObjectTileSet(
_imgmgr, _info.imgFile, _info.name, _info.tsid,
_info.tileCount, _info.rowWidth, _info.rowHeight,
_info.offsetPos, _info.gapDist, _info.objects);
} else {
return new SwissArmyTileSet(
_imgmgr, _info.imgFile, _info.name, _info.tsid,
_info.tileCount, _info.rowWidth, _info.rowHeight,
_info.offsetPos, _info.gapDist);
}
}
/**
@@ -160,7 +169,6 @@ public class XMLTileSetParser
public String name;
public String imgFile;
public int tileCount[], rowWidth[], rowHeight[];
public int numTiles;
public Point offsetPos = new Point();
public Point gapDist = new Point();
public boolean isObjectSet;
@@ -1,5 +1,5 @@
//
// $Id: BaseTileSet.java,v 1.4 2001/11/01 01:40:42 shaper Exp $
// $Id: BaseTileSet.java,v 1.5 2001/11/08 03:04:45 mdb Exp $
package com.threerings.miso.tile;
@@ -13,23 +13,31 @@ import com.threerings.media.tile.*;
import com.threerings.miso.scene.MisoScene;
/**
* The miso tile set extends the base tile set to add support for tile
* passability. Passability is used to determine whether {@link
* com.threerings.miso.scene.Traverser} objects can traverse a
* particular tile in a {@link com.threerings.miso.scene.MisoScene}.
* The miso tile set extends the swiss army tile set to add support for
* tile passability. Passability is used to determine whether {@link
* com.threerings.miso.scene.Traverser} objects can traverse a particular
* tile in a {@link MisoScene}.
*/
public class MisoTileSet extends TileSet
public class MisoTileSet extends SwissArmyTileSet
{
/**
* Constructs a Miso tileset with the swiss army tile set
* configuration information and additional information about tile
* passability.
*
* @param layer the layer to which this tileset is assigned.
* @param passable info on each tile indicating whether or not the
* tile is passable (can be walked on by sprites).
*
* @see SwissArmyTileSet#SwissArmyTileSet
*/
public MisoTileSet (
ImageManager imgmgr, int tsid, String name, String imgFile,
int tileCount[], int rowWidth[], int rowHeight[],
int numTiles, Point offsetPos, Point gapDist,
boolean isObjectSet, HashIntMap objects,
int layer, int passable[])
ImageManager imgmgr, String imgFile, String name, int tsid,
int[] tileCount, int[] rowWidth, int[] rowHeight,
Point offsetPos, Point gapDist, int layer, int[] passable)
{
super(imgmgr, tsid, name, imgFile, tileCount, rowWidth,
rowHeight, numTiles, offsetPos, gapDist,
isObjectSet, objects);
super(imgmgr, imgFile, name, tsid, tileCount,
rowWidth, rowHeight, offsetPos, gapDist);
_layer = layer;
_passable = passable;
@@ -1,5 +1,5 @@
//
// $Id: XMLMisoTileSetParser.java,v 1.5 2001/11/01 01:40:42 shaper Exp $
// $Id: XMLMisoTileSetParser.java,v 1.6 2001/11/08 03:04:45 mdb Exp $
package com.threerings.miso.tile;
@@ -45,6 +45,7 @@ public class XMLMisoTileSetParser extends XMLTileSetParser
if (qName.equals("passable")) {
_passable = StringUtil.parseIntArray(data);
} else if (qName.equals("tileset")) {
_passable = null;
_layer = -1;
@@ -54,13 +55,24 @@ public class XMLMisoTileSetParser extends XMLTileSetParser
// documentation inherited
protected TileSet createTileSet ()
{
return new MisoTileSet(
_imgmgr, _info.tsid, _info.name, _info.imgFile, _info.tileCount,
_info.rowWidth, _info.rowHeight, _info.numTiles, _info.offsetPos,
_info.gapDist, _info.isObjectSet, _info.objects,
_layer, _passable);
if (_info.isObjectSet) {
return new ObjectTileSet(
_imgmgr, _info.imgFile, _info.name, _info.tsid,
_info.tileCount, _info.rowWidth, _info.rowHeight,
_info.offsetPos, _info.gapDist, _info.objects);
} else {
return new MisoTileSet(
_imgmgr, _info.imgFile, _info.name, _info.tsid,
_info.tileCount, _info.rowWidth, _info.rowHeight,
_info.offsetPos, _info.gapDist, _layer, _passable);
}
}
protected int _passable[];
/** Info on whether or not the tiles are passable (can be walked on by
* sprites). */
protected int[] _passable;
/** The layer to which the tiles are assigned. */
protected int _layer = -1;
}
@@ -1,5 +1,5 @@
//
// $Id: XMLSceneParser.java,v 1.23 2001/10/25 16:36:43 shaper Exp $
// $Id: XMLSceneParser.java,v 1.24 2001/11/08 03:04:44 mdb Exp $
package com.threerings.miso.scene.xml;
@@ -58,7 +58,7 @@ public class XMLSceneParser extends SimpleParser
Log.warning(
"Unrecognized scene file format version, will attempt " +
"to continue parsing file but your mileage may vary " +
"[fname=" + _fname + ", version=" + version +
"[version=" + version +
", known_version=" + XMLSceneVersion.VERSION + "].");
}
@@ -268,14 +268,28 @@ public class XMLSceneParser extends SimpleParser
* Parse the specified XML file and return a miso scene object with
* the data contained therein.
*
* @param fname the file name.
* @param path the full path to the scene description file.
*
* @return the scene object, or null if an error occurred.
*/
public EditableMisoScene loadScene (String fname) throws IOException
public EditableMisoScene loadScene (String path) throws IOException
{
return loadScene(getInputStream(path));
}
/**
* Parse the specified XML file and return a miso scene object with
* the data contained therein.
*
* @param stream the input stream from which the XML scene description
* can be read.
*
* @return the scene object, or null if an error occurred.
*/
public EditableMisoScene loadScene (InputStream stream) throws IOException
{
_info = new SceneInfo();
parseFile(fname);
parseStream(stream);
// place shadow tiles for any objects in the scene
_info.scene.generateAllObjectShadows();
// return the final scene object
@@ -1,10 +1,11 @@
//
// $Id: XMLSceneRepository.java,v 1.13 2001/11/02 02:52:16 shaper Exp $
// $Id: XMLSceneRepository.java,v 1.14 2001/11/08 03:04:44 mdb Exp $
package com.threerings.miso.scene.xml;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import com.samskivert.util.Config;
@@ -48,27 +49,31 @@ public class XMLSceneRepository
}
/**
* Returns the path to the scene root directory.
* Loads and returns a miso scene object for the scene described in
* the specified XML file.
*
* @param path the full pathname to the file.
*
* @return the scene object.
*/
public String getScenePath ()
public EditableMisoScene loadScene (String path) throws IOException
{
return _root + File.separator + _sceneRoot + File.separator;
Log.info("Loading scene [path=" + path + "].");
return _parser.loadScene(path);
}
/**
* Loads and returns a miso scene object for the scene described in
* the specified XML file. The filename should be relative to the
* scene root directory.
* the XML file available via the supplied input stream.
*
* @param path the full pathname to the file.
*
* @param fname the full pathname to the file.
* @return the scene object.
*/
public EditableMisoScene loadScene (String fname) throws IOException
public EditableMisoScene loadScene (InputStream stream)
throws IOException
{
String path = getScenePath() + fname;
Log.info("Loading scene [path=" + path + "].");
return _parser.loadScene(path);
return _parser.loadScene(stream);
}
/**
@@ -77,13 +82,11 @@ public class XMLSceneRepository
* the scene root directory.
*
* @param scene the scene to save.
* @param fname the file to write the scene to.
* @param path the full path of the file to write the scene to.
*/
public void saveScene (MisoScene scene, String fname) throws IOException
public void saveScene (MisoScene scene, String path) throws IOException
{
String path = getScenePath() + fname;
Log.info("Saving scene [path=" + path + "].");
_writer.saveScene(scene, path);
}
@@ -1,5 +1,5 @@
//
// $Id: MisoUtil.java,v 1.13 2001/11/02 02:52:16 shaper Exp $
// $Id: MisoUtil.java,v 1.14 2001/11/08 03:04:45 mdb Exp $
package com.threerings.miso.util;
@@ -12,8 +12,6 @@ import com.samskivert.util.*;
import com.threerings.cast.CharacterManager;
import com.threerings.resource.ResourceManager;
import com.threerings.media.ImageManager;
import com.threerings.media.tile.*;
@@ -122,19 +120,6 @@ public class MisoUtil
}
}
/**
* Creates an <code>ImageManager</code> object.
*
* @param frame the root frame to which images will be rendered.
*
* @return the new tile manager object or null if an error occurred.
*/
public static ImageManager createImageManager (Frame frame)
{
ResourceManager rmgr = createResourceManager();
return new ImageManager(rmgr, frame);
}
/**
* Creates a <code>TileManager</code> object.
*
@@ -147,20 +132,11 @@ public class MisoUtil
Config config, ImageManager imgmgr)
{
TileSetRepository tsrepo = createTileSetRepository(config, imgmgr);
TileManager tilemgr = new TileManager(tsrepo);
TileManager tilemgr = new TileManager(imgmgr);
tilemgr.setTileSetRepository(tsrepo);
return tilemgr;
}
/**
* Creates a <code>ResourceManager</code> object.
*
* @return the new resource manager object or null if an error occurred.
*/
protected static ResourceManager createResourceManager ()
{
return new ResourceManager("rsrc");
}
/**
* Creates a <code>TileSetRepository</code> object, reading the
* class name to instantiate from the config object.