This is BBImageAnimator.m in view mode; [Download] [Up]
/* BBImageAnimator.m
*
* This produces some nice Animatoins. Switching the images inside a
* button object.
*
* For interface-info see the header file. The comments in this file mostly
* cover only the real implementation details.
*
* Written by: Thomas Engel
* Created: 28.10.1993 (Copyleft)
* Last modified: 07.05.1994
*/
#import "BBImageAnimator.h"
// Here is a little C-Funktion. We need this one for timed entry handling.
void handler( DPSTimedEntry teNumber, double now, void *userData )
{
id animator = (id)userData;
[animator switchToNextFrame];
}
@implementation BBImageAnimator
- setDelegate:anObject
{
delegate = anObject;
return self;
}
- setTargetButton:aButton
{
targetButton = aButton;
return self;
}
- setBounceSettingField:aTextField;
{
bounceSettingField = aTextField;
bounceAnimation = [bounceSettingField intValue];
return self;
}
- setFrameCountSettingField:aTextField;
{
frameCountSettingField = aTextField;
frameCount = [frameCountSettingField intValue];
return self;
}
- setSpeedSettingField:aTextField;
{
speedSettingField = aTextField;
frameDelay = 1 / [speedSettingField doubleValue];
return self;
}
- startAnimation:sender
{
// First check if the settings are useful. If not do nothing!
// Create a timed entry and set all default values. Even the frame
// numbers are 1....frameCount we set it to 0. This is because the
// switch method does the counting and switching and at the moment
// we are not showing any image...just the basic number 0. OK ?
if( !targetButton ||
!sourceImageMatrix ||
frameCount < 1 ||
frameDelay < 0.0001 ||
frameDelay > 20 ) return self;
currentFrame = 0;
bouncing = NO;
animateTE = DPSAddTimedEntry( frameDelay, (DPSTimedEntryProc)handler,
self, NX_BASETHRESHOLD );
return self;
}
- stopAnimation
{
// We only remove the timed entry. This object will not restore the
// original icon!
if( animateTE )
{
DPSRemoveTimedEntry( animateTE );
animateTE = 0;
if( [delegate respondsTo:@selector(animationDidStop:)] )
[delegate animationDidStop:self];
}
return self;
}
- switchToNextFrame
{
BOOL lastFrame = NO;
id sourceButton;
// Whats the new frame ? Or did we already show the last one ?
// First calculate the next logical image and then check for end of anim.
if( bouncing )
currentFrame--;
else currentFrame++;
if( currentFrame > frameCount )
{
if( bounceAnimation )
{
bouncing = YES;
currentFrame = frameCount-1;
}
else lastFrame = YES;
}
if( currentFrame < 1 ) lastFrame = YES;
// If there is a image to show...lets try it:
if( !lastFrame )
{
sourceButton = [sourceImageMatrix findCellWithTag:currentFrame];
if( sourceButton )
[targetButton setImage:[sourceButton image]];
}
// Seems like we did show the last image during the last timed entry.
// So stop right now. With this delayed stop we ensure that the last image
// of our animation is also displayed for at least frameDelay seconds.
else [self stopAnimation];
return self;
}
@end
/*
* History: 07.05.94 Changed some names .
*
* 19.01.94 Removed the [image display] call because not needed.
*
*
* Bugs: - Not really
*/These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.