Separate the notion of tile passability from tile objects since
passability is specific to the miso layer. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@405 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: Tile.java,v 1.12 2001/09/28 01:24:27 mdb Exp $
|
||||
// $Id: Tile.java,v 1.13 2001/10/08 21:04:25 shaper Exp $
|
||||
|
||||
package com.threerings.media.tile;
|
||||
|
||||
@@ -25,9 +25,6 @@ public class Tile
|
||||
/** The tile height in pixels. */
|
||||
public short height;
|
||||
|
||||
/** Whether the tile is passable. */
|
||||
public boolean passable;
|
||||
|
||||
/**
|
||||
* Construct a new tile with the specified identifiers. Intended
|
||||
* only for use by the <code>TileSet</code>. Do not call this
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: TileSet.java,v 1.15 2001/08/30 01:13:08 shaper Exp $
|
||||
// $Id: TileSet.java,v 1.16 2001/10/08 21:04:25 shaper Exp $
|
||||
|
||||
package com.threerings.media.tile;
|
||||
|
||||
@@ -26,25 +26,9 @@ public class TileSet
|
||||
/**
|
||||
* Construct a new <code>TileSet</code> object.
|
||||
*/
|
||||
public TileSet (
|
||||
String name, int tsid, String imgFile,
|
||||
int[] rowWidth, int[] rowHeight, int[] tileCount, int[] passable,
|
||||
Point offsetPos, Point gapDist)
|
||||
public TileSet ()
|
||||
{
|
||||
_name = name;
|
||||
_tsid = tsid;
|
||||
_imgFile = imgFile;
|
||||
_rowWidth = rowWidth;
|
||||
_rowHeight = rowHeight;
|
||||
_tileCount = tileCount;
|
||||
_passable = passable;
|
||||
_offsetPos = offsetPos;
|
||||
_gapDist = gapDist;
|
||||
|
||||
// determine the total number of tiles in the set
|
||||
for (int ii = 0; ii < _tileCount.length; ii++) {
|
||||
_numTiles += _tileCount[ii];
|
||||
}
|
||||
_model = new TileSetModel();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -52,7 +36,7 @@ public class TileSet
|
||||
*/
|
||||
public int getId ()
|
||||
{
|
||||
return _tsid;
|
||||
return _model.tsid;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,7 +44,7 @@ public class TileSet
|
||||
*/
|
||||
public String getName ()
|
||||
{
|
||||
return _name;
|
||||
return _model.name;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -68,7 +52,7 @@ public class TileSet
|
||||
*/
|
||||
public int getNumTiles ()
|
||||
{
|
||||
return _numTiles;
|
||||
return _model.numTiles;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -84,9 +68,9 @@ public class TileSet
|
||||
{
|
||||
// load the full tile image if we don't already have it
|
||||
if (_imgTiles == null) {
|
||||
if ((_imgTiles = imgmgr.getImage(_imgFile)) == null) {
|
||||
if ((_imgTiles = imgmgr.getImage(_model.imgFile)) == null) {
|
||||
Log.warning("Failed to retrieve full tileset image " +
|
||||
"[file=" + _imgFile + "].");
|
||||
"[file=" + _model.imgFile + "].");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -96,19 +80,19 @@ public class TileSet
|
||||
ridx = tcount = 0;
|
||||
|
||||
// start tile image position at image start offset
|
||||
tx = _offsetPos.x;
|
||||
ty = _offsetPos.y;
|
||||
tx = _model.offsetPos.x;
|
||||
ty = _model.offsetPos.y;
|
||||
|
||||
while ((tcount += _tileCount[ridx]) < tid + 1) {
|
||||
while ((tcount += _model.tileCount[ridx]) < tid + 1) {
|
||||
// increment tile image position by row height and gap distance
|
||||
ty += (_rowHeight[ridx++] + _gapDist.y);
|
||||
ty += (_model.rowHeight[ridx++] + _model.gapDist.y);
|
||||
}
|
||||
|
||||
// determine the horizontal index of this tile in the row
|
||||
int xidx = tid - (tcount - _tileCount[ridx]);
|
||||
int xidx = tid - (tcount - _model.tileCount[ridx]);
|
||||
|
||||
// final image x-position is based on tile width and gap distance
|
||||
tx += (xidx * (_rowWidth[ridx] + _gapDist.x));
|
||||
tx += (xidx * (_model.rowWidth[ridx] + _model.gapDist.x));
|
||||
|
||||
// Log.info("Retrieving tile image [tid=" + tid + ", ridx=" +
|
||||
// ridx + ", xidx=" + xidx + ", tx=" + tx +
|
||||
@@ -116,7 +100,7 @@ public class TileSet
|
||||
|
||||
// crop the tile-sized image chunk from the full image
|
||||
return imgmgr.getImageCropped(
|
||||
_imgTiles, tx, ty, _rowWidth[ridx], _rowHeight[ridx]);
|
||||
_imgTiles, tx, ty, _model.rowWidth[ridx], _model.rowHeight[ridx]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,18 +117,18 @@ public class TileSet
|
||||
public Tile getTile (ImageManager imgmgr, int tid)
|
||||
{
|
||||
// bail if there's no such tile
|
||||
if (tid > (_numTiles - 1)) {
|
||||
if (tid > (_model.numTiles - 1)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// create the tile object
|
||||
Tile tile = new Tile(_tsid, tid);
|
||||
Tile tile = createTile(tid);
|
||||
|
||||
// retrieve the tile image
|
||||
tile.img = getTileImage(imgmgr, tid);
|
||||
if (tile.img == null) {
|
||||
Log.warning("Null tile image " +
|
||||
"[tsid=" + _tsid + ", tid=" + tid + "].");
|
||||
"[tsid=" + _model.tsid + ", tid=" + tid + "].");
|
||||
}
|
||||
|
||||
// populate the tile's dimensions
|
||||
@@ -152,61 +136,94 @@ public class TileSet
|
||||
tile.height = (short)bimg.getHeight();
|
||||
tile.width = (short)bimg.getWidth();
|
||||
|
||||
// and its passability
|
||||
tile.passable = (_passable[tid] == 1);
|
||||
|
||||
return tile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the tile set model.
|
||||
*/
|
||||
public TileSetModel getModel ()
|
||||
{
|
||||
return _model;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
return _model.toString();
|
||||
}
|
||||
|
||||
/** The tileset name. */
|
||||
protected String _name;
|
||||
|
||||
/** The file containing the tile images. */
|
||||
protected String _imgFile;
|
||||
|
||||
/** The tileset unique identifier. */
|
||||
protected int _tsid;
|
||||
|
||||
/** The width of the tiles in each row in pixels. */
|
||||
protected int _rowWidth[];
|
||||
|
||||
/** The height of each row in pixels. */
|
||||
protected int _rowHeight[];
|
||||
|
||||
/** The number of tiles in each row. */
|
||||
protected int _tileCount[];
|
||||
|
||||
/** Whether each tile is passable. */
|
||||
protected int _passable[];
|
||||
|
||||
/**
|
||||
* The offset distance (x, y) in pixels from the top-left of the
|
||||
* image to the start of the first tile image.
|
||||
* Construct and return a new tile object for further population
|
||||
* with tile-specific information.
|
||||
*/
|
||||
protected Point _offsetPos;
|
||||
|
||||
/**
|
||||
* The distance (x, y) in pixels between each tile in each row
|
||||
* horizontally, and between each row of tiles vertically.
|
||||
*/
|
||||
protected Point _gapDist;
|
||||
|
||||
/** The total number of tiles. */
|
||||
protected int _numTiles;
|
||||
protected Tile createTile (int tid)
|
||||
{
|
||||
return new Tile(_model.tsid, tid);
|
||||
}
|
||||
|
||||
/** The image containing all tile images for this set. */
|
||||
protected Image _imgTiles;
|
||||
|
||||
/** The tile set data model. */
|
||||
protected TileSetModel _model;
|
||||
|
||||
/**
|
||||
* The model that details the attributes of each tile in a
|
||||
* tileset. Storing the data separately from the tile set object
|
||||
* itself allows for the wealth of information associated with a
|
||||
* tile set to be more cleanly gathered and passed on to the tile
|
||||
* set constructor by those that need to do so.
|
||||
*/
|
||||
public static class TileSetModel
|
||||
{
|
||||
/** The tileset name. */
|
||||
public String name;
|
||||
|
||||
/** The tileset unique identifier. */
|
||||
public int tsid;
|
||||
|
||||
/** The file containing the tile images. */
|
||||
public String imgFile;
|
||||
|
||||
/** The width of the tiles in each row in pixels. */
|
||||
public int[] rowWidth;
|
||||
|
||||
/** The height of the tiles in each row in pixels. */
|
||||
public int[] rowHeight;
|
||||
|
||||
/** The number of tiles in each row. */
|
||||
public int[] tileCount;
|
||||
|
||||
/** The number of tiles in the tileset. */
|
||||
public int numTiles;
|
||||
|
||||
/**
|
||||
* The offset distance (x, y) in pixels from the top-left of the
|
||||
* image to the start of the first tile image.
|
||||
*/
|
||||
public Point offsetPos = new Point();
|
||||
|
||||
/**
|
||||
* The distance (x, y) in pixels between each tile in each row
|
||||
* horizontally, and between each row of tiles vertically.
|
||||
*/
|
||||
public Point gapDist = new Point();
|
||||
|
||||
public TileSetModel ()
|
||||
{
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: XMLTileSetParser.java,v 1.14 2001/09/27 18:43:08 shaper Exp $
|
||||
// $Id: XMLTileSetParser.java,v 1.15 2001/10/08 21:04:25 shaper Exp $
|
||||
|
||||
package com.threerings.media.tile;
|
||||
|
||||
@@ -24,16 +24,59 @@ import com.threerings.media.Log;
|
||||
public class XMLTileSetParser extends DefaultHandler
|
||||
implements TileSetParser
|
||||
{
|
||||
/**
|
||||
* This method is called when an element is fully parsed. The
|
||||
* complete parsed data for the element is passed in the given
|
||||
* string.
|
||||
*
|
||||
* @param qName the element name.
|
||||
* @param str the full parsed data for the element.
|
||||
*/
|
||||
protected void finishElement (String qName, String str)
|
||||
{
|
||||
if (qName.equals("imagefile")) {
|
||||
_model.imgFile = str;
|
||||
|
||||
} else if (qName.equals("rowwidth")) {
|
||||
_model.rowWidth = StringUtil.parseIntArray(str);
|
||||
|
||||
} else if (qName.equals("rowheight")) {
|
||||
_model.rowHeight = StringUtil.parseIntArray(str);
|
||||
|
||||
} else if (qName.equals("tilecount")) {
|
||||
_model.tileCount = StringUtil.parseIntArray(str);
|
||||
|
||||
// calculate the total number of tiles in the tileset
|
||||
for (int ii = 0; ii < _model.tileCount.length; ii++) {
|
||||
_model.numTiles += _model.tileCount[ii];
|
||||
}
|
||||
|
||||
} else if (qName.equals("offsetpos")) {
|
||||
getPoint(str, _model.offsetPos);
|
||||
|
||||
} else if (qName.equals("gapdist")) {
|
||||
getPoint(str, _model.gapDist);
|
||||
|
||||
} else if (qName.equals("tileset")) {
|
||||
// construct the tileset on tag close and add it to the
|
||||
// list of tilesets constructed thus far
|
||||
_tilesets.add(_tset);
|
||||
|
||||
// prepare to read another tileset object
|
||||
init();
|
||||
}
|
||||
}
|
||||
|
||||
public void startElement (String uri, String localName,
|
||||
String qName, Attributes attributes)
|
||||
{
|
||||
_tag = qName;
|
||||
|
||||
if (_tag.equals("tileset")) {
|
||||
_info.tsid = getTileSetId(attributes.getValue("tsid"));
|
||||
_model.tsid = getTileSetId(attributes.getValue("tsid"));
|
||||
|
||||
String str = attributes.getValue("name");
|
||||
_info.name = (str == null) ? DEF_NAME : str;
|
||||
_model.name = (str == null) ? DEF_NAME : str;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,42 +86,7 @@ public class XMLTileSetParser extends DefaultHandler
|
||||
// for the elements we're tracking at this point, so proceed
|
||||
// with saving off element values for use when we construct
|
||||
// the tileset object.
|
||||
String str = _chars.toString().trim();
|
||||
|
||||
if (qName.equals("imagefile")) {
|
||||
_info.imgfile = str;
|
||||
|
||||
} else if (qName.equals("rowwidth")) {
|
||||
_info.rowwidth = StringUtil.parseIntArray(str);
|
||||
|
||||
} else if (qName.equals("rowheight")) {
|
||||
_info.rowheight = StringUtil.parseIntArray(str);
|
||||
|
||||
} else if (qName.equals("tilecount")) {
|
||||
_info.tilecount = StringUtil.parseIntArray(str);
|
||||
|
||||
// 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("passable")) {
|
||||
_info.passable = StringUtil.parseIntArray(str);
|
||||
|
||||
} else if (qName.equals("offsetpos")) {
|
||||
getPoint(str, _info.offsetpos);
|
||||
|
||||
} else if (qName.equals("gapdist")) {
|
||||
getPoint(str, _info.gapdist);
|
||||
|
||||
} else if (qName.equals("tileset")) {
|
||||
// construct the tileset on tag close and add it to the
|
||||
// list of tilesets constructed thus far
|
||||
_tilesets.add(_info.constructTileSet());
|
||||
|
||||
// prepare to read another tileset object
|
||||
init();
|
||||
}
|
||||
finishElement(qName, _chars.toString().trim());
|
||||
|
||||
// note that we're not within a tag to avoid considering any
|
||||
// characters during this quiescent time
|
||||
@@ -132,7 +140,16 @@ public class XMLTileSetParser extends DefaultHandler
|
||||
protected void init ()
|
||||
{
|
||||
_chars = new StringBuffer();
|
||||
_info = new TileSetInfo();
|
||||
_tset = createTileSet();
|
||||
_model = _tset.getModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs and returns a new tile set object.
|
||||
*/
|
||||
protected TileSet createTileSet ()
|
||||
{
|
||||
return new TileSet();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -182,64 +199,9 @@ public class XMLTileSetParser extends DefaultHandler
|
||||
/** Temporary storage of character data while parsing. */
|
||||
protected StringBuffer _chars;
|
||||
|
||||
/** Temporary storage of tileset info while parsing. */
|
||||
protected TileSetInfo _info;
|
||||
/** The tile set whose model is populated while parsing. */
|
||||
protected TileSet _tset;
|
||||
|
||||
/**
|
||||
* A class to hold temporary information on a tileset.
|
||||
*/
|
||||
class TileSetInfo
|
||||
{
|
||||
/** The tileset name. */
|
||||
public String name;
|
||||
|
||||
/** The tileset id. */
|
||||
public int tsid;
|
||||
|
||||
/** The tileset full image file path. */
|
||||
public String imgfile;
|
||||
|
||||
/** The width of the tiles in each row. */
|
||||
public int[] rowwidth;
|
||||
|
||||
/** The height of the tiles in each row. */
|
||||
public int[] rowheight;
|
||||
|
||||
/** The number of tiles in each row. */
|
||||
public int[] tilecount;
|
||||
|
||||
/** The passability of each tile. */
|
||||
public int[] passable;
|
||||
|
||||
/** The number of tiles in the tileset. */
|
||||
public int numtiles;
|
||||
|
||||
/** The offset position at which tiles begin in the tile image. */
|
||||
public Point offsetpos;
|
||||
|
||||
/** The gap distance between each tile in the tile image. */
|
||||
public Point gapdist;
|
||||
|
||||
public TileSetInfo ()
|
||||
{
|
||||
offsetpos = new Point();
|
||||
gapdist = new Point();
|
||||
}
|
||||
|
||||
public TileSet constructTileSet ()
|
||||
{
|
||||
// if passability is unspecified, default to all passable
|
||||
if (passable == null) {
|
||||
passable = new int[numtiles];
|
||||
for (int ii = 0; ii < numtiles; ii++) {
|
||||
passable[ii] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// construct a tileset object using all gathered data
|
||||
return new TileSet(
|
||||
name, tsid, imgfile, rowwidth, rowheight, tilecount,
|
||||
passable, offsetpos, gapdist);
|
||||
}
|
||||
}
|
||||
/** The tile set data model populated while parsing. */
|
||||
protected TileSet.TileSetModel _model;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user