/*
File: MBCAnimation.mm
Contains: General animation infrastructure.
Version: 1.0
Copyright: © 2002 by Apple Computer, Inc., all rights reserved.
File Ownership:
DRI: Matthias Neeracher x43683
Writers:
(MN) Matthias Neeracher
Change History (most recent first):
$Log: MBCAnimation.mm,v $
Revision 1.4 2003/07/14 23:21:03 neerache
Better termination check for animation
Revision 1.3 2003/07/07 08:39:59 neerache
Tweak for slow hardware
Revision 1.2 2003/06/15 19:03:50 neerache
Smoother animations
Revision 1.1 2002/08/22 23:47:06 neeri
Initial Checkin
*/
#import "MBCAnimation.h"
#import "MBCBoardView.h"
#include <algorithm>
using std::min;
@implementation MBCAnimation
static id sCurAnimation = nil;
+ (void) cancelCurrentAnimation
{
if (sCurAnimation) {
[sCurAnimation endState];
sCurAnimation = nil;
}
}
- (void) scheduleNextStep
{
[self performSelector:@selector(doStep:) withObject:nil afterDelay:0.010];
}
- (void) startState
{
sCurAnimation = self;
[fView startAnimation];
}
- (void) step: (float)pctDone {}
- (void) endState
{
[fView animationDone];
sCurAnimation = nil;
}
- (void) doStep:(id)arg
{
struct timeval now;
gettimeofday(&now, NULL);
float elapsedTime =
now.tv_sec - fStart.tv_sec
+ 0.000001f * (now.tv_usec - fStart.tv_usec);
float elapsed = min(elapsedTime/fTime, 1.0f);
//
// Prevent excessive jerks on slow hardware
//
if (elapsed-fLastElapsed > 0.5f)
elapsed = 1.0f;
[self step:elapsed];
fLastElapsed = elapsed;
if (elapsed >= 1.0f) {
[self endState];
[self autorelease];
[fView setNeedsDisplay:YES];
} else {
[self scheduleNextStep];
[fView drawNow];
}
}
- (void) runWithTime:(float)seconds view:(MBCBoardView *)view
{
gettimeofday(&fStart, NULL);
fTime = seconds;
fView = view;
fLastElapsed = 0.0f;
[self startState];
[self doStep:nil];
}
@end
// Local Variables:
// mode:ObjC
// End: