diff --git a/src/java/com/threerings/media/tile/NoSuchTileException.java b/src/java/com/threerings/media/tile/NoSuchTileException.java new file mode 100644 index 000000000..36af390ec --- /dev/null +++ b/src/java/com/threerings/media/tile/NoSuchTileException.java @@ -0,0 +1,24 @@ +// +// $Id: NoSuchTileException.java,v 1.1 2001/10/11 00:41:26 shaper Exp $ + +package com.threerings.media.tile; + +/** + * Thrown when an attempt is made to retrieve a non-existent tile from the + * tile manager. + */ +public class NoSuchTileException extends TileException +{ + public NoSuchTileException (int tid) + { + super("No such tile [tid=" + tid + "]"); + _tid = tid; + } + + public int getTileId () + { + return _tid; + } + + protected int _tid; +} diff --git a/src/java/com/threerings/media/tile/NoSuchTileSetException.java b/src/java/com/threerings/media/tile/NoSuchTileSetException.java new file mode 100644 index 000000000..3effeb536 --- /dev/null +++ b/src/java/com/threerings/media/tile/NoSuchTileSetException.java @@ -0,0 +1,24 @@ +// +// $Id: NoSuchTileSetException.java,v 1.1 2001/10/11 00:41:26 shaper Exp $ + +package com.threerings.media.tile; + +/** + * Thrown when an attempt is made to retrieve a non-existent tile set + * from the tile set manager. + */ +public class NoSuchTileSetException extends TileException +{ + public NoSuchTileSetException (int tsid) + { + super("No such tile set [tsid=" + tsid + "]"); + _tsid = tsid; + } + + public int getTileSetId () + { + return _tsid; + } + + protected int _tsid; +} diff --git a/src/java/com/threerings/media/tile/ObjectTile.java b/src/java/com/threerings/media/tile/ObjectTile.java new file mode 100644 index 000000000..999c86e30 --- /dev/null +++ b/src/java/com/threerings/media/tile/ObjectTile.java @@ -0,0 +1,40 @@ +// +// $Id: ObjectTile.java,v 1.1 2001/10/11 00:41:26 shaper Exp $ + +package com.threerings.media.tile; + +import java.awt.Graphics2D; +import java.awt.Shape; + +/** + * An object tile extends the base tile to provide support for objects + * whose image spans more than one tile. The object has dimensions + * that represent its footprint or "shadow", which the scene + * containing the tile can reference to do things like make the + * footprint tiles impassable. + */ +public class ObjectTile extends Tile +{ + /** The object footprint dimensions in unit tile units. */ + public int baseWidth, baseHeight; + + /** + * Constructs a new object tile. + */ + public ObjectTile (int tsid, int tid, int baseWidth, int baseHeight) + { + super(tsid, tid); + + this.baseWidth = baseWidth; + this.baseHeight = baseHeight; + } + + // documentation inherited + public void paint (Graphics2D gfx, Shape dest) + { + super.paint(gfx, dest); + + // TODO: draw the object image offset to account for its + // actual dimensions + } +} diff --git a/src/java/com/threerings/media/tile/Tile.java b/src/java/com/threerings/media/tile/Tile.java index 00242ed33..c476ac76c 100644 --- a/src/java/com/threerings/media/tile/Tile.java +++ b/src/java/com/threerings/media/tile/Tile.java @@ -1,9 +1,9 @@ // -// $Id: Tile.java,v 1.13 2001/10/08 21:04:25 shaper Exp $ +// $Id: Tile.java,v 1.14 2001/10/11 00:41:26 shaper Exp $ package com.threerings.media.tile; -import java.awt.Image; +import java.awt.*; /** * A tile represents a single square in a single layer in a scene. @@ -48,6 +48,16 @@ public class Tile return ((int)tsid << 16) | tid; } + /** + * Render the tile into the given rectangle in the given graphics + * context. + */ + public void paint (Graphics2D gfx, Shape dest) + { + Rectangle bounds = dest.getBounds(); + gfx.drawImage(img, bounds.x, bounds.y, null); + } + /** * Return a string representation of the tile information. */ diff --git a/src/java/com/threerings/media/tile/TileException.java b/src/java/com/threerings/media/tile/TileException.java new file mode 100644 index 000000000..e6fef0adc --- /dev/null +++ b/src/java/com/threerings/media/tile/TileException.java @@ -0,0 +1,15 @@ +// +// $Id: TileException.java,v 1.1 2001/10/11 00:41:26 shaper Exp $ + +package com.threerings.media.tile; + +/** + * Thrown when an error occurs while working with tiles. + */ +public class TileException extends Exception +{ + public TileException (String message) + { + super(message); + } +} diff --git a/src/java/com/threerings/media/tile/TileManager.java b/src/java/com/threerings/media/tile/TileManager.java index e2a89c309..58151094a 100644 --- a/src/java/com/threerings/media/tile/TileManager.java +++ b/src/java/com/threerings/media/tile/TileManager.java @@ -1,5 +1,5 @@ // -// $Id: TileManager.java,v 1.17 2001/09/28 00:44:31 shaper Exp $ +// $Id: TileManager.java,v 1.18 2001/10/11 00:41:26 shaper Exp $ package com.threerings.media.tile; @@ -39,6 +39,7 @@ public class TileManager * @return the tile object, or null if an error occurred. */ public Tile getTile (int tsid, int tid) + throws NoSuchTileSetException, NoSuchTileException { // the fully unique tile id is the conjoined tile set and tile id int utid = (tsid << 16) | tid; diff --git a/src/java/com/threerings/media/tile/TileSet.java b/src/java/com/threerings/media/tile/TileSet.java index db5e37ade..4461da7b1 100644 --- a/src/java/com/threerings/media/tile/TileSet.java +++ b/src/java/com/threerings/media/tile/TileSet.java @@ -1,14 +1,8 @@ // -// $Id: TileSet.java,v 1.16 2001/10/08 21:04:25 shaper Exp $ +// $Id: TileSet.java,v 1.17 2001/10/11 00:41:26 shaper Exp $ package com.threerings.media.tile; -import java.awt.Image; -import java.awt.Point; -import java.awt.image.*; - -import com.samskivert.util.StringUtil; -import com.threerings.media.Log; import com.threerings.media.ImageManager; /** @@ -21,90 +15,25 @@ import com.threerings.media.ImageManager; * the image is tile id 0 and tiles are numbered left to right, top to * bottom, in ascending order. */ -public class TileSet +public interface TileSet { - /** - * Construct a new TileSet object. - */ - public TileSet () - { - _model = new TileSetModel(); - } - /** * Return the tileset identifier. */ - public int getId () - { - return _model.tsid; - } + public int getId (); /** * Return the tileset name. */ - public String getName () - { - return _model.name; - } + public String getName (); /** * Return the number of tiles in the tileset. */ - public int getNumTiles () - { - return _model.numTiles; - } + public int getNumTiles (); /** - * Return the image corresponding to the specified tile id within - * this tile set. - * - * @param imgmgr the image manager. - * @param tid the tile id. - * - * @return the tile image. - */ - protected Image getTileImage (ImageManager imgmgr, int tid) - { - // load the full tile image if we don't already have it - if (_imgTiles == null) { - if ((_imgTiles = imgmgr.getImage(_model.imgFile)) == null) { - Log.warning("Failed to retrieve full tileset image " + - "[file=" + _model.imgFile + "]."); - 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 = _model.offsetPos.x; - ty = _model.offsetPos.y; - - while ((tcount += _model.tileCount[ridx]) < tid + 1) { - // increment tile image position by row height and gap distance - ty += (_model.rowHeight[ridx++] + _model.gapDist.y); - } - - // determine the horizontal index of this tile in the row - int xidx = tid - (tcount - _model.tileCount[ridx]); - - // final image x-position is based on tile width and gap distance - tx += (xidx * (_model.rowWidth[ridx] + _model.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, _model.rowWidth[ridx], _model.rowHeight[ridx]); - } - - /** - * Return the {@link Tile} object from this tileset corresponding + * Returns the {@link Tile} object from this tileset corresponding * to the specified tile id, or null if no such tile * id exists. The tile image is retrieved from the given image * manager. @@ -115,115 +44,5 @@ public class TileSet * @return the tile object, or null if no such tile exists. */ public Tile getTile (ImageManager imgmgr, int tid) - { - // bail if there's no such tile - if (tid > (_model.numTiles - 1)) { - return null; - } - - // create the tile object - Tile tile = createTile(tid); - - // retrieve the tile image - tile.img = getTileImage(imgmgr, tid); - if (tile.img == null) { - Log.warning("Null tile image " + - "[tsid=" + _model.tsid + ", tid=" + tid + "]."); - } - - // populate the tile's dimensions - BufferedImage bimg = (BufferedImage)tile.img; - tile.height = (short)bimg.getHeight(); - tile.width = (short)bimg.getWidth(); - - return tile; - } - - /** - * Returns the tile set model. - */ - public TileSetModel getModel () - { - return _model; - } - - /** - * Return a string representation of the tileset information. - */ - public String toString () - { - return _model.toString(); - } - - /** - * Construct and return a new tile object for further population - * with tile-specific information. - */ - 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(); - } - } + throws NoSuchTileException; } diff --git a/src/java/com/threerings/media/tile/TileSetImpl.java b/src/java/com/threerings/media/tile/TileSetImpl.java new file mode 100644 index 000000000..9c3f32054 --- /dev/null +++ b/src/java/com/threerings/media/tile/TileSetImpl.java @@ -0,0 +1,197 @@ +// +// $Id: TileSetImpl.java,v 1.1 2001/10/11 00:41:26 shaper Exp $ + +package com.threerings.media.tile; + +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; + +// documentation inherited +public class TileSetImpl implements TileSet +{ + /** 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; + + /** Mapping of object tile ids to object dimensions. */ + public HashIntMap objects = new HashIntMap(); + + /** + * 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(); + + // documentation inherited + public int getId () + { + return tsid; + } + + // documentation inherited + public String getName () + { + return name; + } + + // documentation inherited + public int getNumTiles () + { + return numTiles; + } + + // documentation inherited + public Tile getTile (ImageManager imgmgr, int tid) + throws NoSuchTileException + { + // bail if there's no such tile + if (tid < 0 || tid > (numTiles - 1)) { + throw new NoSuchTileException(tid); + } + + // create and populate the tile object + Tile tile = createTile(tid); + + // retrieve the tile image + tile.img = getTileImage(imgmgr, tile.tid); + if (tile.img == null) { + Log.warning("Null tile image [tile=" + tile + "]."); + } + + // populate the tile's dimensions + BufferedImage bimg = (BufferedImage)tile.img; + tile.height = (short)bimg.getHeight(); + tile.width = (short)bimg.getWidth(); + + // allow sub-classes to fill in their tile information + populateTile(tile); + + return tile; + } + + /** + * 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 Tile. + * + * @param tid the tile id for the new tile. + * + * @return the new tile object. + */ + protected Tile createTile (int tid) + { + int size[] = (int[])objects.get(tid); + if (size != null) { + return new ObjectTile(tsid, tid, size[0], size[1]); + } + + return new Tile(tsid, tid); + } + + /** + * Populates the given tile object with its detailed tile + * information. Derived classes can override this method to add + * in their own tile information, but should be sure to call + * super.populateTile(). + * + * @param tile the tile to populate. + */ + protected void populateTile (Tile tile) + { + // nothing for now + } + + /** + * Returns the image corresponding to the specified tile id within + * this tile set. + * + * @param imgmgr the image manager. + * @param tid the tile id. + * + * @return the tile image. + */ + protected Image getTileImage (ImageManager imgmgr, int tid) + { + // 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; + } + } + + // 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]); + } + + /** The image containing all tile images for this set. */ + protected Image _imgTiles; +} diff --git a/src/java/com/threerings/media/tile/TileSetManager.java b/src/java/com/threerings/media/tile/TileSetManager.java index d7cd73607..51a330b87 100644 --- a/src/java/com/threerings/media/tile/TileSetManager.java +++ b/src/java/com/threerings/media/tile/TileSetManager.java @@ -1,5 +1,5 @@ // -// $Id: TileSetManager.java,v 1.12 2001/08/16 23:14:20 mdb Exp $ +// $Id: TileSetManager.java,v 1.13 2001/10/11 00:41:26 shaper Exp $ package com.threerings.media.tile; @@ -26,7 +26,8 @@ public interface TileSetManager * @param tsid the tileset identifier. * @return the number of tiles. */ - public int getNumTilesInSet (int tsid); + public int getNumTilesInSet (int tsid) + throws NoSuchTileSetException; /** * Return an ArrayList containing all @@ -43,7 +44,8 @@ public interface TileSetManager * @param tsid the tileset identifier. * @return the tileset object. */ - public TileSet getTileSet (int tsid); + public TileSet getTileSet (int tsid) + throws NoSuchTileSetException; /** * Return the tile object corresponding to the specified tileset @@ -54,7 +56,8 @@ public interface TileSetManager * * @return the tile object. */ - public Tile getTile (int tsid, int tid); + public Tile getTile (int tsid, int tid) + throws NoSuchTileSetException, NoSuchTileException; /** * Return the total number of tilesets available for use. diff --git a/src/java/com/threerings/media/tile/TileSetManagerImpl.java b/src/java/com/threerings/media/tile/TileSetManagerImpl.java index d2e4a1bdd..e8a8b0ff9 100644 --- a/src/java/com/threerings/media/tile/TileSetManagerImpl.java +++ b/src/java/com/threerings/media/tile/TileSetManagerImpl.java @@ -1,5 +1,5 @@ // -// $Id: TileSetManagerImpl.java,v 1.12 2001/09/17 05:18:21 mdb Exp $ +// $Id: TileSetManagerImpl.java,v 1.13 2001/10/11 00:41:26 shaper Exp $ package com.threerings.media.tile; @@ -28,20 +28,26 @@ public abstract class TileSetManagerImpl implements TileSetManager } public int getNumTilesInSet (int tsid) + throws NoSuchTileSetException { - TileSet tset = getTileSet(tsid); - return (tset != null) ? tset.getNumTiles() : -1; + return getTileSet(tsid).getNumTiles(); } public TileSet getTileSet (int tsid) + throws NoSuchTileSetException { - return (TileSet)_tilesets.get(tsid); + TileSet tset = (TileSet)_tilesets.get(tsid); + if (tset == null) { + throw new NoSuchTileSetException(tsid); + } + + return tset; } public Tile getTile (int tsid, int tid) + throws NoSuchTileSetException, NoSuchTileException { - TileSet tset = getTileSet(tsid); - return (tset == null) ? null : tset.getTile(_imgmgr, tid); + return getTileSet(tsid).getTile(_imgmgr, tid); } public ArrayList getAllTileSets () diff --git a/src/java/com/threerings/media/tile/TileUtil.java b/src/java/com/threerings/media/tile/TileUtil.java new file mode 100644 index 000000000..e5165a862 --- /dev/null +++ b/src/java/com/threerings/media/tile/TileUtil.java @@ -0,0 +1,46 @@ +// +// $Id: TileUtil.java,v 1.1 2001/10/11 00:41:26 shaper Exp $ + +package com.threerings.media.tile; + +import java.awt.Image; + +import com.threerings.media.Log; + +/** + * Miscellaneous utility routines for working with tiles. + */ +public class TileUtil +{ + /** + * Returns the image associated with the given tile from the given + * tile manager, or null if an error occurred. Any exceptions + * that occur are logged. + */ + public static Image getTileImage (TileManager tilemgr, int tsid, int tid) + { + try { + Tile tile = tilemgr.getTile(tsid, tid); + return tile.img; + + } catch (TileException te) { + Log.warning("Exception retrieving tile image [te=" + te + "]."); + return null; + } + } + + /** + * Returns the given tile from the given tile manager, or null if + * an error occurred. Any exceptions that occur are logged. + */ + public static Tile getTile (TileManager tilemgr, int tsid, int tid) + { + try { + return tilemgr.getTile(tsid, tid); + + } catch (TileException te) { + Log.warning("Exception retrieving tile [te=" + te + "]."); + return null; + } + } +} diff --git a/src/java/com/threerings/media/tile/XMLTileSetParser.java b/src/java/com/threerings/media/tile/XMLTileSetParser.java index 3bf64ca17..9d621eeb3 100644 --- a/src/java/com/threerings/media/tile/XMLTileSetParser.java +++ b/src/java/com/threerings/media/tile/XMLTileSetParser.java @@ -1,5 +1,5 @@ // -// $Id: XMLTileSetParser.java,v 1.15 2001/10/08 21:04:25 shaper Exp $ +// $Id: XMLTileSetParser.java,v 1.16 2001/10/11 00:41:26 shaper Exp $ package com.threerings.media.tile; @@ -35,27 +35,27 @@ public class XMLTileSetParser extends DefaultHandler protected void finishElement (String qName, String str) { if (qName.equals("imagefile")) { - _model.imgFile = str; + _tset.imgFile = str; } else if (qName.equals("rowwidth")) { - _model.rowWidth = StringUtil.parseIntArray(str); + _tset.rowWidth = StringUtil.parseIntArray(str); } else if (qName.equals("rowheight")) { - _model.rowHeight = StringUtil.parseIntArray(str); + _tset.rowHeight = StringUtil.parseIntArray(str); } else if (qName.equals("tilecount")) { - _model.tileCount = StringUtil.parseIntArray(str); + _tset.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]; + for (int ii = 0; ii < _tset.tileCount.length; ii++) { + _tset.numTiles += _tset.tileCount[ii]; } } else if (qName.equals("offsetpos")) { - getPoint(str, _model.offsetPos); + getPoint(str, _tset.offsetPos); } else if (qName.equals("gapdist")) { - getPoint(str, _model.gapDist); + getPoint(str, _tset.gapDist); } else if (qName.equals("tileset")) { // construct the tileset on tag close and add it to the @@ -67,19 +67,31 @@ public class XMLTileSetParser extends DefaultHandler } } + // documentation inherited public void startElement (String uri, String localName, String qName, Attributes attributes) { _tag = qName; if (_tag.equals("tileset")) { - _model.tsid = getTileSetId(attributes.getValue("tsid")); + _tset.tsid = getInt(attributes.getValue("tsid")); String str = attributes.getValue("name"); - _model.name = (str == null) ? DEF_NAME : str; + _tset.name = (str == null) ? DEF_NAME : str; + + } else if (_tag.equals("object")) { + // TODO: should we bother checking to make sure we only + // see tags while within an tag? + int tid = getInt(attributes.getValue("tid")); + int wid = getInt(attributes.getValue("width")); + int hei = getInt(attributes.getValue("height")); + + // add the object info to the tileset object hashtable + _tset.objects.put(tid, new int[] { wid, hei }); } } + // documentation inherited public void endElement (String uri, String localName, String qName) { // we know we've received the entirety of the character data @@ -96,6 +108,7 @@ public class XMLTileSetParser extends DefaultHandler _chars = new StringBuffer(); } + // documentation inherited public void characters (char ch[], int start, int length) { // bail if we're not within a meaningful tag @@ -106,6 +119,7 @@ public class XMLTileSetParser extends DefaultHandler _chars.append(ch, start, length); } + // documentation inherited public ArrayList loadTileSets (String fname) throws IOException { try { @@ -141,15 +155,16 @@ public class XMLTileSetParser extends DefaultHandler { _chars = new StringBuffer(); _tset = createTileSet(); - _model = _tset.getModel(); } /** - * Constructs and returns a new tile set object. + * Constructs and returns a new tile set object. Derived classes + * may override this method to create their own sub-classes of the + * TileSet object. */ - protected TileSet createTileSet () + protected TileSetImpl createTileSet () { - return new TileSet(); + return new TileSetImpl(); } /** @@ -167,26 +182,19 @@ public class XMLTileSetParser extends DefaultHandler } /** - * Returns the integer tileset id corresponding to the given - * string, or DEF_TSID if an error occurred. + * Returns the integer represented by the given string or -1 if an + * error occurred. */ - protected int getTileSetId (String str) + protected int getInt (String str) { - if (str == null) { - return DEF_TSID; - } - try { - return Integer.parseInt(str); + return (str == null) ? -1 : Integer.parseInt(str); } catch (NumberFormatException nfe) { - Log.warning("Malformed integer tileset id [str=" + str + "]."); - return DEF_TSID; + Log.warning("Malformed integer value [str=" + str + "]."); + return -1; } } - /** Default tileset id. */ - protected static final int DEF_TSID = -1; - /** Default tileset name. */ protected static final String DEF_NAME = "Untitled"; @@ -199,9 +207,6 @@ public class XMLTileSetParser extends DefaultHandler /** Temporary storage of character data while parsing. */ protected StringBuffer _chars; - /** The tile set whose model is populated while parsing. */ - protected TileSet _tset; - - /** The tile set data model populated while parsing. */ - protected TileSet.TileSetModel _model; + /** The tile set populated while parsing. */ + protected TileSetImpl _tset; } diff --git a/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java b/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java index 4cd8f65f3..661a4542d 100644 --- a/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java +++ b/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java @@ -1,5 +1,5 @@ // -// $Id: DisplayMisoSceneImpl.java,v 1.38 2001/10/08 21:04:25 shaper Exp $ +// $Id: DisplayMisoSceneImpl.java,v 1.39 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene; @@ -10,11 +10,12 @@ import java.util.List; import com.samskivert.util.StringUtil; -import com.threerings.media.tile.TileManager; +import com.threerings.media.tile.*; import com.threerings.whirled.data.Scene; import com.threerings.miso.Log; import com.threerings.miso.scene.util.ClusterUtil; + import com.threerings.miso.tile.MisoTile; /** @@ -24,71 +25,55 @@ import com.threerings.miso.tile.MisoTile; */ public class MisoSceneImpl implements EditableMisoScene { + /** The scene name. */ + public String name = DEF_SCENE_NAME; + + /** The locations within the scene. */ + public ArrayList locations = new ArrayList(); + + /** The clusters within the scene. */ + public ArrayList clusters = new ArrayList(); + + /** The portals to different scenes. */ + public ArrayList portals = new ArrayList(); + + /** The base tiles in the scene. */ + public MisoTile[][] baseTiles; + + /** The fringe tiles in the scene. */ + public Tile[][] fringeTiles; + + /** The object tiles in the scene. */ + public ObjectTile[][] objectTiles; + + /** All tiles in the scene. */ + public Tile[][][] tiles; + /** * Construct a new miso scene object. The base layer tiles are * initialized to contain tiles of the specified default tileset and * tile id. * * @param model the iso scene view model. - * @param tilemgr the tile manager. - * @param deftsid the default tileset id. - * @param deftid the default tile id. + * @param deftile the default tile. */ - public MisoSceneImpl (IsoSceneViewModel model, TileManager tilemgr, - int deftsid, int deftid) + public MisoSceneImpl (IsoSceneViewModel model, MisoTile deftile) { _model = model; - _tilemgr = tilemgr; + _deftile = deftile; - _sid = SID_INVALID; - _name = DEF_SCENE_NAME; + baseTiles = new MisoTile[_model.scenewid][_model.scenehei]; + fringeTiles = new Tile[_model.scenewid][_model.scenehei]; + objectTiles = new ObjectTile[_model.scenewid][_model.scenehei]; + tiles = new Tile[][][] { baseTiles, fringeTiles, objectTiles }; - _locations = new ArrayList(); - _clusters = new ArrayList(); - _portals = new ArrayList(); - - _tiles = new MisoTile[_model.scenewid][_model.scenehei][NUM_LAYERS]; - _deftile = (MisoTile)_tilemgr.getTile(deftsid, deftid); - for (int xx = 0; xx < _model.scenewid; xx++) { - for (int yy = 0; yy < _model.scenehei; yy++) { - for (int ii = 0; ii < NUM_LAYERS; ii++) { - if (ii == LAYER_BASE) { - _tiles[xx][yy][ii] = _deftile; - } - } - } - } - } - - /** - * Construct a new Miso scene object with the given values. - * - * @param model the iso scene view model. - * @param tilemgr the tile manager. - * @param name the scene name. - * @param locations the locations. - * @param portals the portals. - * @param tiles the tiles comprising the scene. - */ - public MisoSceneImpl (IsoSceneViewModel model, TileManager tilemgr, - String name, ArrayList locations, - ArrayList clusters, ArrayList portals, - MisoTile[][][] tiles) - { - _model = model; - _tilemgr = tilemgr; - _sid = SID_INVALID; - _name = name; - _locations = locations; - _clusters = clusters; - _portals = portals; - _tiles = tiles; + initBaseTiles(); } // documentation inherited public String getName () { - return _name; + return name; } // documentation inherited @@ -109,10 +94,32 @@ public class MisoSceneImpl implements EditableMisoScene return null; } - // documentation inherited - public MisoTile[][][] getTiles () + public Tile[][][] getTiles () { - return _tiles; + return tiles; + } + + public Tile[][] getTiles (int lnum) + { + return tiles[lnum]; + } + + // documentation inherited + public MisoTile[][] getBaseLayer () + { + return baseTiles; + } + + // documentation inherited + public Tile[][] getFringeLayer () + { + return fringeTiles; + } + + // documentation inherited + public ObjectTile[][] getObjectLayer () + { + return objectTiles; } // documentation inherited @@ -124,19 +131,19 @@ public class MisoSceneImpl implements EditableMisoScene // documentation inherited public List getLocations () { - return _locations; + return locations; } // documentation inherited public List getClusters () { - return _clusters; + return clusters; } // documentation inherited public List getPortals () { - return _portals; + return portals; } // documentation inherited @@ -160,7 +167,7 @@ public class MisoSceneImpl implements EditableMisoScene // documentation inherited public void setName (String name) { - _name = name; + this.name = name; } // documentation inherited @@ -180,12 +187,12 @@ public class MisoSceneImpl implements EditableMisoScene public void updateLocation (Location loc, int clusteridx) { // add the location if it's not already present - if (!_locations.contains(loc)) { - _locations.add(loc); + if (!locations.contains(loc)) { + locations.add(loc); } // update the cluster contents - ClusterUtil.regroup(_clusters, loc, clusteridx); + ClusterUtil.regroup(clusters, loc, clusteridx); } /** @@ -201,14 +208,14 @@ public class MisoSceneImpl implements EditableMisoScene updateLocation(portal, -1); // don't allow adding a portal more than once - if (_portals.contains(portal)) { + if (portals.contains(portal)) { Log.warning("Attempt to add already-existing portal " + "[portal=" + portal + "]."); return; } // add it to the list - _portals.add(portal); + portals.add(portal); } /** @@ -221,17 +228,17 @@ public class MisoSceneImpl implements EditableMisoScene public void removeLocation (Location loc) { // remove from the location list - if (!_locations.remove(loc)) { + if (!locations.remove(loc)) { // we didn't know about it, so it can't be in a cluster or // the portal list return; } // remove from any possible cluster - ClusterUtil.remove(_clusters, loc); + ClusterUtil.remove(clusters, loc); // remove from any possible existence on the portal list - _portals.remove(loc); + portals.remove(loc); } /** @@ -240,47 +247,41 @@ public class MisoSceneImpl implements EditableMisoScene public String toString () { StringBuffer buf = new StringBuffer(); - buf.append("[name=").append(_name); + buf.append("[name=").append(name); buf.append(", sid=").append(_sid); - buf.append(", locations=").append(StringUtil.toString(_locations)); - buf.append(", clusters=").append(StringUtil.toString(_clusters)); - buf.append(", portals=").append(StringUtil.toString(_portals)); + buf.append(", locations=").append(StringUtil.toString(locations)); + buf.append(", clusters=").append(StringUtil.toString(clusters)); + buf.append(", portals=").append(StringUtil.toString(portals)); return buf.append("]").toString(); } + /** + * Initialize the base tile layer with the default tile. + */ + protected void initBaseTiles () + { + for (int xx = 0; xx < _model.scenewid; xx++) { + for (int yy = 0; yy < _model.scenehei; yy++) { + baseTiles[xx][yy] = _deftile; + } + } + } + /** The default scene name. */ protected static final String DEF_SCENE_NAME = "Untitled Scene"; - /** The scene name. */ - protected String _name; - /** The unique scene id. */ - protected int _sid; + protected int _sid = SID_INVALID; /** The scene version. */ protected int _version; - /** The tiles comprising the scene. */ - public MisoTile[][][] _tiles; - /** The default entrance portal. */ protected Portal _entrance; - /** The locations within the scene. */ - protected ArrayList _locations; - - /** The clusters within the scene. */ - protected ArrayList _clusters; - - /** The portals to different scenes. */ - protected ArrayList _portals; - /** The default tile for the base layer in the scene. */ protected MisoTile _deftile; /** The iso scene view data model. */ protected IsoSceneViewModel _model; - - /** The tile manager. */ - protected TileManager _tilemgr; } diff --git a/src/java/com/threerings/miso/client/IsoSceneView.java b/src/java/com/threerings/miso/client/IsoSceneView.java index 4c99b8273..bdc57770a 100644 --- a/src/java/com/threerings/miso/client/IsoSceneView.java +++ b/src/java/com/threerings/miso/client/IsoSceneView.java @@ -1,5 +1,5 @@ // -// $Id: IsoSceneView.java,v 1.56 2001/09/28 01:31:32 mdb Exp $ +// $Id: IsoSceneView.java,v 1.57 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene; @@ -12,7 +12,6 @@ import java.util.ArrayList; import com.threerings.media.sprite.*; import com.threerings.media.tile.Tile; -import com.threerings.media.tile.TileManager; import com.threerings.miso.Log; import com.threerings.miso.scene.util.AStarPathUtil; @@ -28,14 +27,11 @@ public class IsoSceneView implements SceneView /** * Construct an IsoSceneView object. * - * @param tilemgr the tile manager. * @param spritemgr the sprite manager. * @param model the data model. */ - public IsoSceneView (TileManager tilemgr, SpriteManager spritemgr, - IsoSceneViewModel model) + public IsoSceneView (SpriteManager spritemgr, IsoSceneViewModel model) { - _tilemgr = tilemgr; _spritemgr = spritemgr; setModel(model); @@ -174,7 +170,9 @@ public class IsoSceneView implements SceneView for (int xx = 0; xx < _model.scenewid; xx++) { // skip this tile if it's not marked dirty - if (!_dirty[xx][yy]) continue; + if (!_dirty[xx][yy]) { + continue; + } // get the tile's screen position Polygon poly = _polys[xx][yy]; @@ -183,15 +181,17 @@ public class IsoSceneView implements SceneView for (int kk = 0; kk < MisoScene.NUM_LAYERS; kk++) { // get the tile at these coordinates and layer - Tile tile = tiles[xx][yy][kk]; - if (tile == null) continue; + Tile tile = tiles[kk][xx][yy]; + if (tile == null) { + continue; + } // offset the image y-position by the tile-specific height int ypos = poly.ypoints[0] - _model.tilehhei - (tile.height - _model.tilehei); // draw the tile image - gfx.drawImage(tile.img, poly.xpoints[0], ypos, null); + tile.paint(gfx, poly); } // draw all sprites residing in the current tile @@ -204,7 +204,9 @@ public class IsoSceneView implements SceneView } // bail early if we know we've drawn all dirty tiles - if (++numDrawn == _numDirty) break; + if (++numDrawn == _numDirty) { + break; + } } } } @@ -237,19 +239,23 @@ public class IsoSceneView implements SceneView for (int kk = 0; kk < MisoScene.NUM_LAYERS; kk++) { // grab the tile we're rendering - Tile tile = tiles[tx][ty][kk]; - if (tile == null) continue; + Tile tile = tiles[kk][tx][ty]; + if (tile == null) { + continue; + } + + Polygon poly = _polys[tx][ty]; // determine screen y-position, accounting for // tile image height int ypos = screenY - (tile.height - _model.tilehei); // draw the tile image at the appropriate screen position - gfx.drawImage(tile.img, screenX, ypos, null); + tile.paint(gfx, poly); // draw all sprites residing in the current tile // TODO: simplify other tile positioning here to use poly - _spritemgr.renderSprites(gfx, _polys[tx][ty]); + _spritemgr.renderSprites(gfx, poly); } // draw tile coordinates in each tile @@ -505,7 +511,9 @@ public class IsoSceneView implements SceneView } // do nothing if the tile's already dirty - if (_dirty[x][y]) return; + if (_dirty[x][y]) { + return; + } // mark the tile dirty _numDirty++; @@ -543,7 +551,7 @@ public class IsoSceneView implements SceneView // get a reasonable path from start to end List tilepath = AStarPathUtil.getPath( - _scene.getTiles(), _model.scenewid, _model.scenehei, + _scene.getBaseLayer(), _model.scenewid, _model.scenehei, sprite, stpos.x, stpos.y, tbx, tby); if (tilepath == null) { return null; @@ -624,7 +632,4 @@ public class IsoSceneView implements SceneView /** The sprite manager. */ protected SpriteManager _spritemgr; - - /** The tile manager. */ - protected TileManager _tilemgr; } diff --git a/src/java/com/threerings/miso/client/MisoScene.java b/src/java/com/threerings/miso/client/MisoScene.java index f1d28410a..297fbc025 100644 --- a/src/java/com/threerings/miso/client/MisoScene.java +++ b/src/java/com/threerings/miso/client/MisoScene.java @@ -1,10 +1,12 @@ // -// $Id: MisoScene.java,v 1.4 2001/10/08 21:04:25 shaper Exp $ +// $Id: MisoScene.java,v 1.5 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene; import java.util.List; +import com.threerings.media.tile.Tile; +import com.threerings.media.tile.ObjectTile; import com.threerings.miso.tile.MisoTile; /** @@ -40,38 +42,58 @@ public interface MisoScene public String getName (); /** - * Return the tiles that comprise this scene. + * Returns an array of the tile layers that comprise the scene. */ - public MisoTile[][][] getTiles (); + public Tile[][][] getTiles (); /** - * Return the default tile for the base layer of the scene. + * Returns the tile layer for the specified layer index. + */ + public Tile[][] getTiles (int lnum); + + /** + * Returns the tiles that comprise the base layer of this scene. + */ + public MisoTile[][] getBaseLayer (); + + /** + * Returns the tiles that comprise the fringe layer of this scene. + */ + public Tile[][] getFringeLayer (); + + /** + * Returns the tiles that comprise the object layer of this scene. + */ + public ObjectTile[][] getObjectLayer (); + + /** + * Returns the default tile for the base layer of the scene. */ public MisoTile getDefaultTile (); /** - * Return the locations in this scene. The locations list should - * contain all locations and portals in the scene. The list returned - * by this method should not be modified. + * Returns the locations in this scene. The locations list should + * contain all locations and portals in the scene. The list + * returned by this method should not be modified. */ public List getLocations (); /** - * Return the clusters in this scene. The clusters will reference all - * of the locations that are clustered. The list returned by this - * method should not be modified. + * Returns the clusters in this scene. The clusters will reference + * all of the locations that are clustered. The list returned by + * this method should not be modified. */ public List getClusters (); /** - * Return the portals associated with this scene. Portals should never - * be part of a cluster. The list returned by this method should - * not be modified. + * Returns the portals associated with this scene. Portals should + * never be part of a cluster. The list returned by this method + * should not be modified. */ public List getPortals (); /** - * Return the portal that is the default entrance to this scene. + * Returns the portal that is the default entrance to this scene. */ public Portal getEntrance (); } diff --git a/src/java/com/threerings/miso/client/SceneView.java b/src/java/com/threerings/miso/client/SceneView.java index bacffd98f..d7dd05e47 100644 --- a/src/java/com/threerings/miso/client/SceneView.java +++ b/src/java/com/threerings/miso/client/SceneView.java @@ -1,5 +1,5 @@ // -// $Id: SceneView.java,v 1.15 2001/08/22 02:14:57 mdb Exp $ +// $Id: SceneView.java,v 1.16 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene; @@ -8,7 +8,6 @@ import java.util.List; import com.threerings.media.sprite.DirtyRectList; import com.threerings.media.sprite.Path; -import com.threerings.media.tile.Tile; /** * The scene view interface provides an interface to be implemented by diff --git a/src/java/com/threerings/miso/client/SceneViewPanel.java b/src/java/com/threerings/miso/client/SceneViewPanel.java index 589d7e5c0..b91f71eff 100644 --- a/src/java/com/threerings/miso/client/SceneViewPanel.java +++ b/src/java/com/threerings/miso/client/SceneViewPanel.java @@ -1,5 +1,5 @@ // -// $Id: SceneViewPanel.java,v 1.14 2001/09/21 02:30:35 mdb Exp $ +// $Id: SceneViewPanel.java,v 1.15 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene; @@ -9,7 +9,6 @@ import javax.swing.*; import com.samskivert.util.Config; import com.threerings.media.sprite.*; -import com.threerings.media.tile.TileManager; import com.threerings.miso.util.MisoUtil; /** @@ -23,14 +22,13 @@ public class SceneViewPanel /** * Construct the panel and initialize it with a context. */ - public SceneViewPanel (Config config, TileManager tilemgr, - SpriteManager spritemgr) + public SceneViewPanel (Config config, SpriteManager spritemgr) { // create the data model for the scene view _smodel = new IsoSceneViewModel(config); // create the scene view - _view = newSceneView(tilemgr, spritemgr, _smodel); + _view = newSceneView(spritemgr, _smodel); // set our attributes for optimal display performance setDoubleBuffered(false); @@ -41,9 +39,9 @@ public class SceneViewPanel * Constructs the underlying scene view implementation. */ protected IsoSceneView newSceneView ( - TileManager tmgr, SpriteManager smgr, IsoSceneViewModel model) + SpriteManager smgr, IsoSceneViewModel model) { - return new IsoSceneView(tmgr, smgr, model); + return new IsoSceneView(smgr, model); } /** diff --git a/src/java/com/threerings/miso/client/util/AStarPathUtil.java b/src/java/com/threerings/miso/client/util/AStarPathUtil.java index 779d46ca3..208b87760 100644 --- a/src/java/com/threerings/miso/client/util/AStarPathUtil.java +++ b/src/java/com/threerings/miso/client/util/AStarPathUtil.java @@ -1,5 +1,5 @@ // -// $Id: AStarPathUtil.java,v 1.5 2001/10/08 21:04:25 shaper Exp $ +// $Id: AStarPathUtil.java,v 1.6 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene.util; @@ -43,7 +43,7 @@ public class AStarPathUtil * @return the list of points in the path. */ public static List getPath ( - MisoTile tiles[][][], int tilewid, int tilehei, Traverser trav, + MisoTile tiles[][], int tilewid, int tilehei, Traverser trav, int ax, int ay, int bx, int by) { AStarInfo info = new AStarInfo(tiles, tilewid, tilehei, trav, bx, by); @@ -109,8 +109,7 @@ public class AStarPathUtil } // skip node if it's impassable - // TODO: fix hard-coded consideration of only the base layer - if (!info.trav.canTraverse(info.tiles[x][y][0])) { + if (!info.trav.canTraverse(info.tiles[x][y])) { return; } @@ -198,7 +197,7 @@ public class AStarPathUtil class AStarInfo { /** The array of tiles being traversed. */ - public MisoTile tiles[][][]; + public MisoTile tiles[][]; /** The tile array dimensions. */ public int tilewid, tilehei; @@ -219,7 +218,7 @@ class AStarInfo public int destx, desty; public AStarInfo ( - MisoTile tiles[][][], int tilewid, int tilehei, Traverser trav, + MisoTile tiles[][], int tilewid, int tilehei, Traverser trav, int destx, int desty) { // save off references diff --git a/src/java/com/threerings/miso/client/util/MisoSceneUtil.java b/src/java/com/threerings/miso/client/util/MisoSceneUtil.java index 6607beb7c..21d4e6703 100644 --- a/src/java/com/threerings/miso/client/util/MisoSceneUtil.java +++ b/src/java/com/threerings/miso/client/util/MisoSceneUtil.java @@ -1,5 +1,5 @@ // -// $Id: MisoSceneUtil.java,v 1.2 2001/09/28 01:31:32 mdb Exp $ +// $Id: MisoSceneUtil.java,v 1.3 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene.util; @@ -15,6 +15,31 @@ public class MisoSceneUtil /** String translations of each tile layer name. */ public static final String[] XLATE_LAYERS = { "Base", "Fringe", "Object" }; + /** + * Returns the layer index number for the named layer. Layer + * names are looked up via XLATE_LAYERS and are + * case-insensitive. + * + * @param name the layer name. + */ + public static int getLayerIndex (String name) + { + if (name == null) { + return DEF_LAYER; + } + + name = name.toLowerCase(); + + for (int ii = 0; ii < MisoScene.NUM_LAYERS; ii++) { + String b = MisoSceneUtil.XLATE_LAYERS[ii].toLowerCase(); + if (name.equals(b)) { + return ii; + } + } + + return DEF_LAYER; + } + /** * Return the location object at the given full coordinates, or null * if no location is currently present at that location. @@ -74,4 +99,7 @@ public class MisoSceneUtil { return ClusterUtil.getClusterIndex(scene.getClusters(), loc); } + + /** The default layer index for an unknown named layer. */ + protected static final int DEF_LAYER = MisoScene.LAYER_BASE; } diff --git a/src/java/com/threerings/miso/tile/BaseTileSet.java b/src/java/com/threerings/miso/tile/BaseTileSet.java index c0f2053e6..f308bdf70 100644 --- a/src/java/com/threerings/miso/tile/BaseTileSet.java +++ b/src/java/com/threerings/miso/tile/BaseTileSet.java @@ -1,10 +1,12 @@ // -// $Id: BaseTileSet.java,v 1.1 2001/10/08 21:04:25 shaper Exp $ +// $Id: BaseTileSet.java,v 1.2 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.tile; import com.threerings.media.tile.*; +import com.threerings.miso.scene.MisoScene; + /** * The miso tile set class extends the base tile set class to add * support for tile passability. Passability is used to determine @@ -12,28 +14,33 @@ import com.threerings.media.tile.*; * traverse a particular tile in a {@link * com.threerings.miso.scene.MisoScene}. */ -public class MisoTileSet extends TileSet +public class MisoTileSet extends TileSetImpl { - public MisoTileSet () - { - _model = new MisoTileSetModel(); - } + /** The miso scene layer the tiles are intended for. */ + public int layer; + + /** Whether each tile is passable. */ + public int passable[]; public Tile createTile (int tid) { - MisoTile tile = new MisoTile(_model.tsid, tid); + // only create miso tiles for the base layer + if (layer != MisoScene.LAYER_BASE) { + return super.createTile(tid); + } - // set the tile's passability, defaulting to passable if this - // tileset has no passability specified - int passable[] = ((MisoTileSetModel)_model).passable; - tile.passable = (passable == null || (passable[tid] == 1)); - - return tile; + return new MisoTile(tsid, tid); } - protected static class MisoTileSetModel extends TileSetModel + protected void populateTile (Tile tile) { - /** Whether each tile is passable. */ - public int passable[]; + super.populateTile(tile); + + if (tile instanceof MisoTile) { + // set the tile's passability, defaulting to passable if this + // tileset has no passability specified + ((MisoTile)tile).passable = + (passable == null || (passable[tile.tid] == 1)); + } } } diff --git a/src/java/com/threerings/miso/tile/TileUtil.java b/src/java/com/threerings/miso/tile/TileUtil.java index 3783f8db2..2cae6ea11 100644 --- a/src/java/com/threerings/miso/tile/TileUtil.java +++ b/src/java/com/threerings/miso/tile/TileUtil.java @@ -1,5 +1,5 @@ // -// $Id: TileUtil.java,v 1.5 2001/09/13 19:10:26 mdb Exp $ +// $Id: TileUtil.java,v 1.6 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.tile; @@ -9,6 +9,7 @@ import com.threerings.media.sprite.MultiFrameImage; import com.threerings.media.sprite.Sprite; import com.threerings.media.tile.*; +import com.threerings.miso.Log; import com.threerings.miso.scene.AmbulatorySprite; /** @@ -28,19 +29,27 @@ public class TileUtil * * @return the array of multi-frame sprite images. */ - public static MultiFrameImage[] getAmbulatorySpriteFrames ( - TileManager tilemgr, int tsid) + public static MultiFrameImage[] + getAmbulatorySpriteFrames (TileManager tilemgr, int tsid) { MultiFrameImage[] anims = new MultiFrameImage[Sprite.NUM_DIRECTIONS]; - for (int ii = 0; ii < Sprite.NUM_DIRECTIONS; ii++) { - Tile[] tiles = new Tile[NUM_DIR_FRAMES]; - for (int jj = 0; jj < NUM_DIR_FRAMES; jj++) { - int idx = (ii * NUM_DIR_FRAMES) + jj; - tiles[jj] = tilemgr.getTile(tsid, idx); - } - anims[ii] = new MultiTileImage(tiles); - } + try { + for (int ii = 0; ii < Sprite.NUM_DIRECTIONS; ii++) { + Tile[] tiles = new Tile[NUM_DIR_FRAMES]; + for (int jj = 0; jj < NUM_DIR_FRAMES; jj++) { + int idx = (ii * NUM_DIR_FRAMES) + jj; + tiles[jj] = tilemgr.getTile(tsid, idx); + } + + anims[ii] = new MultiTileImage(tiles); + } + + } catch (TileException te) { + Log.warning("Exception retrieving ambulatory sprite tiles " + + "[te=" + te + "]."); + return null; + } return anims; } diff --git a/src/java/com/threerings/miso/tile/tools/xml/XMLMisoTileSetParser.java b/src/java/com/threerings/miso/tile/tools/xml/XMLMisoTileSetParser.java index fb81e155c..8a82ca1bc 100644 --- a/src/java/com/threerings/miso/tile/tools/xml/XMLMisoTileSetParser.java +++ b/src/java/com/threerings/miso/tile/tools/xml/XMLMisoTileSetParser.java @@ -1,11 +1,13 @@ // -// $Id: XMLMisoTileSetParser.java,v 1.1 2001/10/08 21:04:25 shaper Exp $ +// $Id: XMLMisoTileSetParser.java,v 1.2 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.tile; -import com.samskivert.util.StringUtil; +import org.xml.sax.*; +import com.samskivert.util.StringUtil; import com.threerings.media.tile.*; +import com.threerings.miso.scene.util.MisoSceneUtil; /** * Extends the base XML tile set parser to construct {@link @@ -14,17 +16,30 @@ import com.threerings.media.tile.*; */ public class XMLMisoTileSetParser extends XMLTileSetParser { + // documentation inherited + public void startElement (String uri, String localName, + String qName, Attributes attributes) + { + super.startElement(uri, localName, qName, attributes); + + if (qName.equals("tileset")) { + String val = attributes.getValue("layer"); + ((MisoTileSet)_tset).layer = MisoSceneUtil.getLayerIndex(val); + } + } + + // documentation inherited protected void finishElement (String qName, String str) { super.finishElement(qName, str); if (qName.equals("passable")) { - ((MisoTileSet.MisoTileSetModel)_model).passable = - StringUtil.parseIntArray(str); + ((MisoTileSet)_tset).passable = StringUtil.parseIntArray(str); } } - protected TileSet createTileSet () + // documentation inherited + protected TileSetImpl createTileSet () { return new MisoTileSet(); } diff --git a/src/java/com/threerings/miso/tools/xml/XMLSceneParser.java b/src/java/com/threerings/miso/tools/xml/XMLSceneParser.java index f2642a774..65cc3b48a 100644 --- a/src/java/com/threerings/miso/tools/xml/XMLSceneParser.java +++ b/src/java/com/threerings/miso/tools/xml/XMLSceneParser.java @@ -1,5 +1,5 @@ // -// $Id: XMLSceneParser.java,v 1.17 2001/10/08 21:04:25 shaper Exp $ +// $Id: XMLSceneParser.java,v 1.18 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene.xml; @@ -13,6 +13,7 @@ import org.xml.sax.helpers.DefaultHandler; import com.samskivert.util.*; import com.samskivert.xml.XMLUtil; + import com.threerings.media.tile.*; import com.threerings.miso.Log; @@ -43,10 +44,7 @@ public class XMLSceneParser extends DefaultHandler } else if (_tag.equals("row")) { _info.rownum = getInt(attributes.getValue("rownum")); - - // get the column start value if present - String strcs = attributes.getValue("colstart"); - if (strcs != null) _info.colstart = getInt(strcs); + _info.colstart = getInt(attributes.getValue("colstart")); } } @@ -56,11 +54,13 @@ public class XMLSceneParser extends DefaultHandler // for the elements we're tracking at this point, so proceed // with saving off element values for use when we construct // the scene object. + String str = _chars.toString().trim(); + if (qName.equals("name")) { - _info.name = _chars.toString().trim(); + _info.scene.name = str; } else if (qName.equals("version")) { - int version = getInt(_chars.toString()); + int version = getInt(str); if (version < 0 || version > XMLSceneVersion.VERSION) { Log.warning( "Unrecognized scene file format version, will attempt " + @@ -70,27 +70,22 @@ public class XMLSceneParser extends DefaultHandler } } else if (qName.equals("locations")) { - int vals[] = StringUtil.parseIntArray(_chars.toString()); - _info.locations = toLocationsList(vals); + int vals[] = StringUtil.parseIntArray(str); + addLocations(_info.scene.locations, vals); } else if (qName.equals("cluster")) { - int vals[] = StringUtil.parseIntArray(_chars.toString()); - _info.clusters.add(toCluster(_info.locations, vals)); + int vals[] = StringUtil.parseIntArray(str); + _info.scene.clusters.add(toCluster(_info.scene.locations, vals)); } else if (qName.equals("portals")) { - String vals[] = StringUtil.parseStringArray(_chars.toString()); - _info.portals = toPortalList(_info.locations, vals); + String vals[] = StringUtil.parseStringArray(str); + addPortals(_info.scene.portals, _info.scene.locations, vals); } else if (qName.equals("row")) { - if (_info.lnum == MisoScene.LAYER_BASE) { - readRowData(_info, _chars.toString()); - } else { - readSparseRowData(_info, _chars.toString()); - } + addTileRow(_info, str); } else if (qName.equals("scene")) { - // construct the scene object on tag close - _info.constructScene(_tilemgr); + // nothing for now } // note that we're not within a tag to avoid considering any @@ -111,6 +106,24 @@ public class XMLSceneParser extends DefaultHandler _chars.append(ch, start, length); } + /** + * Add the tiles described by the given data to the scene. + */ + protected void addTileRow (SceneInfo info, String data) + { + try { + if (info.lnum == MisoScene.LAYER_BASE) { + readRowData(info, data); + } else { + readSparseRowData(info, data); + } + + } catch (TileException te) { + Log.warning("Exception reading scene tile data " + + "[te=" + te + "]."); + } + } + /** * Given a string of comma-delimited tuples as (tileset id, tile * id), populate the scene info tile array with tiles to suit. @@ -119,6 +132,7 @@ public class XMLSceneParser extends DefaultHandler * @param data the tile data. */ protected void readRowData (SceneInfo info, String data) + throws TileException { int[] vals = StringUtil.parseIntArray(data); @@ -133,9 +147,10 @@ public class XMLSceneParser extends DefaultHandler } // create the tile objects in the tile array + Tile[][] tiles = info.scene.getTiles(info.lnum); for (int xx = 0; xx < vals.length; xx += 2) { - MisoTile tile = (MisoTile)_tilemgr.getTile(vals[xx], vals[xx + 1]); - info.tiles[xx / 2][info.rownum][info.lnum] = tile; + Tile tile = _tilemgr.getTile(vals[xx], vals[xx + 1]); + tiles[xx / 2][info.rownum] = tile; } } @@ -151,6 +166,7 @@ public class XMLSceneParser extends DefaultHandler * @param data the tile data. */ protected void readSparseRowData (SceneInfo info, String data) + throws TileException { int[] vals = StringUtil.parseIntArray(data); @@ -164,10 +180,11 @@ public class XMLSceneParser extends DefaultHandler } // create the tile objects in the tile array + Tile[][] tiles = info.scene.getTiles(info.lnum); for (int xx = 0; xx < vals.length; xx += 2) { - MisoTile tile = (MisoTile)_tilemgr.getTile(vals[xx], vals[xx + 1]); + Tile tile = _tilemgr.getTile(vals[xx], vals[xx + 1]); int xidx = info.colstart + (xx / 2); - info.tiles[xidx][info.rownum][info.lnum] = tile; + tiles[xidx][info.rownum] = tile; } } @@ -191,37 +208,34 @@ public class XMLSceneParser extends DefaultHandler } /** - * Given an array of integer values, return a list of the - * Location objects represented therein, constructed - * from each successive triplet of values as (x, y, orientation) - * in the integer array. + * Given an array of integer values, add the Location + * objects represented therein to the given list, constructed from + * each successive triplet of values as (x, y, orientation) in the + * integer array. * * @param vals the integer values. - * - * @return the location list, or null if an error occurred. */ - protected ArrayList toLocationsList (int[] vals) + protected void addLocations (ArrayList list, int[] vals) { // make sure we have a seemingly-appropriate number of points - if ((vals.length % 3) != 0) return null; + if ((vals.length % 3) != 0) { + return; + } // read in all of the locations and add to the list - ArrayList list = new ArrayList(); for (int ii = 0; ii < vals.length; ii += 3) { Location loc = new Location( vals[ii], vals[ii+1], vals[ii+2]); list.add(loc); } - - return list; } /** - * Given an array of string values, return a list of - * Portal objects constructed from each successive - * triplet of values as (locidx, portal name) in the array. The - * list of Location objects must have already been - * fully read previously. + * Given an array of string values, add the Portal + * objects constructed from each successive triplet of values as + * (locidx, portal name) in the array to the given portal list. + * The list of Location objects must have already + * been fully read previously. * *

This is something of a hack since we perhaps ought to parse * the original String into its constituent components ourselves, @@ -229,20 +243,19 @@ public class XMLSceneParser extends DefaultHandler * StringUtil.toString() method to take care of * tokenizing things for us, so, there you have it. * - * @param ArrayList the location list. + * @param portals the portal list. + * @param locs the location list. * @param vals the String values. - * - * @return the portal list, or null if an error occurred. */ - protected ArrayList toPortalList (ArrayList locs, String[] vals) + protected void addPortals ( + ArrayList portals, ArrayList locs, String[] vals) { // make sure we have an appropriate number of values if ((vals.length % 2) != 0) { - return null; + return; } // read in all of the portals - ArrayList portals = new ArrayList(); for (int ii = 0; ii < vals.length; ii += 2) { int locidx = getInt(vals[ii]); @@ -253,8 +266,6 @@ public class XMLSceneParser extends DefaultHandler // upgrade the corresponding location in the location list locs.set(locidx, portal); } - - return portals; } /** @@ -264,7 +275,7 @@ public class XMLSceneParser extends DefaultHandler protected int getInt (String str) { try { - return Integer.parseInt(str); + return (str == null) ? -1 : Integer.parseInt(str); } catch (NumberFormatException nfe) { Log.warning("Malformed integer value [str=" + str + "]."); return -1; @@ -329,25 +340,16 @@ public class XMLSceneParser extends DefaultHandler /** Temporary storage of scene info while parsing. */ protected SceneInfo _info; + // TODO: allow specifying the entrance location for a scene in the + // editor, read/write to XML scene description files. + /** - * A class to hold temporary information on a scene. + * A class to hold the information gathered while parsing. */ class SceneInfo { - /** The scene name. */ - public String name; - - /** The location list. */ - public ArrayList locations; - - /** The portal list. */ - public ArrayList portals; - - /** The cluster list. */ - public ArrayList clusters; - - /** The tile array. */ - public MisoTile[][][] tiles; + /** The scene populated with data while parsing. */ + public MisoSceneImpl scene; /** The current layer number being processed. */ public int lnum; @@ -358,20 +360,9 @@ public class XMLSceneParser extends DefaultHandler /** The column at which the current row data begins. */ public int colstart; - /** The scene object constructed once all scene info is parsed. */ - public EditableMisoScene scene; - public SceneInfo () { - int width = _model.scenewid, height = _model.scenehei; - tiles = new MisoTile[width][height][MisoScene.NUM_LAYERS]; - clusters = new ArrayList(); - } - - public void constructScene (TileManager tilemgr) - { - scene = new MisoSceneImpl( - _model, tilemgr, name, locations, clusters, portals, tiles); + scene = new MisoSceneImpl(_model, null); } } } diff --git a/src/java/com/threerings/miso/tools/xml/XMLSceneWriter.java b/src/java/com/threerings/miso/tools/xml/XMLSceneWriter.java index 004534f93..ca9b34ea7 100644 --- a/src/java/com/threerings/miso/tools/xml/XMLSceneWriter.java +++ b/src/java/com/threerings/miso/tools/xml/XMLSceneWriter.java @@ -1,5 +1,5 @@ // -// $Id: XMLSceneWriter.java,v 1.14 2001/09/28 01:31:32 mdb Exp $ +// $Id: XMLSceneWriter.java,v 1.15 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.scene.xml; @@ -211,7 +211,7 @@ public class XMLSceneWriter extends DataWriter int numtiles = colstart + len; for (int ii = colstart; ii < numtiles; ii++) { - Tile tile = tiles[ii][rownum][lnum]; + Tile tile = tiles[lnum][ii][rownum]; if (tile == null) { Log.warning("Null tile [x=" + ii + ", rownum=" + rownum + ", lnum=" + lnum + "]."); @@ -277,7 +277,7 @@ public class XMLSceneWriter extends DataWriter Tile[][][] tiles = scene.getTiles(); int start = -1, len = 0; for (int xx = info[0]; xx < _model.scenewid; xx++) { - Tile tile = tiles[xx][rownum][lnum]; + Tile tile = tiles[lnum][xx][rownum]; if (tile == null) { if (start == -1) { continue; diff --git a/src/java/com/threerings/nodemap/Node.java b/src/java/com/threerings/nodemap/Node.java index 506f41ebf..ce1b6736e 100644 --- a/src/java/com/threerings/nodemap/Node.java +++ b/src/java/com/threerings/nodemap/Node.java @@ -1,5 +1,5 @@ // -// $Id: Node.java,v 1.5 2001/08/28 23:50:45 shaper Exp $ +// $Id: Node.java,v 1.6 2001/10/11 00:41:27 shaper Exp $ package com.threerings.nodemap; @@ -37,6 +37,9 @@ public abstract class Node implements ToolTipProvider * added to the node more than once. * * @param e the new edge. + * + * @exception DuplicateEdgeException thrown if the node already + * contains the given edge. */ protected void addEdge (Edge e) throws DuplicateEdgeException { @@ -50,7 +53,7 @@ public abstract class Node implements ToolTipProvider } /** - * Return an Iterator object that iterates over the + * Returns an Iterator object that iterates over the * edges leaving this node. * * @return the iterator object. @@ -90,7 +93,7 @@ public abstract class Node implements ToolTipProvider } /** - * Return whether the node contains the given point. + * Returns whether the node contains the given point. * * @param x the x-position. * @param y the y-position. @@ -104,7 +107,7 @@ public abstract class Node implements ToolTipProvider } /** - * Return the node width in pixels. + * Returns the node width in pixels. */ public int getWidth () { @@ -112,7 +115,7 @@ public abstract class Node implements ToolTipProvider } /** - * Return the node height in pixels. + * Returns the node height in pixels. */ public int getHeight () { @@ -192,7 +195,7 @@ public abstract class Node implements ToolTipProvider public void handleMouseClicked (int x, int y) { } /** - * Return a string representation of this node. + * Returns a string representation of this node. */ public String toString () { diff --git a/src/java/com/threerings/nodemap/NodeMap.java b/src/java/com/threerings/nodemap/NodeMap.java index f1eecdde1..91b6d343b 100644 --- a/src/java/com/threerings/nodemap/NodeMap.java +++ b/src/java/com/threerings/nodemap/NodeMap.java @@ -1,5 +1,5 @@ // -// $Id: NodeMap.java,v 1.4 2001/08/28 23:50:45 shaper Exp $ +// $Id: NodeMap.java,v 1.5 2001/10/11 00:41:27 shaper Exp $ package com.threerings.nodemap; @@ -36,7 +36,9 @@ public class NodeMap public void layout () { // do nothing if we have no nodes - if (_nodes.size() == 0) return; + if (_nodes.size() == 0) { + return; + } // default to using the first node as the root if (_root == null) { @@ -54,7 +56,8 @@ public class NodeMap } /** - * Calculate the bounding rectangle that wholly contains the node map. + * Calculate the bounding rectangle that wholly contains the node + * map. */ protected void updateBounds () { @@ -126,6 +129,9 @@ public class NodeMap * present in the node map more than once. * * @param n the node to add. + * + * @exception DuplicateNodeException thrown if the node already + * exists in the node map. */ public void addNode (Node n) throws DuplicateNodeException { @@ -146,6 +152,11 @@ public class NodeMap * * @param n the node. * @param e the edge to add. + * + * @exception NoSuchNodeException thrown if the given node does + * not exist in the node map. + * @exception DuplicateEdgeException thrown if the given node + * already contains the given edge. */ public void addEdge (Node n, Edge e) throws NoSuchNodeException, DuplicateEdgeException @@ -165,6 +176,9 @@ public class NodeMap * present in the node map. * * @param n the root node. + * + * @exception NoSuchNodeException thrown if the given node does + * not exist in the node map. */ public void setRootNode (Node n) throws NoSuchNodeException { @@ -177,7 +191,7 @@ public class NodeMap } /** - * Return the dimensions of the node map in pixels. + * Returns the dimensions of the node map in pixels. */ public Dimension getSize () { @@ -190,7 +204,7 @@ public class NodeMap } /** - * Return the bounding rectangle of the node map. + * Returns the bounding rectangle of the node map. */ public Rectangle getBounds () { @@ -204,7 +218,7 @@ public class NodeMap * events. * * @param x the mouse x-coordinate. - * @param y the ymouse y-coordinate. + * @param y the mouse y-coordinate. */ public void handleMouseMoved (int x, int y) { @@ -263,7 +277,7 @@ public class NodeMap * Inform any affected nodes of mouse-clicked events. * * @param x the mouse x-coordinate. - * @param y the ymouse y-coordinate. + * @param y the mouse y-coordinate. */ public void handleMouseClicked (int x, int y) { diff --git a/src/java/com/threerings/nodemap/NodeMapPanel.java b/src/java/com/threerings/nodemap/NodeMapPanel.java index 5c18fbc1c..9c13157f6 100644 --- a/src/java/com/threerings/nodemap/NodeMapPanel.java +++ b/src/java/com/threerings/nodemap/NodeMapPanel.java @@ -1,5 +1,5 @@ // -// $Id: NodeMapPanel.java,v 1.4 2001/09/28 00:46:54 shaper Exp $ +// $Id: NodeMapPanel.java,v 1.5 2001/10/11 00:41:27 shaper Exp $ package com.threerings.nodemap; @@ -20,7 +20,7 @@ public class NodeMapPanel extends JPanel implements MouseListener, MouseMotionListener, ToolTipObserver { /** - * Construct a node map panel. + * Constructs a node map panel. */ public NodeMapPanel () { @@ -28,7 +28,7 @@ public class NodeMapPanel extends JPanel } /** - * Construct a node map panel that displays the given node map. + * Constructs a node map panel that displays the given node map. * * @param map the node map to display. */ @@ -39,7 +39,7 @@ public class NodeMapPanel extends JPanel } /** - * Initialize the node map panel. + * Initializes the node map panel. */ protected void init () { @@ -49,7 +49,7 @@ public class NodeMapPanel extends JPanel } /** - * Set the node map displayed by this panel. + * Sets the node map displayed by this panel. * * @param map the node map to display. */ diff --git a/tests/rsrc/config/miso/tilesets.xml b/tests/rsrc/config/miso/tilesets.xml index 048e93dec..9375ab8cb 100644 --- a/tests/rsrc/config/miso/tilesets.xml +++ b/tests/rsrc/config/miso/tilesets.xml @@ -1,33 +1,33 @@ - + - + media/miso/tiles/base.png 16, 16 32, 32 10, 10 - + media/miso/tiles/wall.png 45, 45 32, 32 3, 3 - + media/miso/tiles/icons.png 20, 49 32, 32 9, 2 - + media/miso/tiles/character.png 94, 94, 94, 94, 94, 94, 94, 94 94, 94, 94, 94, 94, 94, 94, 94 @@ -36,7 +36,7 @@ 39, 18 - + media/miso/tiles/character-yellow.png 94, 94, 94, 94, 94, 94, 94, 94 94, 94, 94, 94, 94, 94, 94, 94 @@ -45,7 +45,7 @@ 39, 18 - + media/miso/tiles/character-black.png 94, 94, 94, 94, 94, 94, 94, 94 94, 94, 94, 94, 94, 94, 94, 94 @@ -54,7 +54,7 @@ 39, 18 - + media/miso/tiles/sample.png 48 64 @@ -62,21 +62,21 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 - + media/miso/tiles/node-icons.png 16 16 8 - + media/miso/tiles/editor-icons.png 22 20 5 - + media/miso/tiles/building.png 240 64 @@ -84,7 +84,7 @@ 0, 0, 0, 0, 0, 0 - + media/miso/tiles/sword-pieces.png 10 10 diff --git a/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java b/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java index 50d63e835..4b76a2cff 100644 --- a/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java +++ b/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java @@ -1,5 +1,5 @@ // -// $Id: ViewerFrame.java,v 1.18 2001/09/13 19:10:26 mdb Exp $ +// $Id: ViewerFrame.java,v 1.19 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.viewer; @@ -12,6 +12,7 @@ import com.samskivert.swing.*; import com.threerings.media.sprite.*; import com.threerings.media.tile.TileManager; +import com.threerings.media.tile.TileException; import com.threerings.miso.Log; import com.threerings.miso.scene.AmbulatorySprite; @@ -43,10 +44,7 @@ class ViewerFrame extends JFrame implements WindowListener TileManager tilemgr = _ctx.getTileManager(); // add the test character sprite to the sprite manager - MultiFrameImage[] anims = - TileUtil.getAmbulatorySpriteFrames(tilemgr, TSID_CHAR); - AmbulatorySprite sprite = new AmbulatorySprite(300, 300, anims); - spritemgr.addSprite(sprite); + AmbulatorySprite sprite = createSprite(tilemgr, spritemgr); // create a top-level panel to manage everything JPanel top = new JPanel(); @@ -80,6 +78,17 @@ class ViewerFrame extends JFrame implements WindowListener getContentPane().add(top, BorderLayout.CENTER); } + protected AmbulatorySprite createSprite (TileManager tilemgr, + SpriteManager spritemgr) + { + MultiFrameImage[] anims = + TileUtil.getAmbulatorySpriteFrames(tilemgr, TSID_CHAR); + AmbulatorySprite sprite = new AmbulatorySprite(300, 300, anims); + spritemgr.addSprite(sprite); + + return sprite; + } + /** WindowListener interface methods */ public void windowClosing (WindowEvent e) { diff --git a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java index d5fd2ea40..f5a97f7ad 100644 --- a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java +++ b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java @@ -1,5 +1,5 @@ // -// $Id: ViewerSceneViewPanel.java,v 1.17 2001/10/08 21:04:26 shaper Exp $ +// $Id: ViewerSceneViewPanel.java,v 1.18 2001/10/11 00:41:27 shaper Exp $ package com.threerings.miso.viewer; @@ -26,7 +26,7 @@ public class ViewerSceneViewPanel extends SceneViewPanel public ViewerSceneViewPanel ( ViewerContext ctx, SpriteManager spritemgr, AmbulatorySprite sprite) { - super(ctx.getConfig(), ctx.getTileManager(), spritemgr); + super(ctx.getConfig(), spritemgr); _ctx = ctx; _sprite = sprite;