Files
narya/src/java/com/threerings/cast/CharacterSprite.java
T
Michael Bayne e7022fcfff Added facilities for specifying the resting and path-following actions
because they won't always be standing and walking.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1056 542714f4-19e9-0310-aa3c-eee0fc999fb1
2002-02-19 22:09:08 +00:00

170 lines
4.7 KiB
Java

//
// $Id: CharacterSprite.java,v 1.21 2002/02/19 22:09:08 mdb Exp $
package com.threerings.cast;
import com.threerings.media.sprite.MultiFrameImage;
import com.threerings.media.sprite.Path;
import com.threerings.media.sprite.Sprite;
/**
* A character sprite is a sprite that animates itself while walking
* about in a scene.
*/
public class CharacterSprite
extends Sprite implements StandardActions
{
/**
* Initializes this character sprite with the specified character
* descriptor and character manager. It will obtain animation data
* from the supplied character manager.
*/
public void init (CharacterDescriptor descrip, CharacterManager charmgr)
{
// keep track of this stuff
_descrip = descrip;
_charmgr = charmgr;
// assign an arbitrary starting orientation
_orient = NORTH;
}
/**
* Specifies the action to use when the sprite is at rest. The default
* is <code>STANDING</code>.
*/
public void setRestingAction (String action)
{
_restingAction = action;
}
/**
* Specifies the action to use when the sprite is following a path.
* The default is <code>WALKING</code>.
*/
public void setFollowingPathAction (String action)
{
_followingPathAction = action;
}
/**
* Sets the action sequence used when rendering the character, from
* the set of available sequences.
*/
public void setActionSequence (String action)
{
// get a reference to the action sequence so that we can obtain
// our animation frames and configure our frames per second
ActionSequence actseq = _charmgr.getActionSequence(action);
if (actseq == null) {
String errmsg = "No such action '" + action + "'.";
throw new IllegalArgumentException(errmsg);
}
try {
// obtain our animation frames for this action sequence
_frames = _charmgr.getActionFrames(_descrip, action);
// update the sprite render attributes
setOrigin(actseq.origin.x, actseq.origin.y);
setFrameRate(actseq.framesPerSecond);
setFrames(_frames[_orient]);
} catch (NoSuchComponentException nsce) {
Log.warning("Character sprite referneces non-existent " +
"component [sprite=" + this + ", err=" + nsce + "].");
}
}
// documentation inherited
public void setOrientation (int orient)
{
super.setOrientation(orient);
// update the sprite frames to reflect the direction
setFrames(_frames[orient]);
}
/**
* Sets the origin coordinates representing the "base" of the
* sprite, which in most cases corresponds to the center of the
* bottom of the sprite image.
*/
public void setOrigin (int x, int y)
{
_xorigin = x;
_yorigin = y;
updateRenderOffset();
updateRenderOrigin();
}
// documentation inherited
protected void updateRenderOffset ()
{
super.updateRenderOffset();
if (_frame != null) {
// our location is based on the character origin coordinates
_rxoff = -_xorigin;
_ryoff = -_yorigin;
}
}
// documentation inherited
public void cancelMove ()
{
super.cancelMove();
halt();
}
// documentation inherited
protected void pathBeginning ()
{
super.pathBeginning();
// enable walking animation
setActionSequence(_followingPathAction);
setAnimationMode(TIME_BASED);
}
// documentation inherited
protected void pathCompleted ()
{
super.pathCompleted();
halt();
}
/**
* Updates the sprite animation frame to reflect the cessation of
* movement and disables any further animation.
*/
protected void halt ()
{
// disable animation
setAnimationMode(NO_ANIMATION);
// come to a halt looking settled and at peace
setActionSequence(_restingAction);
}
/** The action to use when at rest. */
protected String _restingAction = STANDING;
/** The action to use when following a path. */
protected String _followingPathAction = WALKING;
/** A reference to the descriptor for the character that we're
* visualizing. */
protected CharacterDescriptor _descrip;
/** A reference to the character manager that created us. */
protected CharacterManager _charmgr;
/** The animation frames for the active action sequence in each
* orientation. */
protected MultiFrameImage[] _frames;
/** The origin of the sprite. */
protected int _xorigin, _yorigin;
}