Files
narya/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java
T
Michael Bayne a85ba5e2c6 Fetch things via the resource manager. Modified code to create resource
manager and then create image manager as well where appropriate.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@604 542714f4-19e9-0310-aa3c-eee0fc999fb1
2001-11-08 02:58:24 +00:00

225 lines
6.4 KiB
Java

//
// $Id: ViewerSceneViewPanel.java,v 1.30 2001/11/08 02:58:24 mdb Exp $
package com.threerings.miso.viewer;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JPanel;
import com.samskivert.util.Config;
import com.threerings.cast.CharacterDescriptor;
import com.threerings.cast.CharacterManager;
import com.threerings.cast.util.CastUtil;
import com.threerings.media.ImageManager;
import com.threerings.media.sprite.*;
import com.threerings.media.tile.TileManager;
import com.threerings.media.util.RandomUtil;
import com.threerings.media.util.PerformanceMonitor;
import com.threerings.media.util.PerformanceObserver;
import com.threerings.miso.Log;
import com.threerings.miso.scene.*;
import com.threerings.miso.scene.xml.XMLSceneRepository;
import com.threerings.miso.scene.util.IsoUtil;
import com.threerings.miso.util.*;
import com.threerings.miso.viewer.util.ViewerContext;
public class ViewerSceneViewPanel extends SceneViewPanel
implements PerformanceObserver, SpriteObserver
{
/**
* Construct the panel and initialize it with a context.
*/
public ViewerSceneViewPanel (ViewerContext ctx, SpriteManager spritemgr)
{
super(ctx.getConfig(), spritemgr);
_ctx = ctx;
// create an animation manager for this panel
_animmgr = new AnimationManager(spritemgr, this);
// load up the initial scene
prepareStartingScene();
// construct the character manager from which we obtain sprites
CharacterManager charmgr = MisoUtil.createCharacterManager(
ctx.getConfig(), ctx.getImageManager());
// create the character descriptors
_descUser = CastUtil.getRandomDescriptor(charmgr);
_descDecoy = CastUtil.getRandomDescriptor(charmgr);
// create the manipulable sprite
_sprite = createSprite(spritemgr, charmgr, _descUser);
// create the decoy sprites
createDecoys(spritemgr, charmgr);
// listen to the desired events
addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent e) {
ViewerSceneViewPanel.this.mousePressed(e);
}
});
PerformanceMonitor.register(this, "paint", 1000);
}
/**
* Creates a new sprite.
*/
protected MisoCharacterSprite createSprite (
SpriteManager spritemgr, CharacterManager charmgr,
CharacterDescriptor desc)
{
MisoCharacterSprite s =
(MisoCharacterSprite)charmgr.getCharacter(desc);
if (s != null) {
s.setLocation(300, 300);
IsoUtil.setSpriteSceneLocation(_scenemodel, s);
s.addSpriteObserver(this);
spritemgr.addSprite(s);
}
return s;
}
/**
* Creates the decoy sprites.
*/
protected void createDecoys (
SpriteManager spritemgr, CharacterManager charmgr)
{
_decoys = new MisoCharacterSprite[NUM_DECOYS];
for (int ii = 0; ii < NUM_DECOYS; ii++) {
_decoys[ii] = createSprite(spritemgr, charmgr, _descDecoy);
if (_decoys[ii] != null) {
createRandomPath(_decoys[ii]);
}
}
}
/**
* Load and set up the starting scene for display.
*/
protected void prepareStartingScene ()
{
ViewerModel model = _ctx.getViewerModel();
try {
XMLSceneRepository screpo = _ctx.getSceneRepository();
InputStream scin = _ctx.getResourceManager().
getResource(model.scenefile);
_view.setScene(screpo.loadScene(scin));
} catch (IOException ioe) {
Log.warning("Exception loading scene [fname=" + model.scenefile +
", ioe=" + ioe + "].");
}
}
// documentation inherited
public void paintComponent (Graphics g)
{
super.paintComponent(g);
PerformanceMonitor.tick(this, "paint");
}
// documentation inherited
public void checkpoint (String name, int ticks)
{
Log.info(name + " [ticks=" + ticks + "].");
}
/** MouseListener interface methods */
public void mousePressed (MouseEvent e)
{
int x = e.getX(), y = e.getY();
switch (e.getModifiers()) {
case MouseEvent.BUTTON1_MASK:
createPath(_sprite, x, y);
break;
case MouseEvent.BUTTON2_MASK:
for (int ii = 0; ii < NUM_DECOYS; ii++) {
createPath(_decoys[ii], x, y);
}
break;
}
}
/**
* Assigns the sprite a path leading to the given destination
* screen coordinates. Returns whether a path was successfully
* assigned.
*/
protected boolean createPath (MisoCharacterSprite s, int x, int y)
{
// get the path from here to there
Path path = _view.getPath(s, x, y);
if (path == null) {
s.cancelMove();
return false;
}
// start the sprite moving along the path
((LineSegmentPath)path).setVelocity(100f/1000f);
s.move(path);
return true;
}
/**
* Assigns a new random path to the given sprite.
*/
protected void createRandomPath (MisoCharacterSprite s)
{
Dimension d = _scenemodel.bounds.getSize();
int x, y;
do {
x = RandomUtil.getInt(d.width);
y = RandomUtil.getInt(d.height);
} while (!createPath(s, x, y));
}
// documentation inherited
public void handleEvent (SpriteEvent event)
{
if (event instanceof PathCompletedEvent) {
MisoCharacterSprite s = (MisoCharacterSprite)event.getSprite();
if (s != _sprite) {
// move the sprite to a new random location
createRandomPath(s);
}
}
}
/** The number of decoy characters milling about. */
protected static final int NUM_DECOYS = 10;
/** The character descriptor for the user character. */
protected CharacterDescriptor _descUser;
/** The character descriptor for the decoy characters. */
protected CharacterDescriptor _descDecoy;
/** The animation manager. */
protected AnimationManager _animmgr;
/** The sprite we're manipulating within the view. */
protected MisoCharacterSprite _sprite;
/** The test sprites that meander about aimlessly. */
protected MisoCharacterSprite _decoys[];
/** The context object. */
protected ViewerContext _ctx;
}