diff --git a/rsrc/config/miso/miso.properties b/rsrc/config/miso/miso.properties index df4149232..d0f239cbe 100644 --- a/rsrc/config/miso/miso.properties +++ b/rsrc/config/miso/miso.properties @@ -1,5 +1,5 @@ # -# $Id: miso.properties,v 1.13 2001/10/15 23:53:43 shaper Exp $ +# $Id: miso.properties,v 1.14 2001/10/26 01:17:21 shaper Exp $ # # Initial test config values for miso development. # @@ -16,8 +16,8 @@ sceneroot = rsrc/scenes # the tileset descriptions tilesets = rsrc/config/miso/tilesets.xml -# the character descriptions -characters = rsrc/config/miso/characters.xml +# the component descriptions +components = rsrc/config/miso/components.xml # the list of building types buildings = Inn, Hall, Bank, Agent, Palace diff --git a/src/java/com/threerings/cast/CharacterComponent.java b/src/java/com/threerings/cast/CharacterComponent.java new file mode 100644 index 000000000..8195d4264 --- /dev/null +++ b/src/java/com/threerings/cast/CharacterComponent.java @@ -0,0 +1,83 @@ +// +// $Id: CharacterComponent.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +import com.threerings.media.sprite.MultiFrameImage; + +/** + * The character component represents a single component that can be + * composited with other character components to comprise an image + * representing a single monolithic character displayable in any of + * the eight cardinal compass directions as detailed in the {@link + * com.threerings.media.sprite.Sprite} class's direction constants. + */ +public class CharacterComponent +{ + /** + * Constructs a character component. + */ + public CharacterComponent (ComponentType type, int cid, + ComponentFrames frames) + { + _type = type; + _cid = cid; + _frames = frames; + } + + /** + * Returns the unique component identifier. + */ + public int getId () + { + return _cid; + } + + /** + * Returns the display frames used to display this component. + */ + public ComponentFrames getFrames () + { + return _frames; + } + + /** + * Returns the {@link ComponentType} object describing the base + * component type information associated with this component. + */ + public ComponentType getType () + { + return _type; + } + + /** + * Returns a string representation of this character component. + */ + public String toString () + { + return "[cid=" + _cid + ", type=" + _type + "]"; + } + + /** + * A class to hold the standing and walking frames of animation + * that comprise a {@link CharacterComponent} object's various + * display images. + */ + public static class ComponentFrames + { + /** The standing animations in each orientation. */ + public MultiFrameImage stand[]; + + /** The walking animations in each orientation. */ + public MultiFrameImage walk[]; + } + + /** The unique character component identifier. */ + protected int _cid; + + /** The animation frames. */ + protected ComponentFrames _frames; + + /** The character component type. */ + protected ComponentType _type; +} diff --git a/src/java/com/threerings/cast/CharacterDescriptor.java b/src/java/com/threerings/cast/CharacterDescriptor.java new file mode 100644 index 000000000..63b932e1c --- /dev/null +++ b/src/java/com/threerings/cast/CharacterDescriptor.java @@ -0,0 +1,44 @@ +// +// $Id: CharacterDescriptor.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +import com.samskivert.util.StringUtil; + +/** + * The character descriptor object contains all necessary information + * on the character components that are composited together to create + * a character image. + */ +public class CharacterDescriptor +{ + /** + * Constructs the character descriptor. + */ + public CharacterDescriptor (int components[]) + { + _components = components; + } + + /** + * Returns a list of the component identifiers comprising the + * character described by this descriptor. + */ + public int[] getComponents () + { + return _components; + } + + /** + * Returns a string representation of this character descriptor. + */ + public String toString () + { + StringBuffer buf = new StringBuffer(); + buf.append("[").append(StringUtil.toString(_components)); + return buf.append("]").toString(); + } + + /** The array of component identifiers. */ + protected int _components[]; +} diff --git a/src/java/com/threerings/cast/CharacterManager.java b/src/java/com/threerings/cast/CharacterManager.java index 6e619ed00..4c189dc93 100644 --- a/src/java/com/threerings/cast/CharacterManager.java +++ b/src/java/com/threerings/cast/CharacterManager.java @@ -1,22 +1,15 @@ // -// $Id: CharacterManager.java,v 1.4 2001/10/25 18:06:17 shaper Exp $ +// $Id: CharacterManager.java,v 1.5 2001/10/26 01:17:21 shaper Exp $ -package com.threerings.miso.scene; +package com.threerings.cast; import java.awt.Point; import java.io.IOException; -import com.samskivert.util.Config; -import com.samskivert.util.HashIntMap; - -import com.threerings.media.sprite.MultiFrameImage; import com.threerings.media.tile.TileManager; -import com.threerings.miso.Log; -import com.threerings.miso.scene.AmbulatorySprite.CharacterImages; -import com.threerings.miso.scene.xml.XMLCharacterParser; -import com.threerings.miso.tile.TileUtil; -import com.threerings.miso.util.MisoUtil; +import com.threerings.cast.Log; +import com.threerings.cast.TileUtil; /** * The character manager provides facilities for constructing sprites @@ -25,82 +18,93 @@ import com.threerings.miso.util.MisoUtil; public class CharacterManager { /** - * Construct the character manager. + * Constructs the character manager. */ - public CharacterManager ( - Config config, TileManager tilemgr, IsoSceneViewModel model) + public CharacterManager (TileManager tilemgr, ComponentRepository repo) { + // save off our objects _tilemgr = tilemgr; - _model = model; - - // load character data descriptions - String file = config.getValue(CHARFILE_KEY, DEFAULT_CHARFILE); - try { - new XMLCharacterParser().loadCharacters(file, _characters); - } catch (IOException ioe) { - Log.warning("Exception loading character descriptions " + - "[ioe=" + ioe + "]."); - } + _repo = repo; } /** - * Returns a sprite representing the character described by the - * given tile set id. + * Returns a {@link CharacterSprite} representing the character + * described by the given {@link CharacterDescriptor}, or + * null if an error occurs. * - * @param the character tile set id. + * @param desc the character descriptor. */ - public AmbulatorySprite getCharacter (int tsid) + public CharacterSprite getCharacter (CharacterDescriptor desc) { - CharacterInfo info = (CharacterInfo)_characters.get(tsid); - if (info == null) { - // no such character - Log.warning("Unknown character requested [tsid=" + tsid + "]."); + // get the list of component ids + int components[] = desc.getComponents(); + + // TODO: here is where we'd iterate through all components + // building up the full composite image of the sprite in each + // orientation, standing and walking. we punt for now, but + // we'll revisit this soon enough. + if (components.length == 0 || components.length > 1) { + Log.warning("Invalid number of components " + + " [size=" + components.length + "]."); return null; } - CharacterImages imgs = TileUtil.getCharacterImages( - _tilemgr, tsid, info.frameCount); + CharacterComponent comp; + try { + // as noted above, no compositing for now. note that when + // we do composite, we probably will want to make sure all + // components share a compatible component type. + comp = _repo.getComponent(components[0]); + } catch (Exception e) { + Log.warning("Exception retrieving character component " + + "[e=" + e + "]."); + return null; + } - AmbulatorySprite sprite = new AmbulatorySprite(_model, 0, 0, imgs); - sprite.setFrameRate(info.fps); - sprite.setOrigin(info.origin.x, info.origin.y); + // instantiate the character sprite + CharacterSprite sprite; + try { + sprite = (CharacterSprite)_charClass.newInstance(); + } catch (Exception e) { + Log.warning("Failed to instantiate character sprite " + + "[e=" + e + "]."); + Log.logStackTrace(e); + return null; + } + + // populate the character sprite with its attributes + ComponentType ctype = comp.getType(); + sprite.setFrames(comp.getFrames()); + sprite.setFrameRate(ctype.fps); + sprite.setOrigin(ctype.origin.x, ctype.origin.y); return sprite; } - /** The config key for the character description file. */ - protected static final String CHARFILE_KEY = - MisoUtil.CONFIG_KEY + ".characters"; + /** + * Instructs the character manager to construct instances of this + * derived class of CharacterSprite. + */ + public void setCharacterClass (Class charClass) + { + // sanity check + if (!CharacterSprite.class.isAssignableFrom(charClass)) { + Log.warning("Requested to use character class that does not " + + "derive from CharacterSprite " + + "[class=" + charClass.getName() + "]."); + return; + } - /** The default character description file. */ - protected static final String DEFAULT_CHARFILE = - "rsrc/config/miso/characters.xml"; - - /** The hashtable of character info objects. */ - protected HashIntMap _characters = new HashIntMap(); + // make a note of it + _charClass = charClass; + } /** The tile manager. */ protected TileManager _tilemgr; - /** The iso scene view model. */ - protected IsoSceneViewModel _model; + /** The component repository. */ + protected ComponentRepository _repo; - /** - * A class that contains character description information for a - * single character for use when constructing the character's - * sprite. - */ - public static class CharacterInfo - { - public int tsid; - public int frameCount; - public int fps; - public Point origin = new Point(); - - public String toString () - { - return "[tsid=" + tsid + ", frameCount=" + frameCount + - ", fps=" + fps + ", origin=" + origin + "]"; - } - } + /** The character class to be created. */ + protected Class _charClass = CharacterSprite.class; } diff --git a/src/java/com/threerings/cast/CharacterSprite.java b/src/java/com/threerings/cast/CharacterSprite.java index fc60cdbfd..07643cc41 100644 --- a/src/java/com/threerings/cast/CharacterSprite.java +++ b/src/java/com/threerings/cast/CharacterSprite.java @@ -1,44 +1,38 @@ // -// $Id: CharacterSprite.java,v 1.15 2001/10/25 18:06:17 shaper Exp $ +// $Id: CharacterSprite.java,v 1.16 2001/10/26 01:17:21 shaper Exp $ -package com.threerings.miso.scene; +package com.threerings.cast; import java.awt.Point; import com.threerings.media.sprite.*; -import com.threerings.miso.Log; -import com.threerings.miso.tile.MisoTile; -import com.threerings.miso.scene.util.IsoUtil; +import com.threerings.cast.Log; +import com.threerings.cast.CharacterComponent.ComponentFrames; /** - * An ambulatory sprite is a sprite that animates itself while walking + * A character sprite is a sprite that animates itself while walking * about in a scene. */ -public class AmbulatorySprite extends Sprite implements Traverser +public class CharacterSprite extends Sprite { /** - * Construct an AmbulatorySprite, with a multi-frame - * image associated with each of the eight compass directions. The - * array should be in the order defined by the Sprite - * direction constants (SW, W, NW, N, NE, E, SE, S). - * - * @param x the sprite x-position in pixels. - * @param y the sprite y-position in pixels. - * @param images the images used to display the sprite when - * standing or walking about. + * Constructs a character sprite. */ - public AmbulatorySprite ( - IsoSceneViewModel model, int x, int y, CharacterImages images) + public CharacterSprite () { - super(x, y); + // assign an arbitrary starting orientation + _orient = DIR_NORTH; + } - // keep track of these - _model = model; - _images = images; - - // give ourselves an initial orientation - setOrientation(DIR_NORTH); + /** + * Sets the walking and standing frames of animation used to + * display this character. + */ + public void setFrames (ComponentFrames frames) + { + _anims = frames; + setFrames(_anims.walk[_orient]); } // documentation inherited @@ -48,9 +42,9 @@ public class AmbulatorySprite extends Sprite implements Traverser // update the sprite frames to reflect the direction if (_path == null) { - setFrames(_images.standing[_orient]); + setFrames(_anims.stand[_orient]); } else { - setFrames(_images.walking[_orient]); + setFrames(_anims.walk[_orient]); } } @@ -110,137 +104,15 @@ public class AmbulatorySprite extends Sprite implements Traverser protected void halt () { // come to a halt looking settled and at peace - setFrames(_images.standing[_orient]); + setFrames(_anims.stand[_orient]); // disable walking animation setAnimationMode(NO_ANIMATION); } - // documentation inherited - public boolean canTraverse (MisoTile tile) - { - // by default, passability is solely the province of the tile - return tile.passable; - } - - /** - * Returns the sprite's location on the x-axis in tile coordinates. - */ - public int getTileX () - { - return _tilex; - } - - /** - * Returns the sprite's location on the y-axis in tile coordinates. - */ - public int getTileY () - { - return _tiley; - } - - /** - * Returns the sprite's location on the x-axis within its current - * tile in fine coordinates. - */ - public int getFineX () - { - return _finex; - } - - /** - * Returns the sprite's location on the y-axis within its current - * tile in fine coordinates. - */ - public int getFineY () - { - return _finey; - } - - // documentation inherited - public void setLocation (int x, int y) - { - super.setLocation(x, y); - - if (_path == null) { - // we only calculate the sprite's tile and fine - // coordinates if we have no path, since paths that move - // us about are responsible for keeping our scene - // coordinates up to date since only they can know where - // we really are while in transition from one place to - // another. - - // get the sprite's position in full coordinates - Point fpos = new Point(); - IsoUtil.screenToFull(_model, _x, _y, fpos); - - // save off the sprite's tile and fine coordinates - _tilex = IsoUtil.fullToTile(fpos.x); - _tiley = IsoUtil.fullToTile(fpos.y); - _finex = IsoUtil.fullToFine(fpos.x); - _finey = IsoUtil.fullToFine(fpos.y); - } - } - - /** - * Sets the sprite's location in tile coordinates; the sprite is - * not actually moved in any way. This method is only intended - * for use in updating the sprite's stored position which is made - * accessible to others that may care to review it. - */ - public void setTileLocation (int x, int y) - { - _tilex = x; - _tiley = y; - } - - /** - * Sets the sprite's location in fine coordinates; the sprite is - * not actually moved in any way. This method is only intended - * for use in updating the sprite's stored position which is made - * accessible to others that may care to review it. - */ - public void setFineLocation (int x, int y) - { - _finex = x; - _finey = y; - } - - // documentation inherited - protected void toString (StringBuffer buf) - { - super.toString(buf); - buf.append(", tilex=").append(_tilex); - buf.append(", tiley=").append(_tiley); - buf.append(", finex=").append(_finex); - buf.append(", finey=").append(_finey); - } - - /** - * A class to hold the images that are used to display the sprite - * while walking about. - */ - public static class CharacterImages - { - /** The images of the sprite standing at rest in each orientation. */ - public MultiFrameImage standing[]; - - /** The images of the sprite walking in each orientation. */ - public MultiFrameImage walking[]; - } - - /** The animation frames for the sprite facing each direction. */ - protected CharacterImages _images; - - /** The iso scene view model. */ - protected IsoSceneViewModel _model; + /** The standing and walking animations for the sprite. */ + protected ComponentFrames _anims; /** The origin of the sprite. */ protected int _xorigin, _yorigin; - - /** The sprite location in tile coordinates. */ - protected int _tilex, _tiley; - - /** The sprite location in fine coordinates. */ - protected int _finex, _finey; } diff --git a/src/java/com/threerings/cast/ComponentRepository.java b/src/java/com/threerings/cast/ComponentRepository.java new file mode 100644 index 000000000..2e9ccd0ce --- /dev/null +++ b/src/java/com/threerings/cast/ComponentRepository.java @@ -0,0 +1,36 @@ +// +// $Id: ComponentRepository.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +import java.util.Iterator; + +/** + * The component repository interface is intended to be implemented by + * classes that provide access to {@link CharacterComponent} objects + * keyed on their unique component identifier. + */ +public interface ComponentRepository +{ + /** + * Returns the {@link CharacterComponent} object for the given + * unique component identifier. + */ + public CharacterComponent getComponent (int cid) + throws NoSuchComponentException, NoSuchComponentTypeException; + + /** + * Returns an iterator over the Integer objects + * representing all available character component identifiers for + * the given character component type identifier. + */ + public Iterator enumerateComponents (int ctid) + throws NoSuchComponentTypeException; + + /** + * Returns an iterator over the Integer objects + * representing all available character component type + * identifiers. + */ + public Iterator enumerateComponentTypes (); +} diff --git a/src/java/com/threerings/cast/ComponentType.java b/src/java/com/threerings/cast/ComponentType.java new file mode 100644 index 000000000..65dab2798 --- /dev/null +++ b/src/java/com/threerings/cast/ComponentType.java @@ -0,0 +1,35 @@ +// +// $Id: ComponentType.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +import java.awt.Point; + +/** + * The component type class contains the base information necessary + * for a variety of {@link CharacterComponent} objects to be usefully + * composited into animation sequences representing a character. + */ +public class ComponentType +{ + /** The unique component type identifier. */ + public int ctid; + + /** The number of animation frames. */ + public int frameCount; + + /** The number of frames per second to show when animating. */ + public int fps; + + /** The origin of the component type's base. */ + public Point origin = new Point(); + + /** + * Returns a string representation of this component type. + */ + public String toString () + { + return "[ctid=" + ctid + ", frameCount=" + frameCount + + ", fps=" + fps + ", origin=" + origin + "]"; + } +} diff --git a/src/java/com/threerings/cast/Log.java b/src/java/com/threerings/cast/Log.java new file mode 100644 index 000000000..81b231cc8 --- /dev/null +++ b/src/java/com/threerings/cast/Log.java @@ -0,0 +1,38 @@ +// +// $Id: Log.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +/** + * A placeholder class that contains a reference to the log object used by + * the cast package. + */ +public class Log +{ + public static com.samskivert.util.Log log = + new com.samskivert.util.Log("cast"); + + /** Convenience function. */ + public static void debug (String message) + { + log.debug(message); + } + + /** Convenience function. */ + public static void info (String message) + { + log.info(message); + } + + /** Convenience function. */ + public static void warning (String message) + { + log.warning(message); + } + + /** Convenience function. */ + public static void logStackTrace (Throwable t) + { + log.logStackTrace(com.samskivert.util.Log.WARNING, t); + } +} diff --git a/src/java/com/threerings/cast/NoSuchComponentException.java b/src/java/com/threerings/cast/NoSuchComponentException.java new file mode 100644 index 000000000..cfc5b16d4 --- /dev/null +++ b/src/java/com/threerings/cast/NoSuchComponentException.java @@ -0,0 +1,24 @@ +// +// $Id: NoSuchComponentException.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +/** + * Thrown when an attempt is made to retrieve a non-existent character + * component from the component repository. + */ +public class NoSuchComponentException extends Exception +{ + public NoSuchComponentException (int cid) + { + super("No such component [cid=" + cid + "]"); + _cid = cid; + } + + public int getId () + { + return _cid; + } + + protected int _cid; +} diff --git a/src/java/com/threerings/cast/NoSuchComponentTypeException.java b/src/java/com/threerings/cast/NoSuchComponentTypeException.java new file mode 100644 index 000000000..1b44a6523 --- /dev/null +++ b/src/java/com/threerings/cast/NoSuchComponentTypeException.java @@ -0,0 +1,24 @@ +// +// $Id: NoSuchComponentTypeException.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +/** + * Thrown when an attempt is made to reference a non-existent + * component type in the component repository. + */ +public class NoSuchComponentTypeException extends Exception +{ + public NoSuchComponentTypeException (int ctid) + { + super("No such component type [ctid=" + ctid + "]"); + _ctid = ctid; + } + + public int getTypeId () + { + return _ctid; + } + + protected int _ctid; +} diff --git a/src/java/com/threerings/miso/tile/TileUtil.java b/src/java/com/threerings/cast/TileUtil.java similarity index 63% rename from src/java/com/threerings/miso/tile/TileUtil.java rename to src/java/com/threerings/cast/TileUtil.java index fbba88b57..e8cee56eb 100644 --- a/src/java/com/threerings/miso/tile/TileUtil.java +++ b/src/java/com/threerings/cast/TileUtil.java @@ -1,23 +1,23 @@ // -// $Id: TileUtil.java,v 1.8 2001/10/25 18:06:17 shaper Exp $ +// $Id: TileUtil.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ -package com.threerings.miso.tile; +package com.threerings.cast; import java.awt.Image; import com.threerings.media.sprite.*; import com.threerings.media.tile.*; -import com.threerings.miso.Log; -import com.threerings.miso.scene.AmbulatorySprite.CharacterImages; +import com.threerings.cast.Log; +import com.threerings.cast.CharacterComponent.ComponentFrames; /** - * Tile-related utility functions. + * Miscellaneous tile-related utility functions. */ public class TileUtil { /** - * Returns a {@link CharacterImages} object containing the frames + * Returns a {@link ComponentFrames} object containing the frames * of animation used to render the sprite while standing or * walking in each of the directions it may face. The tileset id * referenced must contain Sprite.NUM_DIRECTIONS rows @@ -28,42 +28,39 @@ public class TileUtil * @param tilemgr the tile manager to retrieve tiles from. * @param tsid the tileset id containing the sprite tiles. * @param frameCount the number of walking frames of animation. - * - * @return the ambulatory images object. */ - public static CharacterImages getCharacterImages ( + public static ComponentFrames getComponentFrames ( TileManager tilemgr, int tsid, int frameCount) { - CharacterImages images = new CharacterImages(); - images.standing = new MultiFrameImage[Sprite.NUM_DIRECTIONS]; - images.walking = new MultiFrameImage[Sprite.NUM_DIRECTIONS]; + ComponentFrames frames = new ComponentFrames(); + frames.walk = new MultiFrameImage[Sprite.NUM_DIRECTIONS]; + frames.stand = new MultiFrameImage[Sprite.NUM_DIRECTIONS]; try { for (int ii = 0; ii < Sprite.NUM_DIRECTIONS; ii++) { Image walkimgs[] = new Image[frameCount]; - int rowcount = frameCount + 1; for (int jj = 0; jj < rowcount; jj++) { int idx = (ii * rowcount) + jj; Image img = tilemgr.getTile(tsid, idx).img; if (jj == 0) { - images.standing[ii] = new SingleFrameImageImpl(img); + frames.stand[ii] = new SingleFrameImageImpl(img); } else { walkimgs[jj - 1] = img; } } - images.walking[ii] = new MultiFrameImageImpl(walkimgs); + frames.walk[ii] = new MultiFrameImageImpl(walkimgs); } } catch (TileException te) { Log.warning("Exception retrieving character images " + "[te=" + te + "]."); - return null; + return null; } - return images; + return frames; } } diff --git a/src/java/com/threerings/cast/tools/xml/XMLComponentParser.java b/src/java/com/threerings/cast/tools/xml/XMLComponentParser.java new file mode 100644 index 000000000..7b0d87b56 --- /dev/null +++ b/src/java/com/threerings/cast/tools/xml/XMLComponentParser.java @@ -0,0 +1,80 @@ +// +// $Id: XMLComponentParser.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.cast; + +import java.awt.Point; +import java.io.IOException; + +import org.xml.sax.*; + +import com.samskivert.util.HashIntMap; +import com.samskivert.util.StringUtil; +import com.samskivert.xml.SimpleParser; + +public class XMLComponentParser extends SimpleParser +{ + // documentation inherited + public void startElement (String uri, String localName, + String qName, Attributes attributes) + { + if (qName.equals("type")) { + // construct the component type object + ComponentType ct = new ComponentType(); + + // retrieve character attributes + ct.ctid = parseInt(attributes.getValue("ctid")); + ct.frameCount = parseInt(attributes.getValue("frames")); + ct.fps = parseInt(attributes.getValue("fps")); + parsePoint(attributes.getValue("origin"), ct.origin); + + Log.info("Parsed component type [ct=" + ct + "]."); + + // save the component type + _types.put(ct.ctid, ct); + + } else if (qName.equals("component")) { + // save off the component info + int cid = parseInt(attributes.getValue("cid")); + int ctid = parseInt(attributes.getValue("ctid")); + _components.put(cid, new Integer(ctid)); + } + } + + /** + * Loads the component descriptions in the given file into {@link + * ComponentType} and {@link CharacterComponent} objects in the + * given hashtables, respectively, keyed on the type and component + * unique id, also respectively. + */ + public void loadComponents ( + String file, HashIntMap types, HashIntMap components) + throws IOException + { + // save off hashtables for reference while parsing + _types = types; + _components = components; + + parseFile(file); + } + + /** + * Converts a string containing values as (x, y) into the + * corresponding integer values and populates the given point + * object. + * + * @param str the point values in string format. + * @param point the point object to populate. + */ + protected void parsePoint (String str, Point point) + { + int vals[] = StringUtil.parseIntArray(str); + point.setLocation(vals[0], vals[1]); + } + + /** The hashtable of component types gathered while parsing. */ + protected HashIntMap _types; + + /** The hashtable of character components gathered while parsing. */ + protected HashIntMap _components; +} diff --git a/src/java/com/threerings/cast/tools/xml/XMLComponentRepository.java b/src/java/com/threerings/cast/tools/xml/XMLComponentRepository.java new file mode 100644 index 000000000..f2e181e18 --- /dev/null +++ b/src/java/com/threerings/cast/tools/xml/XMLComponentRepository.java @@ -0,0 +1,159 @@ +// +// $Id: XMLComponentRepository.java,v 1.1 2001/10/26 01:17:22 shaper Exp $ + +package com.threerings.miso.scene.xml; + +import java.io.IOException; +import java.util.Iterator; + +import com.samskivert.util.Config; +import com.samskivert.util.HashIntMap; + +import com.threerings.cast.*; +import com.threerings.cast.CharacterComponent.ComponentFrames; + +import com.threerings.media.tile.TileManager; + +import com.threerings.miso.Log; +import com.threerings.miso.util.MisoUtil; + +/** + * The xml file component repository provides access to character + * components obtained from component descriptions stored in an XML + * file. + */ +public class XMLFileComponentRepository implements ComponentRepository +{ + /** + * Constructs an xml file component repository. + */ + public XMLFileComponentRepository (Config config, TileManager tilemgr) + { + // save off our objects + _tilemgr = tilemgr; + + // load component types and components + String file = config.getValue(COMPFILE_KEY, DEFAULT_COMPFILE); + try { + new XMLComponentParser().loadComponents( + file, _types, _components); + } catch (IOException ioe) { + Log.warning("Exception loading component descriptions " + + "[ioe=" + ioe + "]."); + } + } + + // documentation inherited + public CharacterComponent getComponent (int cid) + throws NoSuchComponentException, NoSuchComponentTypeException + { + // get the component type id + Integer ctid = (Integer)_components.get(cid); + if (ctid == null) { + throw new NoSuchComponentException(cid); + } + + // get the component type + ComponentType type = (ComponentType)_types.get(ctid.intValue()); + if (type == null) { + throw new NoSuchComponentTypeException(ctid.intValue()); + } + + // get the character animation images + ComponentFrames frames = TileUtil.getComponentFrames( + _tilemgr, cid, type.frameCount); + + // create the component + return new CharacterComponent(type, cid, frames); + } + + // documentation inherited + public Iterator enumerateComponents (int ctid) + throws NoSuchComponentTypeException + { + return new ComponentTypeIterator(ctid); + } + + // documentation inherited + public Iterator enumerateComponentTypes () + { + return _types.keys(); + } + + /** + * Iterates over all components of a specified component type in + * the component hashtable. + */ + protected class ComponentTypeIterator implements Iterator + { + public ComponentTypeIterator (int ctid) + throws NoSuchComponentTypeException + { + _ctid = ctid; + _iter = _components.keys(); + advance(); + + // make sure we have at least one component of the + // specified type + if (_next == null) { + throw new NoSuchComponentTypeException(ctid); + } + } + + public boolean hasNext () + { + return (_next != null); + } + + public Object next () + { + Object next = _next; + advance(); + return next; + } + + public void remove () + { + throw new UnsupportedOperationException(); + } + + protected void advance () + { + while (_iter.hasNext()) { + CharacterComponent c = (CharacterComponent)_iter.next(); + if (c.getType().ctid == _ctid) { + _next = c; + return; + } + } + _next = null; + } + + /** The component type id we're enumerating over. */ + protected int _ctid; + + /** The next character component of the component type id + * associated with this iterator, or null if no more exist. */ + protected Object _next; + + /** Iterator over the components in the repository. */ + protected Iterator _iter; + } + + /** The config key for the character description file. */ + protected static final String COMPFILE_KEY = + MisoUtil.CONFIG_KEY + ".components"; + + /** The default character description file. */ + protected static final String DEFAULT_COMPFILE = + "rsrc/config/miso/components.xml"; + + /** The hashtable of component types. */ + protected HashIntMap _types = new HashIntMap(); + + /** The hashtable of character components. */ + protected HashIntMap _components = new HashIntMap(); + + /** The tile manager. */ + protected TileManager _tilemgr; +} diff --git a/src/java/com/threerings/media/sprite/Sprite.java b/src/java/com/threerings/media/sprite/Sprite.java index d60e38d44..6505a7248 100644 --- a/src/java/com/threerings/media/sprite/Sprite.java +++ b/src/java/com/threerings/media/sprite/Sprite.java @@ -1,5 +1,5 @@ // -// $Id: Sprite.java,v 1.29 2001/10/25 03:01:13 shaper Exp $ +// $Id: Sprite.java,v 1.30 2001/10/26 01:17:21 shaper Exp $ package com.threerings.media.sprite; @@ -49,7 +49,32 @@ public class Sprite public static final int TIME_BASED = 2; /** - * Construct a sprite object. + * Constructs a sprite without any associated frames and with a + * default initial location of (0, 0). The sprite + * should be populated with a set of frames used to display it via + * a subsequent call to {@link #setFrames}, and its location + * can be updated with {@link #setLocation}. + */ + public Sprite () + { + init(0, 0, null); + } + + /** + * Constructs a sprite without any associated frames. The sprite + * should be populated with a set of frames used to display it via + * a subsequent call to {@link #setFrames}. + * + * @param x the sprite x-position in pixels. + * @param y the sprite y-position in pixels. + */ + public Sprite (int x, int y) + { + init(x, y, null); + } + + /** + * Constructs a sprite. * * @param x the sprite x-position in pixels. * @param y the sprite y-position in pixels. @@ -60,19 +85,6 @@ public class Sprite init(x, y, frames); } - /** - * Construct a sprite object without any associated frames. The sprite - * should be populated with a set of frames used to display it via a - * subsequent call to {@link #setFrames}. - * - * @param x the sprite x-position in pixels. - * @param y the sprite y-position in pixels. - */ - public Sprite (int x, int y) - { - init(x, y, null); - } - /** * Returns the sprite's x position in screen coordinates. */ diff --git a/src/java/com/threerings/miso/Log.java b/src/java/com/threerings/miso/Log.java index df5b75aad..0006d8d2b 100644 --- a/src/java/com/threerings/miso/Log.java +++ b/src/java/com/threerings/miso/Log.java @@ -1,11 +1,11 @@ // -// $Id: Log.java,v 1.2 2001/07/18 21:45:42 shaper Exp $ +// $Id: Log.java,v 1.3 2001/10/26 01:17:21 shaper Exp $ package com.threerings.miso; /** * A placeholder class that contains a reference to the log object used by - * the Spine package. + * the miso package. */ public class Log { diff --git a/src/java/com/threerings/miso/client/DirtyItemList.java b/src/java/com/threerings/miso/client/DirtyItemList.java index 9425a9b26..f11768671 100644 --- a/src/java/com/threerings/miso/client/DirtyItemList.java +++ b/src/java/com/threerings/miso/client/DirtyItemList.java @@ -1,5 +1,5 @@ // -// $Id: DirtyItemList.java,v 1.3 2001/10/25 16:35:45 shaper Exp $ +// $Id: DirtyItemList.java,v 1.4 2001/10/26 01:17:21 shaper Exp $ package com.threerings.miso.scene; @@ -22,7 +22,7 @@ public class DirtyItemList extends ArrayList * item list. */ public void appendDirtySprite ( - Sprite sprite, int x, int y, Rectangle dirtyRect) + MisoCharacterSprite sprite, int x, int y, Rectangle dirtyRect) { add(new DirtyItem(sprite, null, x, y, dirtyRect)); } @@ -164,13 +164,13 @@ public class DirtyItemList extends ArrayList if (da.ox == db.ox && da.oy == db.oy && - (da.obj instanceof AmbulatorySprite) && - (db.obj instanceof AmbulatorySprite)) { + (da.obj instanceof MisoCharacterSprite) && + (db.obj instanceof MisoCharacterSprite)) { // we're comparing two sprites co-existing on the same // tile, so study their fine coordinates to determine // rendering order - AmbulatorySprite as = (AmbulatorySprite)da.obj; - AmbulatorySprite bs = (AmbulatorySprite)db.obj; + MisoCharacterSprite as = (MisoCharacterSprite)da.obj; + MisoCharacterSprite bs = (MisoCharacterSprite)db.obj; int ahei = as.getFineX() + as.getFineY(); int bhei = bs.getFineX() + bs.getFineY(); diff --git a/src/java/com/threerings/miso/client/IsoSceneView.java b/src/java/com/threerings/miso/client/IsoSceneView.java index 13ddeaa90..d422e87eb 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.69 2001/10/25 16:36:42 shaper Exp $ +// $Id: IsoSceneView.java,v 1.70 2001/10/26 01:17:21 shaper Exp $ package com.threerings.miso.scene; @@ -543,7 +543,8 @@ public class IsoSceneView implements SceneView int size = _dirtySprites.size(); for (int ii = 0; ii < size; ii++) { - AmbulatorySprite sprite = (AmbulatorySprite)_dirtySprites.get(ii); + MisoCharacterSprite sprite = + (MisoCharacterSprite)_dirtySprites.get(ii); // get the dirty portion of the sprite Rectangle drect = sprite.getBounds().intersection(r); @@ -576,7 +577,7 @@ public class IsoSceneView implements SceneView } // documentation inherited - public Path getPath (AmbulatorySprite sprite, int x, int y) + public Path getPath (MisoCharacterSprite sprite, int x, int y) { // make sure the destination point is within our bounds if (!_model.bounds.contains(x, y)) { diff --git a/src/java/com/threerings/miso/client/MisoCharacterSprite.java b/src/java/com/threerings/miso/client/MisoCharacterSprite.java new file mode 100644 index 000000000..3bbf13135 --- /dev/null +++ b/src/java/com/threerings/miso/client/MisoCharacterSprite.java @@ -0,0 +1,103 @@ +// +// $Id: MisoCharacterSprite.java,v 1.1 2001/10/26 01:17:21 shaper Exp $ + +package com.threerings.miso.scene; + +import com.threerings.cast.CharacterSprite; + +import com.threerings.miso.tile.MisoTile; + +/** + * The miso character sprite extends the basic character sprite to + * support the notion of tile passability, and to allow the sprite to + * store and make available its tile and fine coordinates within the + * scene. Note that the tile and fine coordinates must initially be + * set properly by whomever creates the sprite. Thereafter, the + * sprite will only be moved about via the {@link TilePath}, which + * will itself keep the sprite coordinates properly up to date. + */ +public class MisoCharacterSprite + extends CharacterSprite + implements Traverser +{ + // documentation inherited + public boolean canTraverse (MisoTile tile) + { + // by default, passability is solely the province of the tile + return tile.passable; + } + + /** + * Returns the sprite's location on the x-axis in tile coordinates. + */ + public int getTileX () + { + return _tilex; + } + + /** + * Returns the sprite's location on the y-axis in tile coordinates. + */ + public int getTileY () + { + return _tiley; + } + + /** + * Returns the sprite's location on the x-axis within its current + * tile in fine coordinates. + */ + public int getFineX () + { + return _finex; + } + + /** + * Returns the sprite's location on the y-axis within its current + * tile in fine coordinates. + */ + public int getFineY () + { + return _finey; + } + + /** + * Sets the sprite's location in tile coordinates; the sprite is + * not actually moved in any way. This method is only intended + * for use in updating the sprite's stored position which is made + * accessible to others that may care to review it. + */ + public void setTileLocation (int x, int y) + { + _tilex = x; + _tiley = y; + } + + /** + * Sets the sprite's location in fine coordinates; the sprite is + * not actually moved in any way. This method is only intended + * for use in updating the sprite's stored position which is made + * accessible to others that may care to review it. + */ + public void setFineLocation (int x, int y) + { + _finex = x; + _finey = y; + } + + // documentation inherited + protected void toString (StringBuffer buf) + { + super.toString(buf); + buf.append(", tilex=").append(_tilex); + buf.append(", tiley=").append(_tiley); + buf.append(", finex=").append(_finex); + buf.append(", finey=").append(_finey); + } + + /** The sprite location in tile coordinates. */ + protected int _tilex, _tiley; + + /** The sprite location in fine coordinates. */ + protected int _finex, _finey; +} diff --git a/src/java/com/threerings/miso/client/SceneView.java b/src/java/com/threerings/miso/client/SceneView.java index f040e0a5d..4f03f2d12 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.17 2001/10/22 18:21:41 shaper Exp $ +// $Id: SceneView.java,v 1.18 2001/10/26 01:17:21 shaper Exp $ package com.threerings.miso.scene; @@ -49,5 +49,5 @@ public interface SceneView * * @return the sprite's path, or null if no valid path exists. */ - public Path getPath (AmbulatorySprite sprite, int x, int y); + public Path getPath (MisoCharacterSprite sprite, int x, int y); } diff --git a/src/java/com/threerings/miso/client/TilePath.java b/src/java/com/threerings/miso/client/TilePath.java index 640ded525..b6be95c55 100644 --- a/src/java/com/threerings/miso/client/TilePath.java +++ b/src/java/com/threerings/miso/client/TilePath.java @@ -1,5 +1,5 @@ // -// $Id: TilePath.java,v 1.1 2001/10/24 00:55:08 shaper Exp $ +// $Id: TilePath.java,v 1.2 2001/10/26 01:17:21 shaper Exp $ package com.threerings.miso.scene; @@ -31,7 +31,7 @@ public class TilePath extends LineSegmentPath * coordinates. */ public TilePath ( - IsoSceneViewModel model, AmbulatorySprite sprite, List tiles, + IsoSceneViewModel model, MisoCharacterSprite sprite, List tiles, int destx, int desty) { _model = model; @@ -46,7 +46,7 @@ public class TilePath extends LineSegmentPath boolean moved = super.updatePosition(sprite, timestamp); if (moved) { - AmbulatorySprite as = (AmbulatorySprite)sprite; + MisoCharacterSprite mcs = (MisoCharacterSprite)sprite; int sx = sprite.getX(), sy = sprite.getY(); Point pos = new Point(); @@ -60,7 +60,7 @@ public class TilePath extends LineSegmentPath // we've arrived int dtx = _dest.getTileX(), dty = _dest.getTileY(); if (pos.x == dtx && pos.y == dty) { - as.setTileLocation(dtx, dty); + mcs.setTileLocation(dtx, dty); // Log.info("Sprite arrived [dtx=" + dtx + // ", dty=" + dty + "]."); _arrived = true; @@ -68,14 +68,14 @@ public class TilePath extends LineSegmentPath } // get the sprite's latest fine coordinates - IsoUtil.tileToScreen(_model, as.getTileX(), as.getTileY(), pos); + IsoUtil.tileToScreen(_model, mcs.getTileX(), mcs.getTileY(), pos); Point fpos = new Point(); IsoUtil.pixelToFine(_model, sx - pos.x, sy - pos.y, fpos); // inform the sprite - as.setFineLocation(fpos.x, fpos.y); + mcs.setFineLocation(fpos.x, fpos.y); - // Log.info("Sprite moved [s=" + as + "]."); + // Log.info("Sprite moved [s=" + mcs + "]."); } return moved; @@ -99,7 +99,7 @@ public class TilePath extends LineSegmentPath * following the given list of tile coordinates. */ protected void createPath ( - AmbulatorySprite sprite, List tiles, int destx, int desty) + MisoCharacterSprite sprite, List tiles, int destx, int desty) { // constrain destination pixels to fine coordinates Point fpos = new Point(); diff --git a/src/java/com/threerings/miso/client/util/IsoUtil.java b/src/java/com/threerings/miso/client/util/IsoUtil.java index 9573e1224..ea0e0004e 100644 --- a/src/java/com/threerings/miso/client/util/IsoUtil.java +++ b/src/java/com/threerings/miso/client/util/IsoUtil.java @@ -1,5 +1,5 @@ // -// $Id: IsoUtil.java,v 1.13 2001/10/24 00:55:08 shaper Exp $ +// $Id: IsoUtil.java,v 1.14 2001/10/26 01:17:21 shaper Exp $ package com.threerings.miso.scene.util; @@ -18,6 +18,27 @@ import com.threerings.miso.scene.*; */ public class IsoUtil { + /** + * Sets the given character sprite's tile and fine coordinate + * locations within the scene based on the sprite's current screen + * pixel coordinates. This method should be called whenever a + * {@link MisoCharacterSprite} is first created, but after its + * location has been set via {@link Sprite#setLocation}. + */ + public static void setSpriteSceneLocation ( + IsoSceneViewModel model, MisoCharacterSprite sprite) + { + // get the sprite's position in full coordinates + Point fpos = new Point(); + screenToFull(model, sprite.getX(), sprite.getY(), fpos); + + // set the sprite's tile and fine coordinates + sprite.setTileLocation( + IsoUtil.fullToTile(fpos.x), IsoUtil.fullToTile(fpos.y)); + sprite.setFineLocation( + IsoUtil.fullToFine(fpos.x), IsoUtil.fullToFine(fpos.y)); + } + /** * Returns a polygon bounding all footprint tiles of the given * object tile. diff --git a/src/java/com/threerings/miso/util/MisoUtil.java b/src/java/com/threerings/miso/util/MisoUtil.java index 1c2b57539..3a7b6ac07 100644 --- a/src/java/com/threerings/miso/util/MisoUtil.java +++ b/src/java/com/threerings/miso/util/MisoUtil.java @@ -1,5 +1,5 @@ // -// $Id: MisoUtil.java,v 1.9 2001/08/29 18:41:46 shaper Exp $ +// $Id: MisoUtil.java,v 1.10 2001/10/26 01:17:22 shaper Exp $ package com.threerings.miso.util; @@ -9,18 +9,24 @@ import java.net.URL; import java.net.MalformedURLException; import com.samskivert.util.*; + +import com.threerings.cast.CharacterManager; + import com.threerings.resource.ResourceManager; + import com.threerings.media.ImageManager; import com.threerings.media.tile.*; import com.threerings.miso.Log; import com.threerings.miso.scene.*; +import com.threerings.miso.scene.xml.XMLFileComponentRepository; import com.threerings.miso.scene.xml.XMLFileSceneRepository; import com.threerings.miso.tile.*; /** - * MisoUtil provides miscellaneous routines for applications or other - * layers that intend to make use of Miso services. + * The miso util class provides miscellaneous routines for + * applications or other layers that intend to make use of Miso + * services. */ public class MisoUtil { @@ -28,7 +34,7 @@ public class MisoUtil public static final String CONFIG_KEY = "miso"; /** - * Populate the config object with miso configuration values. + * Populates the config object with miso configuration values. * * @param config the Config object to populate. */ @@ -38,8 +44,27 @@ public class MisoUtil } /** - * Create an XMLFileSceneRepository object, reading the - * name of the class to instantiate from the config object. + * Creates a CharacterManager object. + * + * @param config the Config object. + * @param tilemgr the tile manager. + * + * @return the new character manager object or null if an error + * occurred. + */ + public static CharacterManager createCharacterManager ( + Config config, TileManager tilemgr) + { + XMLFileComponentRepository crepo = + new XMLFileComponentRepository(config, tilemgr); + CharacterManager charmgr = new CharacterManager(tilemgr, crepo); + charmgr.setCharacterClass(MisoCharacterSprite.class); + return charmgr; + } + + /** + * Creates an XMLFileSceneRepository object, reading + * the name of the class to instantiate from the config object. * * @param config the Config object. * @@ -63,7 +88,7 @@ public class MisoUtil } /** - * Create a TileManager object. + * Creates a TileManager object. * * @param config the Config object. * @param frame the root frame to which images will be rendered. @@ -80,7 +105,7 @@ public class MisoUtil } /** - * Create a ResourceManager object. + * Creates a ResourceManager object. * * @return the new resource manager object or null if an error occurred. */ @@ -90,7 +115,7 @@ public class MisoUtil } /** - * Create a TileSetManager object, reading the class + * Creates a TileSetManager object, reading the class * name to instantiate from the config object. * * @param config the Config object. diff --git a/tests/rsrc/config/miso/characters.xml b/tests/rsrc/config/miso/characters.xml deleted file mode 100644 index 3f69ef944..000000000 --- a/tests/rsrc/config/miso/characters.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tests/rsrc/config/miso/components.xml b/tests/rsrc/config/miso/components.xml new file mode 100644 index 000000000..4431cb5dd --- /dev/null +++ b/tests/rsrc/config/miso/components.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/rsrc/scenes/towne.xml b/tests/rsrc/scenes/towne.xml new file mode 100644 index 000000000..7e2117f27 --- /dev/null +++ b/tests/rsrc/scenes/towne.xml @@ -0,0 +1,43 @@ + + + + Untitled Scene + 1 + + + + + + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,3,1010,2,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,3,1010,3,1010,3,1010,2,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1010,2,1010,3,1010,2,1010,2,1010,2,1010,2,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,2,1010,2,1010,2,1010,2,1010,2,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,2,1010,2,1010,2,1010,2,1010,2,1010,3,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1010,3,1010,2,1010,2,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1010,2,1010,3,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,3,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1010,3,1004,10,1004,10,1004,10 + 1010,2,1010,2,1010,3,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,3,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1010,3,1010,3,1004,10,1004,10 + 1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,3,1010,3,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1004,10 + 1004,10,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2 + 1004,10,1004,10,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,3,1010,3,1010,3,1010,2,1010,2 + 1004,10,1004,10,1004,10,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1004,10,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1010,2,1004,10 + 1004,10,1004,10,1004,10,1004,10,1010,2,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1010,2,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1010,3,1010,3,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,3,1010,3,1010,2,1010,2,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1010,3,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,3,1010,2,1010,3,1010,3,1010,2,1010,3,1010,3,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,3,1010,2,1010,2,1010,3,1010,2,1010,3,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1010,2,1010,2,1010,3,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1010,2,1010,3,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + 1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1010,2,1010,2,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10,1004,10 + + + + 1009,0 + 1009,0 + 1009,0 + 1009,0 + + + + diff --git a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java index be57d225f..c1bbf1b56 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.22 2001/10/25 22:08:29 mdb Exp $ +// $Id: ViewerSceneViewPanel.java,v 1.23 2001/10/26 01:17:22 shaper Exp $ package com.threerings.miso.viewer; @@ -10,7 +10,10 @@ import javax.swing.JPanel; import com.samskivert.util.Config; +import com.threerings.cast.*; + import com.threerings.media.sprite.*; +import com.threerings.media.tile.TileManager; import com.threerings.media.util.RandomUtil; import com.threerings.media.util.PerformanceMonitor; import com.threerings.media.util.PerformanceObserver; @@ -18,6 +21,7 @@ import com.threerings.media.util.PerformanceObserver; import com.threerings.miso.Log; import com.threerings.miso.scene.*; import com.threerings.miso.scene.xml.XMLFileSceneRepository; +import com.threerings.miso.scene.util.IsoUtil; import com.threerings.miso.util.*; import com.threerings.miso.viewer.util.ViewerContext; @@ -40,8 +44,8 @@ public class ViewerSceneViewPanel extends SceneViewPanel prepareStartingScene(); // construct the character manager from which we obtain sprites - CharacterManager charmgr = new CharacterManager( - ctx.getConfig(), ctx.getTileManager(), _scenemodel); + CharacterManager charmgr = MisoUtil.createCharacterManager( + ctx.getConfig(), ctx.getTileManager()); // create the manipulable sprite _sprite = createSprite(spritemgr, charmgr, TSID_CHAR_USER); @@ -62,12 +66,16 @@ public class ViewerSceneViewPanel extends SceneViewPanel /** * Creates a new sprite. */ - protected AmbulatorySprite createSprite ( + protected MisoCharacterSprite createSprite ( SpriteManager spritemgr, CharacterManager charmgr, int tsid) { - AmbulatorySprite s = charmgr.getCharacter(tsid); + int dummy[] = { tsid }; + CharacterDescriptor desc = new CharacterDescriptor(dummy); + MisoCharacterSprite s = + (MisoCharacterSprite)charmgr.getCharacter(desc); if (s != null) { s.setLocation(300, 300); + IsoUtil.setSpriteSceneLocation(_scenemodel, s); s.addSpriteObserver(this); spritemgr.addSprite(s); } @@ -81,7 +89,7 @@ public class ViewerSceneViewPanel extends SceneViewPanel protected void createDecoys ( SpriteManager spritemgr, CharacterManager charmgr) { - _decoys = new AmbulatorySprite[NUM_DECOYS]; + _decoys = new MisoCharacterSprite[NUM_DECOYS]; for (int ii = 0; ii < NUM_DECOYS; ii++) { _decoys[ii] = createSprite(spritemgr, charmgr, TSID_CHAR); if (_decoys[ii] != null) { @@ -133,7 +141,7 @@ public class ViewerSceneViewPanel extends SceneViewPanel * screen coordinates. Returns whether a path was successfully * assigned. */ - protected boolean createPath (AmbulatorySprite s, int x, int y) + protected boolean createPath (MisoCharacterSprite s, int x, int y) { // get the path from here to there Path path = _view.getPath(s, x, y); @@ -151,7 +159,7 @@ public class ViewerSceneViewPanel extends SceneViewPanel /** * Assigns a new random path to the given sprite. */ - protected void createRandomPath (AmbulatorySprite s) + protected void createRandomPath (MisoCharacterSprite s) { Dimension d = _scenemodel.bounds.getSize(); @@ -166,7 +174,7 @@ public class ViewerSceneViewPanel extends SceneViewPanel public void handleEvent (SpriteEvent event) { if (event instanceof PathCompletedEvent) { - AmbulatorySprite s = (AmbulatorySprite)event.getSprite(); + MisoCharacterSprite s = (MisoCharacterSprite)event.getSprite(); if (s != _sprite) { // move the sprite to a new random location @@ -188,10 +196,10 @@ public class ViewerSceneViewPanel extends SceneViewPanel protected AnimationManager _animmgr; /** The sprite we're manipulating within the view. */ - protected AmbulatorySprite _sprite; + protected MisoCharacterSprite _sprite; /** The test sprites that meander about aimlessly. */ - protected AmbulatorySprite _decoys[]; + protected MisoCharacterSprite _decoys[]; /** The context object. */ protected ViewerContext _ctx;