- Do time math with the last timestamp rather then precomputing the next

timestamp so that we can switch frame rate on the fly.
- added setLength() to use a subset of the sequence
- added setResetOnInit() so that the sequencer can be swapped into a new
  animation without being reset if desired.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2409 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Ray Greenwell
2003-04-14 20:36:16 +00:00
parent c0f4ed2777
commit 3bdeed559f
@@ -1,5 +1,5 @@
// //
// $Id: AnimationFrameSequencer.java,v 1.4 2003/04/14 17:16:23 ray Exp $ // $Id: AnimationFrameSequencer.java,v 1.5 2003/04/14 20:36:16 ray Exp $
package com.threerings.media.animation; package com.threerings.media.animation;
@@ -78,6 +78,26 @@ public interface AnimationFrameSequencer extends FrameSequencer
_delay = msPerFrame; _delay = msPerFrame;
} }
/**
* Set the length of the sequence we are to use, or 0 means set
* it to the length of the sequence array that we were constructed with.
*/
public void setLength (int len)
{
_length = (len == 0) ? _sequence.length : len;
if (_curIdx >= _length) {
_curIdx = 0;
}
}
/**
* Do we reset the animation on init? Default is true.
*/
public void setResetOnInit (boolean resets)
{
_resets = resets;
}
// documentation inherited from interface // documentation inherited from interface
public void init (MultiFrameImage source) public void init (MultiFrameImage source)
{ {
@@ -92,8 +112,10 @@ public interface AnimationFrameSequencer extends FrameSequencer
} }
} }
_nextStamp = 0L; if (_resets) {
_curIdx = 0; _lastStamp = 0L;
_curIdx = 0;
}
} }
// documentation inherited from interface // documentation inherited from interface
@@ -102,27 +124,21 @@ public interface AnimationFrameSequencer extends FrameSequencer
_animation = anim; _animation = anim;
} }
/**
* Set the length of the sequence we are to use.
*/
public void setLength (int len)
{
_length = len;
}
// documentation inherited from interface // documentation inherited from interface
public int tick (long tickStamp) public int tick (long tickStamp)
{ {
// obtain our starting timestamp if we don't already have one // obtain our starting timestamp if we don't already have one
if (_nextStamp == 0L) { if (_lastStamp == 0L) {
_nextStamp = tickStamp + getDelay(_curIdx); _lastStamp = tickStamp;
// we might need to notify on the first frame // we might need to notify on the first frame
checkNotify(tickStamp); checkNotify(tickStamp);
} }
// we may have rushed through more than one frame since the last // we may have rushed through more than one frame since the last
// tick, but we want to always notify even if we never displayed // tick, but we want to always notify even if we never displayed
while (tickStamp >= _nextStamp) { long curdelay = getDelay(_curIdx);
while (tickStamp >= (_lastStamp + curdelay)) {
_lastStamp += curdelay;
_curIdx++; _curIdx++;
if (_curIdx == _length) { if (_curIdx == _length) {
if (_loop) { if (_loop) {
@@ -132,7 +148,9 @@ public interface AnimationFrameSequencer extends FrameSequencer
} }
} }
checkNotify(tickStamp); checkNotify(tickStamp);
_nextStamp += getDelay(_curIdx);
// get the delay for checking the next frame
curdelay = getDelay(_curIdx);
} }
// return the right frame // return the right frame
@@ -143,7 +161,7 @@ public interface AnimationFrameSequencer extends FrameSequencer
public void fastForward (long timeDelta) public void fastForward (long timeDelta)
{ {
// this method should be called "unpause" // this method should be called "unpause"
_nextStamp += timeDelta; _lastStamp += timeDelta;
} }
/** /**
@@ -172,6 +190,9 @@ public interface AnimationFrameSequencer extends FrameSequencer
/** The length of our animation sequence. */ /** The length of our animation sequence. */
protected int _length; protected int _length;
/** Do we reset on init? */
protected boolean _resets = true;
/** The sequence of frames to display. */ /** The sequence of frames to display. */
protected int[] _sequence; protected int[] _sequence;
@@ -187,8 +208,8 @@ public interface AnimationFrameSequencer extends FrameSequencer
/** Does the animation loop? */ /** Does the animation loop? */
protected boolean _loop; protected boolean _loop;
/** The time at which we'll switch to the next frame. */ /** The time at which we were last ticked. */
protected long _nextStamp; protected long _lastStamp;
/** The animation that we're sequencing for. */ /** The animation that we're sequencing for. */
protected Animation _animation; protected Animation _animation;