Tiles are now immutable, so the DisplayMisoScene becomes the arbiter of

whether or not a traverser can traverse a tile.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2119 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2003-01-13 22:53:56 +00:00
parent 5c055d21a6
commit b9be0aef92
9 changed files with 45 additions and 80 deletions
@@ -1,5 +1,5 @@
// //
// $Id: DisplayMisoScene.java,v 1.7 2002/09/23 21:54:50 mdb Exp $ // $Id: DisplayMisoScene.java,v 1.8 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -34,4 +34,14 @@ public interface DisplayMisoScene
* origin falls in the requested region. * origin falls in the requested region.
*/ */
public void getSceneObjects (Rectangle region, ObjectSet set); public void getSceneObjects (Rectangle region, ObjectSet set);
/**
* Returns true if the supplied traverser can traverse the specified
* tile coordinate. The traverser is whatever object is passed along
* to the path finder when a path is being computed. Scene
* implementations which support custom traversal based on the type of
* the traverser will want to reflect the traverser's class and act
* acordingly.
*/
public boolean canTraverse (Object traverser, int x, int y);
} }
@@ -1,5 +1,5 @@
// //
// $Id: DisplayMisoSceneImpl.java,v 1.63 2002/12/11 23:05:07 shaper Exp $ // $Id: DisplayMisoSceneImpl.java,v 1.64 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -14,7 +14,6 @@ import com.threerings.media.tile.NoSuchTileException;
import com.threerings.media.tile.NoSuchTileSetException; import com.threerings.media.tile.NoSuchTileSetException;
import com.threerings.media.tile.ObjectTile; import com.threerings.media.tile.ObjectTile;
import com.threerings.media.tile.Tile; import com.threerings.media.tile.Tile;
import com.threerings.media.tile.TileException;
import com.threerings.media.tile.TileLayer; import com.threerings.media.tile.TileLayer;
import com.threerings.miso.Log; import com.threerings.miso.Log;
@@ -73,6 +72,7 @@ public class DisplayMisoSceneImpl
// create the individual tile layer objects // create the individual tile layer objects
_base = new BaseTileLayer(new BaseTile[swid*shei], swid, shei); _base = new BaseTileLayer(new BaseTile[swid*shei], swid, shei);
_fringe = new TileLayer(new Tile[swid*shei], swid, shei); _fringe = new TileLayer(new Tile[swid*shei], swid, shei);
_covered = new boolean[swid*shei];
} }
/** /**
@@ -142,7 +142,7 @@ public class DisplayMisoSceneImpl
int tsid = (fqTid >> 16) & 0xFFFF, tid = (fqTid & 0xFFFF); int tsid = (fqTid >> 16) & 0xFFFF, tid = (fqTid & 0xFFFF);
try { try {
expandObject(col, row, tsid, tid, fqTid, ii/3); expandObject(col, row, tsid, tid, fqTid, ii/3);
} catch (TileException te) { } catch (NoSuchTileSetException te) {
Log.warning("Scene contains non-existent object tile " + Log.warning("Scene contains non-existent object tile " +
"[tsid=" + tsid + ", tid=" + tid + "[tsid=" + tsid + ", tid=" + tid +
", col=" + col + ", row=" + row + "]."); ", col=" + col + ", row=" + row + "].");
@@ -213,6 +213,14 @@ public class DisplayMisoSceneImpl
} }
} }
// documentation inherited from interface
public boolean canTraverse (Object trav, int x, int y)
{
BaseTile tile = getBaseTile(x, y);
return (((tile == null) || tile.isPassable()) &&
!_covered[y*_model.width+x]);
}
/** /**
* Return a string representation of this Miso scene object. * Return a string representation of this Miso scene object.
*/ */
@@ -276,10 +284,7 @@ public class DisplayMisoSceneImpl
continue; continue;
} }
BaseTile tile = _base.getTile(xx, yy); _covered[yy*_model.width+xx] = true;
if (tile != null) {
tile.setCovered(covered);
}
} }
} }
@@ -299,6 +304,9 @@ public class DisplayMisoSceneImpl
/** The fringe layer of tiles. */ /** The fringe layer of tiles. */
protected TileLayer _fringe; protected TileLayer _fringe;
/** Information on which tiles are covered by object tiles. */
protected boolean[] _covered;
/** The scene object records. */ /** The scene object records. */
protected ArrayList _objects = new ArrayList(); protected ArrayList _objects = new ArrayList();
@@ -1,5 +1,5 @@
// //
// $Id: IsoSceneView.java,v 1.127 2002/12/05 23:06:30 mdb Exp $ // $Id: IsoSceneView.java,v 1.128 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -455,7 +455,7 @@ public class IsoSceneView implements SceneView
} }
// documentation inherited // documentation inherited
public Path getPath (MisoCharacterSprite sprite, int x, int y) public Path getPath (Sprite sprite, int x, int y)
{ {
// make sure we have a scene // make sure we have a scene
if (_scene == null) { if (_scene == null) {
@@ -1,22 +0,0 @@
//
// $Id: MisoCharacterSprite.java,v 1.7 2002/12/05 23:06:30 mdb Exp $
package com.threerings.miso.scene;
import com.threerings.cast.CharacterSprite;
import com.threerings.miso.tile.BaseTile;
/**
* The miso character sprite extends the basic character sprite to support
* the notion of tile passability.
*/
public class MisoCharacterSprite extends CharacterSprite
implements Traverser
{
// documentation inherited
public boolean canTraverse (BaseTile tile)
{
// by default, passability is solely the province of the tile
return tile.isPassable();
}
}
@@ -1,5 +1,5 @@
// //
// $Id: SceneView.java,v 1.31 2002/09/24 05:33:05 mdb Exp $ // $Id: SceneView.java,v 1.32 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -9,6 +9,7 @@ import java.awt.Polygon;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import com.threerings.media.sprite.Sprite;
import com.threerings.media.util.Path; import com.threerings.media.util.Path;
/** /**
@@ -50,7 +51,7 @@ public interface SceneView
* *
* @return the sprite's path, or null if no valid path exists. * @return the sprite's path, or null if no valid path exists.
*/ */
public Path getPath (MisoCharacterSprite sprite, int x, int y); public Path getPath (Sprite sprite, int x, int y);
/** /**
* Returns screen coordinates given the specified full coordinates. * Returns screen coordinates given the specified full coordinates.
@@ -79,8 +80,8 @@ public interface SceneView
/** /**
* Returns information about the object over which the mouse is * Returns information about the object over which the mouse is
* currently hovering (either a {@link SceneObject} or a {@link * currently hovering (either a {@link SceneObject} or a {@link
* MisoCharacterSprite}), or null if the mouse is not hovering over * Sprite}), or null if the mouse is not hovering over anything of
* anything of interest. * interest.
*/ */
public Object getHoverObject (); public Object getHoverObject ();
} }
@@ -1,5 +1,5 @@
// //
// $Id: TilePath.java,v 1.11 2002/12/05 23:06:30 mdb Exp $ // $Id: TilePath.java,v 1.12 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -8,6 +8,7 @@ import java.util.List;
import com.threerings.util.DirectionCodes; import com.threerings.util.DirectionCodes;
import com.threerings.media.sprite.Sprite;
import com.threerings.media.util.LineSegmentPath; import com.threerings.media.util.LineSegmentPath;
import com.threerings.media.util.PathNode; import com.threerings.media.util.PathNode;
import com.threerings.media.util.Pathable; import com.threerings.media.util.Pathable;
@@ -35,9 +36,8 @@ public class TilePath extends LineSegmentPath
* @param desty the destination y-position in screen pixel * @param desty the destination y-position in screen pixel
* coordinates. * coordinates.
*/ */
public TilePath ( public TilePath (IsoSceneViewModel model, Sprite sprite,
IsoSceneViewModel model, MisoCharacterSprite sprite, List tiles, List tiles, int destx, int desty)
int destx, int desty)
{ {
_model = model; _model = model;
@@ -51,7 +51,7 @@ public class TilePath extends LineSegmentPath
boolean moved = super.tick(pable, timestamp); boolean moved = super.tick(pable, timestamp);
if (moved) { if (moved) {
MisoCharacterSprite mcs = (MisoCharacterSprite)pable; Sprite mcs = (Sprite)pable;
int sx = mcs.getX(), sy = mcs.getY(); int sx = mcs.getX(), sy = mcs.getY();
Point pos = new Point(); Point pos = new Point();
@@ -94,8 +94,7 @@ public class TilePath extends LineSegmentPath
* from its starting position to the given destination coordinates * from its starting position to the given destination coordinates
* following the given list of tile coordinates. * following the given list of tile coordinates.
*/ */
protected void createPath ( protected void createPath (Sprite sprite, List tiles, int destx, int desty)
MisoCharacterSprite sprite, List tiles, int destx, int desty)
{ {
// constrain destination pixels to fine coordinates // constrain destination pixels to fine coordinates
Point fpos = new Point(); Point fpos = new Point();
@@ -1,25 +0,0 @@
//
// $Id: Traverser.java,v 1.4 2001/11/27 22:17:42 mdb Exp $
package com.threerings.miso.scene;
import com.threerings.miso.tile.BaseTile;
/**
* The <code>Traverser</code> interface should be implemented by
* sprites that are going to traverse some path in a scene. This
* allows path determination to take into account any special
* abilities the traverser may have that alter the traversability of
* tiles.
*/
public interface Traverser
{
/**
* Return whether the traverser can traverse the specified tile.
*
* @param tile the tile to traverse.
*
* @return whether the tile is traversable.
*/
public boolean canTraverse (BaseTile tile);
}
@@ -1,5 +1,5 @@
// //
// $Id: AStarPathUtil.java,v 1.20 2002/09/13 00:51:19 ray Exp $ // $Id: AStarPathUtil.java,v 1.21 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene.util; package com.threerings.miso.scene.util;
@@ -12,7 +12,6 @@ import com.threerings.media.util.MathUtil;
import com.threerings.miso.Log; import com.threerings.miso.Log;
import com.threerings.miso.scene.DisplayMisoScene; import com.threerings.miso.scene.DisplayMisoScene;
import com.threerings.miso.scene.Traverser;
import com.threerings.miso.tile.BaseTile; import com.threerings.miso.tile.BaseTile;
/** /**
@@ -45,7 +44,7 @@ public class AStarPathUtil
* @return the list of points in the path. * @return the list of points in the path.
*/ */
public static List getPath ( public static List getPath (
DisplayMisoScene scene, int tilewid, int tilehei, Traverser trav, DisplayMisoScene scene, int tilewid, int tilehei, Object trav,
int ax, int ay, int bx, int by) int ax, int ay, int bx, int by)
{ {
AStarInfo info = new AStarInfo(scene, tilewid, tilehei, trav, bx, by); AStarInfo info = new AStarInfo(scene, tilewid, tilehei, trav, bx, by);
@@ -212,7 +211,7 @@ class AStarInfo
public int tilewid, tilehei; public int tilewid, tilehei;
/** The traverser moving along the path. */ /** The traverser moving along the path. */
public Traverser trav; public Object trav;
/** The set of open nodes being searched. */ /** The set of open nodes being searched. */
public SortedSet open; public SortedSet open;
@@ -227,7 +226,7 @@ class AStarInfo
public int maxcost; public int maxcost;
public AStarInfo ( public AStarInfo (
DisplayMisoScene scene, int tilewid, int tilehei, Traverser trav, DisplayMisoScene scene, int tilewid, int tilehei, Object trav,
int destx, int desty) int destx, int desty)
{ {
// save off references // save off references
@@ -284,11 +283,7 @@ class AStarInfo
*/ */
protected boolean isTraversable (int x, int y) protected boolean isTraversable (int x, int y)
{ {
if (isCoordinateValid(x, y)) { return isCoordinateValid(x, y) && scene.canTraverse(trav, x, y);
BaseTile tile = scene.getBaseTile(x, y);
return (tile == null) || trav.canTraverse(tile);
}
return true;
} }
/** /**
@@ -1,5 +1,5 @@
// //
// $Id: IsoUtil.java,v 1.41 2002/12/05 23:06:30 mdb Exp $ // $Id: IsoUtil.java,v 1.42 2003/01/13 22:53:56 mdb Exp $
package com.threerings.miso.scene.util; package com.threerings.miso.scene.util;
@@ -17,7 +17,6 @@ import com.threerings.util.DirectionUtil;
import com.threerings.miso.Log; import com.threerings.miso.Log;
import com.threerings.miso.scene.IsoSceneViewModel; import com.threerings.miso.scene.IsoSceneViewModel;
import com.threerings.miso.scene.MisoCharacterSprite;
import com.threerings.miso.scene.SceneObject; import com.threerings.miso.scene.SceneObject;
/** /**