Added code to display tiles as images.

git-svn-id: https://samskivert.googlecode.com/svn/trunk@442 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2001-11-08 08:00:22 +00:00
parent c69f170765
commit c24dd1926b
5 changed files with 170 additions and 31 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

@@ -1,5 +1,5 @@
//
// $Id: AtlantiBoard.java,v 1.14 2001/11/07 18:03:33 mdb Exp $
// $Id: AtlantiBoard.java,v 1.15 2001/11/08 08:00:22 mdb Exp $
package com.threerings.venison;
@@ -144,7 +144,7 @@ public class VenisonBoard
// the necessary claim group adjustments can be made)
tile.setPiecen(piecen, _tiles);
// and repaint
repaint();
repaintTile(tile);
} else {
Log.warning("Requested to place piecen for which we could " +
@@ -166,7 +166,7 @@ public class VenisonBoard
// clear the piecen out of the tile
tile.clearPiecen();
// and repaint
repaint();
repaintTile(tile);
// and get on out
return;
}
@@ -223,9 +223,6 @@ public class VenisonBoard
if (_placingTile != null) {
updatePlacingInfo(true);
}
// and repaint
repaint();
}
/**
@@ -246,10 +243,21 @@ public class VenisonBoard
_ty = (getHeight() - TILE_HEIGHT * _height)/2;
}
/**
* Causes the supplied tile to be repainted.
*/
public void repaintTile (VenisonTile tile)
{
int offx = _tx + (tile.x + _origX) * TILE_WIDTH;
int offy = _ty + (tile.y + _origY) * TILE_HEIGHT;
repaint(offx, offy, TILE_WIDTH, TILE_HEIGHT);
}
// documentation inherited
public void paintComponent (Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
// center the tile display if we are bigger than we need to be
@@ -271,7 +279,7 @@ public class VenisonBoard
g.setColor(Color.blue);
int sx = (_placingTile.x + _origX) * TILE_WIDTH;
int sy = (_placingTile.y + _origY) * TILE_HEIGHT;
g.drawRect(sx, sy, TILE_WIDTH, TILE_HEIGHT);
g.drawRect(sx, sy, TILE_WIDTH-1, TILE_HEIGHT-1);
}
// if we have a recently placed tile, draw that one as well
@@ -283,7 +291,7 @@ public class VenisonBoard
g.setColor(Color.white);
int sx = (_placedTile.x + _origX) * TILE_WIDTH;
int sy = (_placedTile.y + _origY) * TILE_HEIGHT;
g.drawRect(sx, sy, TILE_WIDTH, TILE_HEIGHT);
g.drawRect(sx, sy, TILE_WIDTH-1, TILE_HEIGHT-1);
}
// draw a white rectangle around the last placed
@@ -291,7 +299,7 @@ public class VenisonBoard
g.setColor(Color.white);
int sx = (_lastPlacedTile.x + _origX) * TILE_WIDTH;
int sy = (_lastPlacedTile.y + _origY) * TILE_HEIGHT;
g.drawRect(sx, sy, TILE_WIDTH, TILE_HEIGHT);
g.drawRect(sx, sy, TILE_WIDTH-1, TILE_HEIGHT-1);
}
// undo our translations
@@ -306,10 +314,9 @@ public class VenisonBoard
_mouseY = evt.getY() - _ty;
if (_placingTile != null) {
// if we have a tile to be placed, update its coordinates
if (updatePlacingInfo(false)) {
repaint();
}
// if we have a tile to be placed, update its coordinates (it
// will automatically be repainted)
updatePlacingInfo(false);
} else if (_placedTile != null && _placingPiecen) {
// if we have a recently placed tile, we're doing piecen
@@ -349,7 +356,7 @@ public class VenisonBoard
}
if (changed) {
repaint();
repaintTile(_placedTile);
}
}
}
@@ -367,7 +374,7 @@ public class VenisonBoard
// clear out any placed piecen because we're placing nothing
if (_placedTile != null && _placedTile.piecen != null) {
_placedTile.piecen = null;
repaint();
repaintTile(_placedTile);
}
// post the action
Controller.postAction(this, PLACE_NOTHING);
@@ -416,12 +423,12 @@ public class VenisonBoard
/**
* Updates the coordinates and orientation of the placing tile based
* on the last known coordinates of the mouse and returns true if the
* coordinates or orientation changed from their previous values.
* on the last known coordinates of the mouse and causes it to be
* repainted.
*/
protected boolean updatePlacingInfo (boolean force)
protected void updatePlacingInfo (boolean force)
{
boolean changed = false;
boolean updated = false;
// convert mouse coordinates into tile coordinates and offset them
// by the origin
@@ -431,12 +438,18 @@ public class VenisonBoard
// if these are different than the values currently in the placing
// tile, update the tile coordinates
if (_placingTile.x != x || _placingTile.y != y || force) {
// if we have a valid orientation presently, and we're moving,
// we need to clear out the old orientation
if (_validPlacement) {
repaintTile(_placingTile);
}
// update the coordinates of the tile
_placingTile.x = x;
_placingTile.y = y;
// we've changed the display, so make a note of it
changed = true;
// make a note that we moved
updated = true;
// we also need to recompute the valid orientations for the
// tile in this new position
@@ -460,14 +473,19 @@ public class VenisonBoard
if (_validOrients[candOrient]) {
if (_placingTile.orientation != candOrient) {
_placingTile.orientation = candOrient;
changed = true;
// make a note that we moved
updated = true;
}
_validPlacement = true;
break;
}
}
return changed;
// if we now have a valid orientation and something was changed,
// we want to repaint at the new tile location
if (_validPlacement && updated) {
repaintTile(_placingTile);
}
}
/**
@@ -6,13 +6,20 @@ package com.threerings.venison;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import javax.swing.*;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import com.samskivert.swing.Controller;
import com.samskivert.swing.ControllerProvider;
import com.samskivert.swing.HGroupLayout;
import com.samskivert.swing.VGroupLayout;
import com.threerings.resource.ResourceManager;
import com.threerings.media.ImageManager;
import com.threerings.crowd.data.PlaceObject;
import com.threerings.crowd.client.PlaceView;
@@ -93,6 +100,21 @@ public class VenisonPanel
// we'll need this later to provide it
_controller = controller;
// we can't create our image manager until we have access to our
// containing frame
addAncestorListener(new AncestorListener() {
public void ancestorAdded (AncestorEvent event) {
// create our image manager
JRootPane rpane = getRootPane();
VenisonTile.setImageManager(
new ImageManager(_rmgr, (Frame)rpane.getParent()));
}
public void ancestorMoved (AncestorEvent event) {
}
public void ancestorRemoved (AncestorEvent event) {
}
});
}
// documentation inherited
@@ -116,4 +138,14 @@ public class VenisonPanel
/** A reference to our controller that we need to implement the {@link
* ControllerProvider} interface. */
protected VenisonController _controller;
// this stuff is all a bit of a hack right now. by all rights, the
// venison app should set up the resource manager, because it knows
// about that sort of stuff, and make it available via the venison
// context and we may have some better place for the image manager to
// live and the tile set would be fetched through the tile
// manager. but it's late and i want to get this working, so fooey.
/** Our resource manager. */
protected static ResourceManager _rmgr = new ResourceManager("rsrc");
}
@@ -1,11 +1,13 @@
//
// $Id: AtlantiTile.java,v 1.10 2001/10/18 20:56:45 mdb Exp $
// $Id: AtlantiTile.java,v 1.11 2001/11/08 08:00:22 mdb Exp $
package com.threerings.venison;
import java.awt.Color;
import java.awt.Image;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.io.DataInputStream;
@@ -15,6 +17,11 @@ import java.util.List;
import com.samskivert.util.IntTuple;
import com.samskivert.util.StringUtil;
import com.threerings.media.ImageManager;
import com.threerings.media.tile.NoSuchTileException;
import com.threerings.media.tile.Tile;
import com.threerings.media.tile.UniformTileSet;
import com.threerings.presents.dobj.DSet;
/**
@@ -258,6 +265,11 @@ public class VenisonTile
{
int tidx = type-1;
// obtain our tile image
if (_tileImage == null) {
_tileImage = getTileImage(type);
}
// compute our screen coordinates
int sx = (x + xoff) * TILE_WIDTH;
int sy = (y + yoff) * TILE_HEIGHT;
@@ -265,10 +277,23 @@ public class VenisonTile
// translate to our screen coordinates
g.translate(sx, sy);
// render our tile image
if (_tileImage != null) {
if (orientation > 0) {
g.drawImage(_tileImage, _xforms[orientation], null);
} else {
g.drawImage(_tileImage, 0, 0, null);
}
} else {
Log.warning("No tile image!? [type=" + type +
", img=" + _tileImage + "].");
}
// render our features and piecen
for (int i = 0; i < features.length; i++) {
// paint the feature
features[i].paint(g, orientation, claims[i]);
// features[i].paint(g, orientation, claims[i]);
// if we have a piecen on this tile, render it as well
if (piecen != null && piecen.featureIndex == i) {
@@ -277,9 +302,9 @@ public class VenisonTile
}
}
// draw a rectangular outline
g.setColor(Color.black);
g.drawRect(0, 0, TILE_WIDTH, TILE_HEIGHT);
// // draw a rectangular outline
// g.setColor(Color.black);
// g.drawRect(0, 0, TILE_WIDTH-1, TILE_HEIGHT-1);
// if we have a shield, draw a square in the lower right
if (hasShield) {
@@ -393,4 +418,70 @@ public class VenisonTile
", claims=" + StringUtil.toString(claims) +
", piecen=" + piecen + "]";
}
/**
* Someone needs to configure this so that we can display tiles on
* screen.
*/
public static void setImageManager (ImageManager imgr)
{
_imgr = imgr;
}
/**
* Fetches the image for the tile of the specified type.
*/
protected static Image getTileImage (int type)
{
// load up the tile set if we haven't already
if (_tset == null) {
_tset = new UniformTileSet(
_imgr, TILES_IMG_PATH, TILE_TYPES, TILE_WIDTH, TILE_HEIGHT);
}
// fetch the tile
try {
Tile tile = _tset.getTile(type-1);
if (tile != null) {
return tile.img;
}
} catch (NoSuchTileException nste) {
// fall through
}
Log.warning("Unable to load tile image [type=" + type + "].");
return null;
}
/** The tile image that we use to render this tile. */
protected Image _tileImage;
/** Our image manager. */
protected static ImageManager _imgr;
/** Our tileset. */
protected static UniformTileSet _tset;
/** The path to our tileset image. */
protected static final String TILES_IMG_PATH = "media/tiles.png";
/** Three affine transforms for rendering an image in three rotated
* orientations. */
protected static AffineTransform[] _xforms;
static {
// the first element will be left blank
_xforms = new AffineTransform[4];
// create our three orientation transforms
AffineTransform xform = new AffineTransform();
for (int orient = 1; orient < 4; orient++) {
// rotate the xform into the next orientation
xform.translate(TILE_WIDTH, 0);
xform.rotate(Math.PI/2);
// and save it
_xforms[orient] = (AffineTransform)xform.clone();
}
}
}
@@ -1,10 +1,8 @@
//
// $Id: TileUtil.java,v 1.14 2001/11/07 10:39:00 mdb Exp $
// $Id: TileUtil.java,v 1.15 2001/11/08 08:00:22 mdb Exp $
package com.threerings.venison;
import java.awt.Polygon;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;