【问题标题】:Detect collision between multiple UIImageViews that are animated with the same name检测具有相同名称动画的多个 UIImageView 之间的冲突
【发布时间】:2011-07-11 17:53:36
【问题描述】:

我正在尝试检测每秒使用 NSTimer 创建的下降/动画 UIImageView 之间的碰撞。代码如下:

-(void)newobject{

    int randomx = 76+ arc4random() %(290);
    int randomDuration = 2+ arc4random() %(6);
    int randomImage = 1+ arc4random() %(3) ;

    NewObject = [[UIImageView alloc] initWithFrame:CGRectMake(randomx,0,36 ,36)];        
    UIImage *imag = [UIImage imageNamed:@"ball.png"];
    [NewObject setImage:imag];
    [self.view addSubview:NewObject];

    numberofObjects += 1;
    NewObject.tag = numberofObjects;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:randomDuration];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDone:finished:context:)];
    NewObject.frame = CGRectMake(randomx, 300,NewObject.frame.size.width,NewObject.frame.size.height);

    [UIView commitAnimations];
}

该代码创建了一个名为 NewObject 的新 UIImageView 并在屏幕上对其进行动画处理。为了检测碰撞,我有另一个每隔 1.0/60 调用一次的 NSTimer。代码如下:

-(void)Collison{

    for (int i = 1; i < numberofObjects; i++) {
        UIImageView *image = NewObject;

        [image viewWithTag:i];
        CALayer *layer = image.layer.presentationLayer;
        CGRect NewObjectFrame =  layer.frame;
        CALayer *layer2 = Sprint.layer.presentationLayer;
        CGRect SprintFrame = layer2.frame;

        if (CGRectIntersectsRect(NewObjectFrame, SprintFrame)) {
            [self StopTimers];

            NSLog(@"hello");
        }
    }
}

问题是控制台说“它可以工作”但 UIImage 没有碰撞,我可以将角色与图像碰撞但控制台什么也没说,同时如果我尝试将角色与 UIImageView 碰撞有用。我想说的是它不可靠。有人可以帮忙吗?

更新:我编辑了代码,但现在它检测到添加的最后一个 uiimageview。

【问题讨论】:

  • NewObject 是实例变量吗?您不应该跟踪您创建的每个 NewObject,例如通过将它们存储在 NSMutableArray 中并遍历整个数组以查找冲突?
  • 是的,我正在考虑这一点,但问题是如何将 NewObject 添加到具有不同名称的 NSMutableArray 中,例如 newObject1、NewObject2 ..... 以识别碰撞的对象。回答你的第一个问题是的,它是一个实例变量。
  • 如何创建一个包含 UIImageView 和 NSString 的新类?然后,您将使用 NSString 为每个对象分配一个唯一标识符。
  • 你能给我一个例子吗?
  • 在将实例添加到NSMutableArray 时,您不必担心它们的名称,只要对象在新的内存空间中,那么数组中的指针就会指向适当的对象,它不关心你给它的名字。至于确定您正在处理的视图,这正是 UIView 上的 tag 属性的用途。我看到你在某种程度上使用它,但我没有完全遵循你的代码。

标签: iphone cocoa-touch uiimageview collision-detection


【解决方案1】:

好吧,我明白了。这很简单,所以您需要做的就是创建一个 NSMutableArray 并检查数组是否与 for 循环发生冲突。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2014-07-03
    • 1970-01-01
    • 2019-05-19
    • 2020-02-04
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多