From 42261772a5f3e4a08965559f877c90015a953c2a Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Sun, 17 Feb 2002 08:01:15 +0000 Subject: [PATCH] Modified scene interface so that tiles are requested directly so that we can implement "virtual" scenes which return tiles infinitely in all directions in anticipation of supporting scrolling. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1007 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../miso/client/DisplayMisoScene.java | 23 +++---- .../miso/client/DisplayMisoSceneImpl.java | 14 ++-- .../threerings/miso/client/IsoSceneView.java | 69 +++++++++++-------- .../miso/client/util/AStarPathUtil.java | 33 +++++---- 4 files changed, 75 insertions(+), 64 deletions(-) diff --git a/src/java/com/threerings/miso/client/DisplayMisoScene.java b/src/java/com/threerings/miso/client/DisplayMisoScene.java index d2318a310..191bd4282 100644 --- a/src/java/com/threerings/miso/client/DisplayMisoScene.java +++ b/src/java/com/threerings/miso/client/DisplayMisoScene.java @@ -1,11 +1,11 @@ // -// $Id: DisplayMisoScene.java,v 1.3 2002/01/30 18:28:32 mdb Exp $ +// $Id: DisplayMisoScene.java,v 1.4 2002/02/17 08:01:15 mdb Exp $ package com.threerings.miso.scene; -import com.threerings.media.tile.ObjectTileLayer; -import com.threerings.media.tile.TileLayer; -import com.threerings.miso.tile.BaseTileLayer; +import com.threerings.media.tile.ObjectTile; +import com.threerings.media.tile.Tile; +import com.threerings.miso.tile.BaseTile; /** * Makes available the information from the {@link MisoSceneModel} in a @@ -16,22 +16,19 @@ import com.threerings.miso.tile.BaseTileLayer; public interface DisplayMisoScene { /** - * Returns the tiles that comprise the base layer of this scene. This - * layer is read-only and not to be modified. + * Returns the base tile at the specified coordinates. */ - public BaseTileLayer getBaseLayer (); + public BaseTile getBaseTile (int x, int y); /** - * Returns the tiles that comprise the fringe layer of this scene. - * This layer is read-only and not to be modified. + * Returns the fring tile at the specified coordinates. */ - public TileLayer getFringeLayer (); + public Tile getFringeTile (int x, int y); /** - * Returns the tiles that comprise the object layer of this scene. - * This layer is read-only and not to be modified. + * Returns the object tile at the specified coordinates. */ - public ObjectTileLayer getObjectLayer (); + public ObjectTile getObjectTile (int x, int y); /** * Returns the action associated with the object tile at the specified diff --git a/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java b/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java index ed1daade0..199a90cdb 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.50 2002/02/06 17:13:06 mdb Exp $ +// $Id: DisplayMisoSceneImpl.java,v 1.51 2002/02/17 08:01:15 mdb Exp $ package com.threerings.miso.scene; @@ -172,21 +172,21 @@ public class DisplayMisoSceneImpl } // documentation inherited - public BaseTileLayer getBaseLayer () + public BaseTile getBaseTile (int x, int y) { - return _base; + return _base.getTile(x, y); } // documentation inherited - public TileLayer getFringeLayer () + public Tile getFringeTile (int x, int y) { - return _fringe; + return _fringe.getTile(x, y); } // documentation inherited - public ObjectTileLayer getObjectLayer () + public ObjectTile getObjectTile (int x, int y) { - return _object; + return _object.getTile(x, y); } // documentation inherited from interface diff --git a/src/java/com/threerings/miso/client/IsoSceneView.java b/src/java/com/threerings/miso/client/IsoSceneView.java index 211b273d7..3e604c3d8 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.94 2002/02/17 07:30:45 mdb Exp $ +// $Id: IsoSceneView.java,v 1.95 2002/02/17 08:01:15 mdb Exp $ package com.threerings.miso.scene; @@ -27,15 +27,12 @@ import com.threerings.media.sprite.Path; import com.threerings.media.sprite.SpriteManager; import com.threerings.media.tile.ObjectTile; -import com.threerings.media.tile.ObjectTileLayer; import com.threerings.media.tile.Tile; -import com.threerings.media.tile.TileLayer; import com.threerings.miso.Log; import com.threerings.miso.scene.DirtyItemList.DirtyItem; import com.threerings.miso.scene.util.AStarPathUtil; import com.threerings.miso.scene.util.IsoUtil; -import com.threerings.miso.tile.BaseTileLayer; /** * The iso scene view provides an isometric view of a particular @@ -301,22 +298,19 @@ public class IsoSceneView implements SceneView */ protected void renderTiles (Graphics2D gfx) { - BaseTileLayer base = _scene.getBaseLayer(); - TileLayer fringe = _scene.getFringeLayer(); - // render the base and fringe layers - for (int yy = 0; yy < base.getHeight(); yy++) { - for (int xx = 0; xx < base.getWidth(); xx++) { + for (int yy = 0; yy < _model.scenehei; yy++) { + for (int xx = 0; xx < _model.scenewid; xx++) { if (!_dirty[xx][yy]) { continue; } // draw the base and fringe tile images Tile tile; - if ((tile = base.getTile(xx, yy)) != null) { + if ((tile = _scene.getBaseTile(xx, yy)) != null) { tile.paint(gfx, getTilePoly(xx, yy)); } - if ((tile = fringe.getTile(xx, yy)) != null) { + if ((tile = _scene.getFringeTile(xx, yy)) != null) { tile.paint(gfx, getTilePoly(xx, yy)); } @@ -367,24 +361,45 @@ public class IsoSceneView implements SceneView _objects.clear(); // generate metric records for all objects - ObjectTileLayer tiles = _scene.getObjectLayer(); - for (int yy = 0; yy < tiles.getHeight(); yy++) { - for (int xx = 0; xx < tiles.getWidth(); xx++) { - ObjectTile tile = tiles.getTile(xx, yy); - if (tile == null) { - continue; + for (int yy = 0; yy < _model.scenehei; yy++) { + for (int xx = 0; xx < _model.scenewid; xx++) { + ObjectTile tile = _scene.getObjectTile(xx, yy); + if (tile != null) { + generateObjectMetrics(tile, xx, yy); } + } + } + } - // create a metrics record for this object - ObjectMetrics metrics = new ObjectMetrics(); - metrics.tile = tile; - metrics.x = xx; - metrics.y = yy; - metrics.bounds = IsoUtil.getObjectBounds( - _model, getTilePoly(xx, yy), tile); + /** + * Generates object tile metrics for the supplied object tile and adds + * them to the list. + */ + protected void generateObjectMetrics (ObjectTile tile, int x, int y) + { + // create a metrics record for this object + ObjectMetrics metrics = new ObjectMetrics(); + metrics.tile = tile; + metrics.x = x; + metrics.y = y; + metrics.bounds = IsoUtil.getObjectBounds( + _model, getTilePoly(x, y), tile); - // and add it to the list - _objects.add(metrics); + // and add it to the list + _objects.add(metrics); + } + + /** + * Clears out the object metrics for the object at the specified tile + * coordinates. + */ + protected void clearObjectMetrics (int x, int y) + { + for (int i = 0; i < _objects.size(); i++) { + ObjectMetrics metrics = (ObjectMetrics)_objects.get(i); + if (metrics.x == x && metrics.y == y) { + _objects.remove(i); + return; } } } @@ -661,7 +676,7 @@ public class IsoSceneView implements SceneView // get a reasonable tile path through the scene List points = AStarPathUtil.getPath( - _scene.getBaseLayer(), _model.scenewid, _model.scenehei, + _scene, _model.scenewid, _model.scenehei, sprite, sprite.getTileX(), sprite.getTileY(), dest.x, dest.y); // construct a path object to guide the sprite on its merry way diff --git a/src/java/com/threerings/miso/client/util/AStarPathUtil.java b/src/java/com/threerings/miso/client/util/AStarPathUtil.java index b4a18d7da..492605d1c 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.12 2002/02/07 20:02:53 mdb Exp $ +// $Id: AStarPathUtil.java,v 1.13 2002/02/17 08:01:15 mdb Exp $ package com.threerings.miso.scene.util; @@ -9,9 +9,9 @@ import java.util.*; import com.threerings.media.util.MathUtil; import com.threerings.miso.Log; +import com.threerings.miso.scene.DisplayMisoScene; import com.threerings.miso.scene.Traverser; import com.threerings.miso.tile.BaseTile; -import com.threerings.miso.tile.BaseTileLayer; /** * The AStarPathUtil class provides a facility for @@ -26,15 +26,14 @@ public class AStarPathUtil { /** * Return a list of Point objects representing a path - * from coordinates (ax, by) to - * (bx, by), inclusive, determined by performing an - * A* search in the given array of tiles. Assumes the starting - * and destination nodes are traversable by the specified - * traverser. + * from coordinates (ax, by) to (bx, by), + * inclusive, determined by performing an A* search in the given + * scene's base tile layer. Assumes the starting and destination nodes + * are traversable by the specified traverser. * - * @param tiles the tile array. - * @param tilewid the tile array width. - * @param tilehei the tile array height. + * @param scene the scene in which a path is to be computed. + * @param tilewid the scene width in tiles. + * @param tilehei the scene height in tiles. * @param trav the traverser to follow the path. * @param ax the starting x-position in tile coordinates. * @param ay the starting y-position in tile coordinates. @@ -44,10 +43,10 @@ public class AStarPathUtil * @return the list of points in the path. */ public static List getPath ( - BaseTileLayer tiles, int tilewid, int tilehei, Traverser trav, + DisplayMisoScene scene, int tilewid, int tilehei, Traverser trav, int ax, int ay, int bx, int by) { - AStarInfo info = new AStarInfo(tiles, tilewid, tilehei, trav, bx, by); + AStarInfo info = new AStarInfo(scene, tilewid, tilehei, trav, bx, by); // set up the starting node AStarNode s = getNode(info, ax, ay); @@ -199,7 +198,7 @@ public class AStarPathUtil protected static boolean isTraversable (AStarInfo info, int x, int y) { return (isCoordinateValid(info, x, y) && - info.trav.canTraverse(info.tiles.getTile(x, y))); + info.trav.canTraverse(info.scene.getBaseTile(x, y))); } /** @@ -253,8 +252,8 @@ public class AStarPathUtil */ class AStarInfo { - /** The tile layer being traversed. */ - public BaseTileLayer tiles; + /** The scene whose base tile layer is being traversed. */ + public DisplayMisoScene scene; /** The tile array dimensions. */ public int tilewid, tilehei; @@ -275,11 +274,11 @@ class AStarInfo public int destx, desty; public AStarInfo ( - BaseTileLayer tiles, int tilewid, int tilehei, Traverser trav, + DisplayMisoScene scene, int tilewid, int tilehei, Traverser trav, int destx, int desty) { // save off references - this.tiles = tiles; + this.scene = scene; this.tilewid = tilewid; this.tilehei = tilehei; this.trav = trav;