Fixed up image loading to use the now-non-static ImageManager class.

Modified TileManager to store the height of a tile in the Tile
object's member data when the tile is initially created since we
would like to be able to reference it speedily.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@63 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Walter Korman
2001-07-18 22:45:35 +00:00
parent c4654e2a11
commit f91e1b41d1
11 changed files with 84 additions and 54 deletions
@@ -1,12 +1,14 @@
// //
// $Id: ImageManager.java,v 1.1 2001/07/18 21:45:42 shaper Exp $ // $Id: ImageManager.java,v 1.2 2001/07/18 22:45:34 shaper Exp $
package com.threerings.media; package com.threerings.media;
import com.threerings.cocktail.miso.Log; import com.threerings.miso.Log;
import com.threerings.resource.ResourceManager;
import java.awt.*; import java.awt.*;
import java.awt.image.*; import java.awt.image.*;
import java.io.IOException;
import java.util.Hashtable; import java.util.Hashtable;
/** /**
@@ -20,14 +22,16 @@ import java.util.Hashtable;
*/ */
public class ImageManager public class ImageManager
{ {
public static Toolkit tk = Toolkit.getDefaultToolkit(); public Toolkit tk = Toolkit.getDefaultToolkit();
/** /**
* Initialize the ImageManager with a root component to which * Construct an ImageManager object with the ResourceManager from
* images will later be rendered. * which it will obtain its data, and a root component to which
* images will be rendered.
*/ */
public static void init (Component root) public ImageManager (ResourceManager rmgr, Component root)
{ {
_rmgr = rmgr;
_root = root; _root = root;
tk = root.getToolkit(); tk = root.getToolkit();
} }
@@ -36,19 +40,13 @@ public class ImageManager
* Load the image from the specified filename and cache it for * Load the image from the specified filename and cache it for
* faster retrieval henceforth. * faster retrieval henceforth.
*/ */
public static Image getImage (String fname) public Image getImage (String fname)
{ {
if (_root == null) { if (_root == null) {
Log.warning("Attempt to get image without valid root component."); Log.warning("Attempt to get image without valid root component.");
return null; return null;
} }
// TODO: fix this to properly find the file within the
// classpath. getResourceAsStream() returns an InputStream,
// but java.awt.Toolkit.createImage() can only take one of a
// byte[], String, URL, or ImageProducer.
fname = "/home/shaper/workspace/cocktail/" + fname;
Image img = (Image)_imgs.get(fname); Image img = (Image)_imgs.get(fname);
if (img != null) { if (img != null) {
Log.info("Retrieved image from cache [fname=" + fname + "]."); Log.info("Retrieved image from cache [fname=" + fname + "].");
@@ -57,11 +55,12 @@ public class ImageManager
Log.info("Loading image into cache [fname=" + fname + "]."); Log.info("Loading image into cache [fname=" + fname + "].");
img = tk.createImage(fname);
MediaTracker tracker = new MediaTracker(_root);
tracker.addImage(img, 0);
try { try {
byte[] data = _rmgr.getResourceAsBytes(fname);
img = tk.createImage(data);
MediaTracker tracker = new MediaTracker(_root);
tracker.addImage(img, 0);
tracker.waitForID(0); tracker.waitForID(0);
if (tracker.isErrorAny()) { if (tracker.isErrorAny()) {
Log.warning("Error loading image [fname=" + fname + "]."); Log.warning("Error loading image [fname=" + fname + "].");
@@ -71,8 +70,11 @@ public class ImageManager
_imgs.put(fname, img); _imgs.put(fname, img);
} }
} catch (Exception e) { } catch (IOException ioe) {
e.printStackTrace(); Log.warning("Exception loading image [ioe=" + ioe + "].");
} catch (InterruptedException ie) {
Log.warning("Interrupted loading image [ie=" + ie + "].");
} }
return img; return img;
@@ -82,8 +84,8 @@ public class ImageManager
* Creates a new image representing the specified rectangular * Creates a new image representing the specified rectangular
* section cropped from the specified full image object. * section cropped from the specified full image object.
*/ */
public static BufferedImage getImageCropped (Image fullImg, int x, int y, public Image getImageCropped (Image fullImg, int x, int y,
int width, int height) int width, int height)
{ {
BufferedImage img = BufferedImage img =
new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
@@ -94,6 +96,7 @@ public class ImageManager
return img; return img;
} }
protected static Component _root; protected ResourceManager _rmgr;
protected static Hashtable _imgs = new Hashtable(); protected Component _root;
protected Hashtable _imgs = new Hashtable();
} }
+5 -5
View File
@@ -1,19 +1,19 @@
// //
// $Id: Tile.java,v 1.4 2001/07/18 21:45:42 shaper Exp $ // $Id: Tile.java,v 1.5 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
import java.awt.Image; import java.awt.Image;
import java.awt.image.BufferedImage;
/** /**
* A tile represents a single square in a single layer in a scene. * A tile represents a single square in a single layer in a scene.
*/ */
public class Tile public class Tile
{ {
public BufferedImage img; // the tile image public Image img; // the tile image
public short tsid; // the tile set identifier public short tsid; // the tile set identifier
public short tid; // the tile identifier within the set public short tid; // the tile identifier within the set
public short height; // the tile height in pixels
// height and width of a tile image in pixels // height and width of a tile image in pixels
public static final int HEIGHT = 16; public static final int HEIGHT = 16;
@@ -1,5 +1,5 @@
// //
// $Id: TileManager.java,v 1.6 2001/07/18 21:45:42 shaper Exp $ // $Id: TileManager.java,v 1.7 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
@@ -9,6 +9,7 @@ import com.samskivert.util.ConfigUtil;
import com.samskivert.util.IntMap; import com.samskivert.util.IntMap;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
@@ -60,19 +61,12 @@ public class TileManager
return tile; return tile;
} }
// retrieve the tileset containing the tile
TileSet tset = _tsmgr.getTileSet(tsid);
if (tset == null) {
Log.warning("Can't create tile due to unknown tileset " +
"[tsid=" + tsid + ", tid=" + tid + "].");
return null;
}
// retrieve the tile image from the tileset // retrieve the tile image from the tileset
tile = new Tile(tsid, tid); tile = new Tile(tsid, tid);
if ((tile.img = tset.getTileImage(tid)) == null) { if ((tile.img = _tsmgr.getTileImage(tsid, tid)) == null) {
Log.warning("Null tile image [tsid="+tsid+", tid="+tid+"]."); Log.warning("Null tile image [tsid="+tsid+", tid="+tid+"].");
} }
tile.height = (short)((BufferedImage)tile.img).getHeight();
_tiles.put(utid, tile); _tiles.put(utid, tile);
@@ -1,5 +1,5 @@
// //
// $Id: TileSet.java,v 1.7 2001/07/18 21:45:42 shaper Exp $ // $Id: TileSet.java,v 1.8 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
@@ -62,11 +62,11 @@ public class TileSet
* Return the image corresponding to the specified tile id within * Return the image corresponding to the specified tile id within
* this tile set. * this tile set.
*/ */
public BufferedImage getTileImage (int tid) public Image getTileImage (ImageManager imgr, int tid)
{ {
// load the full tile image if we don't already have it // load the full tile image if we don't already have it
if (_imgTiles == null) { if (_imgTiles == null) {
if ((_imgTiles = ImageManager.getImage(_imgFile)) == null) { if ((_imgTiles = imgr.getImage(_imgFile)) == null) {
Log.warning("Failed to retrieve full tileset image " + Log.warning("Failed to retrieve full tileset image " +
"[file=" + _imgFile + "]."); "[file=" + _imgFile + "].");
return null; return null;
@@ -89,8 +89,8 @@ public class TileSet
// ", ty=" + ty + "]."); // ", ty=" + ty + "].");
// crop the tile-sized image chunk from the full image // crop the tile-sized image chunk from the full image
return ImageManager.getImageCropped(_imgTiles, tx, ty, return imgr.getImageCropped(_imgTiles, tx, ty,
Tile.WIDTH, _rowHeight[ridx]); Tile.WIDTH, _rowHeight[ridx]);
} }
/** /**
@@ -1,8 +1,9 @@
// //
// $Id: TileSetManager.java,v 1.4 2001/07/18 21:45:42 shaper Exp $ // $Id: TileSetManager.java,v 1.5 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
import java.awt.Image;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -14,6 +15,11 @@ public interface TileSetManager
*/ */
public TileSet getTileSet (int tsid); public TileSet getTileSet (int tsid);
/**
* Return the image corresponding to the specified tileset and tile id.
*/
public Image getTileImage (int tsid, int tid);
/** /**
* Return a list of all tilesets available for use. * Return a list of all tilesets available for use.
*/ */
@@ -1,20 +1,34 @@
// //
// $Id: TileSetManagerImpl.java,v 1.3 2001/07/18 21:45:42 shaper Exp $ // $Id: TileSetManagerImpl.java,v 1.4 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
import com.threerings.media.ImageManager;
import com.samskivert.util.IntMap; import com.samskivert.util.IntMap;
import java.awt.Image;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
public abstract class TileSetManagerImpl implements TileSetManager public abstract class TileSetManagerImpl implements TileSetManager
{ {
public TileSetManagerImpl (ImageManager imgr)
{
_imgr = imgr;
}
public TileSet getTileSet (int tsid) public TileSet getTileSet (int tsid)
{ {
return (TileSet)_tilesets.get(tsid); return (TileSet)_tilesets.get(tsid);
} }
public Image getTileImage (int tsid, int tid)
{
TileSet tset = getTileSet(tsid);
return (tset != null) ? tset.getTileImage(_imgr, tid) : null;
}
public ArrayList getTileSets () public ArrayList getTileSets ()
{ {
int size = _tilesets.size(); int size = _tilesets.size();
@@ -35,5 +49,6 @@ public abstract class TileSetManagerImpl implements TileSetManager
return _tilesets.size(); return _tilesets.size();
} }
protected ImageManager _imgr;
protected IntMap _tilesets = new IntMap(); protected IntMap _tilesets = new IntMap();
} }
@@ -1,5 +1,5 @@
// //
// $Id: IsoSceneView.java,v 1.6 2001/07/18 21:45:42 shaper Exp $ // $Id: IsoSceneView.java,v 1.7 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -7,7 +7,6 @@ import com.threerings.miso.Log;
import com.threerings.miso.tile.Tile; import com.threerings.miso.tile.Tile;
import com.threerings.miso.tile.TileManager; import com.threerings.miso.tile.TileManager;
import com.threerings.miso.util.MathUtil; import com.threerings.miso.util.MathUtil;
import com.threerings.media.ImageManager;
import java.awt.*; import java.awt.*;
import java.awt.image.*; import java.awt.image.*;
@@ -89,7 +88,7 @@ public class IsoSceneView implements SceneView
// TODO: draw layers L1+. // TODO: draw layers L1+.
Tile tile = _scene.tiles[tx][ty][Scene.LAYER_BASE]; Tile tile = _scene.tiles[tx][ty][Scene.LAYER_BASE];
int ypos = screenY - (tile.img.getHeight() - Tile.HEIGHT); int ypos = screenY - (tile.height - Tile.HEIGHT);
g2.drawImage(tile.img, screenX, ypos, null); g2.drawImage(tile.img, screenX, ypos, null);
//paintCoords(g2, tx, ty, screenX, screenY); //paintCoords(g2, tx, ty, screenX, screenY);
@@ -1,13 +1,20 @@
// //
// $Id: CompiledTileSetManager.java,v 1.4 2001/07/18 21:45:42 shaper Exp $ // $Id: CompiledTileSetManager.java,v 1.5 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
import com.threerings.media.ImageManager;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
public class CompiledTileSetManager extends TileSetManagerImpl public class CompiledTileSetManager extends TileSetManagerImpl
{ {
public CompiledTileSetManager (ImageManager imgr)
{
super(imgr);
}
public void loadTileSets (InputStream tis) throws IOException public void loadTileSets (InputStream tis) throws IOException
{ {
// TBD // TBD
@@ -1,9 +1,10 @@
// //
// $Id: EditableTileSetManager.java,v 1.4 2001/07/18 21:45:42 shaper Exp $ // $Id: EditableTileSetManager.java,v 1.5 2001/07/18 22:45:35 shaper Exp $
package com.threerings.miso.tile; package com.threerings.miso.tile;
import com.threerings.miso.Log; import com.threerings.miso.Log;
import com.threerings.media.ImageManager;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -17,6 +18,11 @@ import java.util.ArrayList;
*/ */
public class EditableTileSetManager extends TileSetManagerImpl public class EditableTileSetManager extends TileSetManagerImpl
{ {
public EditableTileSetManager (ImageManager imgr)
{
super(imgr);
}
public void loadTileSets (InputStream tis) throws IOException public void loadTileSets (InputStream tis) throws IOException
{ {
// read all tileset descriptions from the XML input stream // read all tileset descriptions from the XML input stream
+4 -4
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" standalone="yes"?> <?xml version="1.0" standalone="yes"?>
<!-- $Id: tilesets.xml,v 1.1 2001/07/17 17:16:53 shaper Exp $ --> <!-- $Id: tilesets.xml,v 1.2 2001/07/18 22:45:33 shaper Exp $ -->
<!-- Initial test tileset description data. --> <!-- Initial test tileset description data. -->
@@ -9,7 +9,7 @@
<tileset> <tileset>
<name>Ground</name> <name>Ground</name>
<tsid>1000</tsid> <tsid>1000</tsid>
<imagefile>rsrc/media/miso/tiles-base.png</imagefile> <imagefile>media/miso/tiles-base.png</imagefile>
<rowheight>16, 16</rowheight> <rowheight>16, 16</rowheight>
<tilecount>10, 10</tilecount> <tilecount>10, 10</tilecount>
</tileset> </tileset>
@@ -17,9 +17,9 @@
<tileset> <tileset>
<name>Wall</name> <name>Wall</name>
<tsid>1001</tsid> <tsid>1001</tsid>
<imagefile>rsrc/media/miso/tiles-wall.png</imagefile> <imagefile>media/miso/tiles-wall.png</imagefile>
<rowheight>45, 45</rowheight> <rowheight>45, 45</rowheight>
<tilecount>2, 2</tilecount> <tilecount>3, 3</tilecount>
</tileset> </tileset>
</tilesetgroup> </tilesetgroup>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB