1

我对附加的代码有两个问题。

首先,如果我将形状的动画持续时间设置为 1 秒,以便形状始终移动,则 touchesBegan 不会触发。当我查看时C4View.m,似乎UIViewAnimationOptionAllowUserInteraction没有设置。有没有办法可以访问UIView设置此选项?看来不改写就很难了C4View

http://iphonedevsdk.com/forum/iphone-sdk-development/64569-uiview-animatewithduration-blocks-the-screen-for-touch-input.html

其次,每次击中形状时,我都希望它缩小一点。我遇到的问题是,在我第一次击中它后它停止移动。经过一番挖掘,它似乎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>>

首先将 shape 设置为 nil,或者在重新定义后重做动画似乎不能解决问题。

代码

//
//  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
4

1 回答 1

2

互动动画

C4Control / C4View / C4Window都有一个动画选项,允许在动画期间进行用户交互。它是C4AnimationOptions结构的一部分,可以在C4Defines.h.

确保在开始动画之前调用它。

shape.animationOptions = ALLOWSINTERACTION;

而且,就像其他选项一样,它可以被位掩码:

shape.animationOptions = EASEOUT | AUTOREVERSE | ALLOWSINTERACTION;

(您不必重新设计 C4View!)

改变形状大小

要更改形状的大小,您需要像这样调用形状本身的方法:

[shape ellipse:r];

以下...

shape = [C4Shape ellipse:r];

... 不会工作有 3 个原因:

  1. 通过调用C4Shape,您实际上是在创建一个新对象,而不影响已经存在的对象
  2. 通过设置shape = [...];,您将指针从原始形状更改为刚刚创建的新形状
  3. 屏幕上不存在新形状,停止的形状是您添加为子视图的原始形状。这就是为什么您的原始形状停止移动的原因,因为您现在正在引用一个新对象。

以下代码是我对上述内容的修改版本:

#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
于 2013-09-30T17:39:00.270 回答