Files
narya/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java
T
Michael Bayne 2ad3f03a34 Changed MisoTile to BaseTile.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@654 542714f4-19e9-0310-aa3c-eee0fc999fb1
2001-11-27 22:17:42 +00:00

175 lines
5.8 KiB
Java

//
// $Id: DisplayMisoSceneImpl.java,v 1.45 2001/11/27 22:17:42 mdb Exp $
package com.threerings.miso.scene;
import com.threerings.media.tile.NoSuchTileException;
import com.threerings.media.tile.NoSuchTileSetException;
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.media.tile.TileManager;
import com.threerings.miso.Log;
import com.threerings.miso.tile.BaseTile;
import com.threerings.miso.tile.BaseTileLayer;
import com.threerings.miso.tile.ShadowTile;
/**
* The default implementation of the {@link DisplayMisoScene} interface.
*/
public class DisplayMisoSceneImpl
implements DisplayMisoScene
{
/**
* Constructs an instance that will be used to display the supplied
* miso scene data. The tiles identified by the scene model will be
* loaded via the supplied tile manager.
*
* @param model the scene data that we'll be displaying.
* @param tmgr the tile manager from which to load our tiles.
*
* @exception NoSuchTileException thrown if the model references a
* tile which is not available via the supplied tile manager.
*/
public DisplayMisoSceneImpl (MisoSceneModel model, TileManager tmgr)
throws NoSuchTileException, NoSuchTileSetException
{
int swid = model.width;
int shei = model.height;
// create the individual tile layer objects
_base = new BaseTileLayer(new BaseTile[swid*shei], swid, shei);
_fringe = new TileLayer(new Tile[swid*shei], swid, shei);
_object = new ObjectTileLayer(new ObjectTile[swid*shei], swid, shei);
// populate the base and fringe layers
for (int column = 0; column < shei; column++) {
for (int row = 0; row < swid; row++) {
// first do the base layer
int tsid = model.baseTileIds[swid*row+column];
if (tsid > 0) {
int tid = (tsid & 0xFFFF);
tsid >>= 16;
// this is a bit magical, but the tile manager will
// fetch tiles from the tileset repository and the
// tile set id from which we request this tile must
// map to a base tile as provided by the repository,
// so we just cast it to a base tile and know that all
// is well
BaseTile mtile = (BaseTile)tmgr.getTile(tsid, tid);
_base.setTile(column, row, mtile);
}
// then the fringe layer
tsid = model.fringeTileIds[swid*row+column];
if (tsid > 0) {
int tid = (tsid & 0xFFFF);
tsid >>= 16;
Tile tile = tmgr.getTile(tsid, tid);
_fringe.setTile(column, row, tile);
}
}
}
// sanity check the object layer info
int ocount = model.objectTileIds.length;
if (ocount % 3 != 0) {
throw new IllegalArgumentException(
"model.objectTileIds.length % 3 != 0");
}
// now populate the object layer
for (int i = 0; i < ocount; i+= 3) {
int row = model.objectTileIds[i];
int col = model.objectTileIds[i+1];
int tsid = model.objectTileIds[i+2];
int tid = (tsid & 0xFFFF);
tsid >>= 16;
// create the object tile and stick it into the appropriate
// spot in the object layer
ObjectTile otile = (ObjectTile)tmgr.getTile(tsid, tid);
_object.setTile(col, row, otile);
// we have to generate a shadow for this object tile in the
// base layer so that we can prevent sprites from walking on
// the object
generateObjectShadow(row, col);
}
}
// documentation inherited
public BaseTileLayer getBaseLayer ()
{
return _base;
}
// documentation inherited
public TileLayer getFringeLayer ()
{
return _fringe;
}
// documentation inherited
public ObjectTileLayer getObjectLayer ()
{
return _object;
}
/**
* Return a string representation of this Miso scene object.
*/
public String toString ()
{
StringBuffer buf = new StringBuffer();
buf.append("[width=").append(_base.getWidth());
buf.append(", height=").append(_base.getHeight());
return buf.append("]").toString();
}
/**
* Place shadow tiles in the footprint of the object tile at the given
* coordinates in the scene. This method should be called when an
* object tile is added to the scene.
*
* @param x the tile x-coordinate.
* @param y the tile y-coordinate.
*/
protected void generateObjectShadow (int x, int y)
{
setObjectTileFootprint(x, y, new ShadowTile(x, y));
}
/**
* Place the given tile in the footprint of the object tile at the
* given coordinates in the scene.
*
* @param x the tile x-coordinate.
* @param y the tile y-coordinate.
* @param stamp the tile to place in the object footprint.
*/
protected void setObjectTileFootprint (int x, int y, BaseTile stamp)
{
ObjectTile tile = _object.getTile(y, x);
int endx = Math.max(0, (x - tile.getBaseWidth() + 1));
int endy = Math.max(0, (y - tile.getBaseHeight() + 1));
for (int xx = x; xx >= endx; xx--) {
for (int yy = y; yy >= endy; yy--) {
_base.setTile(yy, xx, stamp);
}
}
}
/** The base layer of tiles. */
protected BaseTileLayer _base;
/** The fringe layer of tiles. */
protected TileLayer _fringe;
/** The object layer of tiles. */
protected ObjectTileLayer _object;
}