我在附加代码时遇到两个问题。
首先,如果我将形状的动画持续时间设置为1秒,以便形状始终移动,则touchesBegan不会触发。当我查看C4View.m
时,似乎UIViewAnimationOptionAllowUserInteraction
未设置。有没有办法让我可以访问UIView
来设置此选项?如果没有重写C4View
,似乎很难。
其次,每次撞击形状时我都希望它缩小一点。我遇到的问题是,在我第一次停止移动后击中它。经过一些挖掘后,似乎C4Shape
在用新框架重建后失去了它的形状。以下是控制台信息:
[C4Log] <C4Shape: 0x7b63820; baseClass = UIControl;
frame = (263 691; 200 200);
animations = { position=<CABasicAnimation: 0x1082c490>;
animateFillColor=<CABasicAnimation: 0x8a62c00>;
animateLineDashPhase=<CABasicAnimation: 0x8a64920>;
animateStrokeColor=<CABasicAnimation: 0x8a64ef0>;
animateStrokeEnd=<CABasicAnimation: 0x8a65190>;
animateStrokeStart=<CABasicAnimation: 0x8a65430>; };
layer = <C4ShapeLayer: 0x7b63d00>>
之后:
[C4Log] <C4Shape: 0x1082d3a0; baseClass = UIControl;
frame = (204 17; 180 180);
layer = <C4ShapeLayer: 0x1082d4e0>>
首先将形状设置为nil,或者在重新定义后重新设置动画似乎不能解决问题。
CODE
//
// C4WorkSpace.m
// touchgame
//
// Created by Adam Tindale on 2013-09-28.
//
#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 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 = [C4Shape ellipse:r];
}
@end
答案 0 :(得分:2)
C4Control / C4View / C4Window
都有一个动画选项,允许用户在动画期间进行交互。它是C4AnimationOptions
中可以找到C4Defines.h
结构的一部分。
确保在开始制作动画之前调用此方法。
shape.animationOptions = ALLOWSINTERACTION;
而且,就像其他选项一样,它可以进行位掩码:
shape.animationOptions = EASEOUT | AUTOREVERSE | ALLOWSINTERACTION;
(你不必再修改C4View了!)
要更改形状的大小,您需要在形状上调用方法,如下所示:
[shape ellipse:r];
以下......
shape = [C4Shape ellipse:r];
...由于三个原因不起作用:
C4Shape
,您实际上是在创建一个新对象,而不会影响已存在的对象shape = [...];
,您将指针从原始形状更改为刚刚创建的新形状以下代码是我上面所修改的版本:
#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