Interactive Animations
C4Control / C4View / C4Window
all have an animation option that allows for user interaction during animations. It's part of the C4AnimationOptions
struct that can be found in C4Defines.h
.
Make sure to call this before you start your animations.
shape.animationOptions = ALLOWSINTERACTION;
And, just like other options it can be bitmasked:
shape.animationOptions = EASEOUT | AUTOREVERSE | ALLOWSINTERACTION;
(You don't have to rework C4View, yet!)
Changing Shape Size
To change a shape's size, you want to call methods on the shape itself like so:
[shape ellipse:r];
The following...
shape = [C4Shape ellipse:r];
... won't work for 3 reasons:
- By calling
C4Shape
you're actually creating a new object, not affecting the one that already exists - By setting
shape = [...];
you're changing the pointer from the original shape to the new one that you just created - The new shape doesn't exist on screen, the shape that stops is the original one that you added as a subview. This is why your original shape stops moving, because you're now referencing a new object.
The following code is my modified version of what you have above:
#import "C4WorkSpace.h"
@implementation C4WorkSpace
{
C4Shape * shape;
C4Timer * timer;
C4Label * text;
C4Font * font;
int score;
}
-(void)setup
{
score = 0;
shape = [C4Shape ellipse:CGRectMake(self.canvas.center.x, self.canvas.center.y, 200, 200)];
font = [C4Font fontWithName:@"Chalkduster" size:40];
text = [C4Label labelWithText:@"Score : 0" font:font];
[shape setAnimationDuration:0.05];
timer = [C4Timer automaticTimerWithInterval:1.0 target:self method:@"runaway" repeats:YES];
[self listenFor:@"touchesBegan" fromObject:shape andRunMethod:@"imhit"];
[self.canvas addSubview:text];
[self.canvas addSubview:shape];
}
-(void) runaway {
shape.animationOptions = ALLOWSINTERACTION;
[shape setCenter:CGPointMake([C4Math randomIntBetweenA:0 andB:self.canvas.width], [C4Math randomIntBetweenA:0 andB:self.canvas.height])];
C4Log(@"%@",shape);
}
-(void) imhit
{
[text setText:[NSString stringWithFormat:@"Score: %d",++score]];
[text sizeToFit];
CGRect r = shape.frame;
r.size = CGSizeMake(shape.size.width * 0.9, shape.size.height * 0.9);
[shape ellipse:r];
}
@end