Revamped animation observation.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2505 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: Animation.java,v 1.9 2002/10/08 21:03:37 ray Exp $
|
||||
// $Id: Animation.java,v 1.10 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
@@ -60,17 +60,6 @@ public abstract class Animation extends AbstractMedia
|
||||
addObserver(obs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies any animation observers that the given animation event has
|
||||
* occurred.
|
||||
*/
|
||||
public void notifyObservers (AnimationEvent event)
|
||||
{
|
||||
if (_observers != null) {
|
||||
_mgr.queueNotification(_observers, event);
|
||||
}
|
||||
}
|
||||
|
||||
/** Whether the animation is finished. */
|
||||
protected boolean _finished = false;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// $Id: AnimationAdapter.java,v 1.1 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
/**
|
||||
* An adapter class for {@link AnimationObserver}.
|
||||
*/
|
||||
public class AnimationAdapter implements AnimationObserver
|
||||
{
|
||||
// documentation inherited from interface
|
||||
public void animationCompleted (Animation anim, long when)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
//
|
||||
// $Id: AnimationCompletedEvent.java,v 1.2 2002/11/05 20:51:13 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
/**
|
||||
* An animation completed event is dispatched when an animation has
|
||||
* completed all of its business.
|
||||
*/
|
||||
public class AnimationCompletedEvent extends AnimationEvent
|
||||
{
|
||||
public AnimationCompletedEvent (Animation anim, long when)
|
||||
{
|
||||
super(anim, when);
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
//
|
||||
// $Id: AnimationEvent.java,v 1.2 2002/11/05 20:51:13 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
/**
|
||||
* An animation event is sent to all of an animation's observers whenever
|
||||
* one of the various possible animation events takes place.
|
||||
*/
|
||||
public class AnimationEvent
|
||||
{
|
||||
/**
|
||||
* Create an animation event.
|
||||
*
|
||||
* @param animation the involved animation.
|
||||
* @param when the time at which this event took place.
|
||||
*/
|
||||
public AnimationEvent (Animation anim, long when)
|
||||
{
|
||||
_anim = anim;
|
||||
_when = when;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the animation involved in the event.
|
||||
*/
|
||||
public Animation getAnimation ()
|
||||
{
|
||||
return _anim;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time associated with this event.
|
||||
*/
|
||||
public long getWhen ()
|
||||
{
|
||||
return _when;
|
||||
}
|
||||
|
||||
/** The animation associated with this event. */
|
||||
protected Animation _anim;
|
||||
|
||||
/** The time associated with this event. */
|
||||
protected long _when;
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
//
|
||||
// $Id: AnimationFrameSequencer.java,v 1.5 2003/04/14 20:36:16 ray Exp $
|
||||
// $Id: AnimationFrameSequencer.java,v 1.6 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.samskivert.util.ObserverList;
|
||||
|
||||
import com.threerings.media.util.FrameSequencer;
|
||||
import com.threerings.media.util.MultiFrameImage;
|
||||
|
||||
@@ -19,8 +21,9 @@ public interface AnimationFrameSequencer extends FrameSequencer
|
||||
public void setAnimation (Animation anim);
|
||||
|
||||
/**
|
||||
* A frame sequencer that can step through a series of frames in any order
|
||||
* and speed and send events when specific frames are reached.
|
||||
* A sequencer that can step through a series of frames in any order
|
||||
* and speed and notify (via {@link SequencedAnimationObserver}) when
|
||||
* specific frames are reached.
|
||||
*/
|
||||
public static class MultiFunction implements AnimationFrameSequencer
|
||||
{
|
||||
@@ -178,9 +181,9 @@ public interface AnimationFrameSequencer extends FrameSequencer
|
||||
protected void checkNotify (long tickStamp)
|
||||
{
|
||||
if (_marks[_curIdx]) {
|
||||
_animation.notifyObservers(
|
||||
new FrameReachedEvent(
|
||||
_animation, tickStamp, _sequence[_curIdx], _curIdx));
|
||||
_animation.queueNotification(
|
||||
new FrameReachedOp(_animation, tickStamp,
|
||||
_sequence[_curIdx], _curIdx));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,5 +216,29 @@ public interface AnimationFrameSequencer extends FrameSequencer
|
||||
|
||||
/** The animation that we're sequencing for. */
|
||||
protected Animation _animation;
|
||||
|
||||
/** Used to dispatch {@link AnimationObserver#frameReached}. */
|
||||
protected static class FrameReachedOp implements ObserverList.ObserverOp
|
||||
{
|
||||
public FrameReachedOp (Animation anim, long when,
|
||||
int frameIdx, int frameSeq) {
|
||||
_anim = anim;
|
||||
_when = when;
|
||||
_frameIdx = frameIdx;
|
||||
_frameSeq = frameSeq;
|
||||
}
|
||||
|
||||
public boolean apply (Object observer) {
|
||||
if (observer instanceof SequencedAnimationObserver) {
|
||||
((SequencedAnimationObserver)observer).frameReached(
|
||||
_anim, _when, _frameIdx, _frameSeq);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected Animation _anim;
|
||||
protected long _when;
|
||||
protected int _frameIdx, _frameSeq;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: AnimationManager.java,v 1.15 2002/11/05 20:51:50 mdb Exp $
|
||||
// $Id: AnimationManager.java,v 1.16 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
@@ -50,45 +50,34 @@ public class AnimationManager extends AbstractMediaManager
|
||||
{
|
||||
super.tickAllMedia(tickStamp);
|
||||
|
||||
// remove any finished animations
|
||||
for (int ii=_media.size() - 1; ii >= 0; ii--) {
|
||||
for (int ii = _media.size() - 1; ii >= 0; ii--) {
|
||||
Animation anim = (Animation)_media.get(ii);
|
||||
if (anim.isFinished()) {
|
||||
// let any animation observers know that we're done
|
||||
anim.notifyObservers(
|
||||
new AnimationCompletedEvent(anim, tickStamp));
|
||||
// un-register the animation
|
||||
unregisterAnimation(anim);
|
||||
// let the animation clean itself up as necessary
|
||||
anim.didFinish();
|
||||
// Log.info("Removed finished animation [anim=" + anim + "].");
|
||||
if (!anim.isFinished()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// as the anim is finished, remove it and notify observers
|
||||
anim.queueNotification(new AnimCompletedOp(anim, tickStamp));
|
||||
unregisterAnimation(anim);
|
||||
anim.didFinish();
|
||||
// Log.info("Removed finished animation " + anim + ".");
|
||||
}
|
||||
}
|
||||
|
||||
// documentation inherited
|
||||
protected void dispatchEvent (ObserverList observers, Object event)
|
||||
/** Used to dispatch {@link AnimationObserver#animationCompleted}. */
|
||||
protected static class AnimCompletedOp implements ObserverList.ObserverOp
|
||||
{
|
||||
_dispatchOp.init((AnimationEvent)event);
|
||||
observers.apply(_dispatchOp);
|
||||
}
|
||||
|
||||
/** Used by {@link #dispatchEvent}. */
|
||||
protected static class DispatchOp implements ObserverList.ObserverOp
|
||||
{
|
||||
public void init (AnimationEvent event)
|
||||
{
|
||||
_event = event;
|
||||
public AnimCompletedOp (Animation anim, long when) {
|
||||
_anim = anim;
|
||||
_when = when;
|
||||
}
|
||||
|
||||
public boolean apply (Object observer)
|
||||
{
|
||||
((AnimationObserver)observer).handleEvent(_event);
|
||||
public boolean apply (Object observer) {
|
||||
((AnimationObserver)observer).animationCompleted(_anim, _when);
|
||||
return true;
|
||||
}
|
||||
|
||||
protected AnimationEvent _event;
|
||||
};
|
||||
|
||||
protected DispatchOp _dispatchOp = new DispatchOp();
|
||||
protected Animation _anim;
|
||||
protected long _when;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: AnimationObserver.java,v 1.1 2002/01/11 16:17:33 shaper Exp $
|
||||
// $Id: AnimationObserver.java,v 1.2 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
@@ -10,10 +10,7 @@ package com.threerings.media.animation;
|
||||
public interface AnimationObserver
|
||||
{
|
||||
/**
|
||||
* This method is called by the {@link AnimationManager} when
|
||||
* something interesting involving the animation happens.
|
||||
*
|
||||
* @param event the animation event.
|
||||
* Called when the observed animation has completed.
|
||||
*/
|
||||
public void handleEvent (AnimationEvent event);
|
||||
public void animationCompleted (Animation anim, long when);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: AnimationSequencer.java,v 1.12 2002/11/06 07:40:05 shaper Exp $
|
||||
// $Id: AnimationSequencer.java,v 1.13 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
@@ -153,8 +153,7 @@ public abstract class AnimationSequencer extends Animation
|
||||
implements AnimationObserver
|
||||
{
|
||||
public AnimRecord (Animation anim, long delta, AnimRecord trigger,
|
||||
Runnable completionAction)
|
||||
{
|
||||
Runnable completionAction) {
|
||||
_anim = anim;
|
||||
_delta = delta;
|
||||
_trigger = trigger;
|
||||
@@ -218,11 +217,9 @@ public abstract class AnimationSequencer extends Animation
|
||||
tick(when);
|
||||
}
|
||||
|
||||
public void handleEvent (AnimationEvent event)
|
||||
public void animationCompleted (Animation anim, long when)
|
||||
{
|
||||
if (event instanceof AnimationCompletedEvent) {
|
||||
fireCompletion(event.getWhen());
|
||||
}
|
||||
fireCompletion(when);
|
||||
}
|
||||
|
||||
public String toString ()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: AnimationWaiter.java,v 1.2 2002/08/23 23:18:14 shaper Exp $
|
||||
// $Id: AnimationWaiter.java,v 1.3 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
@@ -34,19 +34,16 @@ public abstract class AnimationWaiter
|
||||
}
|
||||
}
|
||||
|
||||
// documentation inherited
|
||||
public void handleEvent (AnimationEvent event)
|
||||
// documentation inherited from interface
|
||||
public void animationCompleted (Animation anim, long when)
|
||||
{
|
||||
if (event instanceof AnimationCompletedEvent) {
|
||||
// note that the animation is finished
|
||||
Animation anim = event.getAnimation();
|
||||
animationDidFinish(anim);
|
||||
_animCount--;
|
||||
// note that the animation is finished
|
||||
animationDidFinish(anim);
|
||||
_animCount--;
|
||||
|
||||
// let derived classes know when all is done
|
||||
if (_animCount == 0) {
|
||||
allAnimationsFinished();
|
||||
}
|
||||
// let derived classes know when all is done
|
||||
if (_animCount == 0) {
|
||||
allAnimationsFinished();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
//
|
||||
// $Id: FrameReachedEvent.java,v 1.2 2002/11/05 20:51:13 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
/**
|
||||
* Indicates that a particular frame was reached in an animation.
|
||||
*/
|
||||
public class FrameReachedEvent extends AnimationEvent
|
||||
{
|
||||
/**
|
||||
* Construct a FrameReachedEvent.
|
||||
*/
|
||||
public FrameReachedEvent (Animation anim, long when,
|
||||
int frameIdx, int frameSeq)
|
||||
{
|
||||
super(anim, when);
|
||||
_frameIdx = frameIdx;
|
||||
_frameSeq = frameSeq;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the index in the multi-frame animation that was reached.
|
||||
*/
|
||||
public int getFrameIndex ()
|
||||
{
|
||||
return _frameIdx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the sequence number of the frame that was reached.
|
||||
* This may be different from the index, a MultiFunction FrameSequencer
|
||||
* can show a particular frame more than once.
|
||||
*/
|
||||
public int getFrameSequence ()
|
||||
{
|
||||
return _frameSeq;
|
||||
}
|
||||
|
||||
/** Frame index and sequence for the event. */
|
||||
protected int _frameIdx, _frameSeq;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// $Id: SequencedAnimationObserver.java,v 1.1 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
/**
|
||||
* Extends the animation observer interface with extra goodies.
|
||||
*/
|
||||
public interface SequencedAnimationObserver extends AnimationObserver
|
||||
{
|
||||
/**
|
||||
* Called when the observed animation -- previously configured with an
|
||||
* {@link AnimationFrameSequencer} -- reached the specified frame.
|
||||
*/
|
||||
public void frameReached (Animation anim, long when,
|
||||
int frameIdx, int frameSeq);
|
||||
}
|
||||
@@ -1,20 +1,18 @@
|
||||
//
|
||||
// $Id: SpriteAnimation.java,v 1.2 2002/11/06 01:40:39 mdb Exp $
|
||||
// $Id: SpriteAnimation.java,v 1.3 2003/04/30 00:45:02 mdb Exp $
|
||||
|
||||
package com.threerings.media.animation;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
|
||||
import com.threerings.media.sprite.PathCompletedEvent;
|
||||
import com.threerings.media.sprite.Sprite;
|
||||
import com.threerings.media.sprite.SpriteEvent;
|
||||
import com.threerings.media.sprite.SpriteManager;
|
||||
import com.threerings.media.sprite.SpriteObserver;
|
||||
import com.threerings.media.sprite.PathObserver;
|
||||
import com.threerings.media.util.Path;
|
||||
|
||||
public class SpriteAnimation extends Animation
|
||||
implements SpriteObserver
|
||||
implements PathObserver
|
||||
{
|
||||
/**
|
||||
* Constructs a sprite animation for the given sprite. The first time
|
||||
@@ -54,13 +52,17 @@ public class SpriteAnimation extends Animation
|
||||
// nothing for now
|
||||
}
|
||||
|
||||
// documentation inherited
|
||||
public void handleEvent (SpriteEvent event)
|
||||
// documentation inherited from interface
|
||||
public void pathCancelled (Sprite sprite, Path path)
|
||||
{
|
||||
if (event instanceof PathCompletedEvent) {
|
||||
_finished = true;
|
||||
}
|
||||
}
|
||||
_finished = true;
|
||||
}
|
||||
|
||||
// documentation inherited from interface
|
||||
public void pathCompleted (Sprite sprite, Path path, long when)
|
||||
{
|
||||
_finished = true;
|
||||
}
|
||||
|
||||
// documentation inherited
|
||||
protected void didFinish ()
|
||||
|
||||
Reference in New Issue
Block a user