Spawn UIImageView使它不与现有的UIImageViews相交

时间:2014-04-14 14:53:43

标签: ios objective-c uiimageview intersection

基本上,我有一个应用程序,用户闪避炸弹并收集硬币。当用户收集硬币时,产生另一枚硬币。我希望每枚硬币都不会在炸弹上产生。 (顺便说一句,这些都是uiimageviews)。在下面的代码中,我有一个名为bombArray的炸弹阵列和名为&#34的UIImageview;一个"是硬币UIImageView。我知道下面的代码不起作用,但我可以使用哪些其他方法?谢谢,这是代码:

    UIImageView *one = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"goldCoin.png"]];
    CGRect rectOne = CGRectMake(arc4random() % (900), arc4random() % (700), 40, 40);
    [one setFrame:rectOne];
    [self.view addSubview:one];
    for (UIImageView* two in bombArray)
    {
        while (CGRectIntersectsRect(two.frame, one.frame))

            {
                one.center=CGPointMake(arc4random() % (900), arc4random() % (700));

            }

    }

*注意:我完全理解为什么上面的代码不起作用,但我无法找到解决问题的另一种方法。

1 个答案:

答案 0 :(得分:0)

首先要做出这样的事情,我会使用新的SpriteKit开箱即用physics(从而实现碰撞检测)。

但是如果你想用标准UIView来做这件事你可以做的就是绝对确保图像不会在它们之间发生碰撞就是将容器分成网格,然后循环遍历每个单元格你的网格和"翻转硬​​币"随机地将硬币放入该单元格中。然后,如果你想填充更多空间而不是划分矩形单元格,你可以划分六边形单元格,这样你就可以覆盖更多的空间。

所以一个快速且绝对不太多的版本可能是这样的:

int x = 0;
int y = 0;
int side = 40;
int it = 0;
do {
    do {
        CGRect imageFrame = CGRectMake(x, y, side, side);
        UIImageView* imageView = [[UIImageView alloc] initWithFrame:imageFrame];
        imageView.layer.borderColor = [UIColor blackColor].CGColor;
        imageView.layer.borderWidth = 1.0;
        imageView.layer.cornerRadius = side / 2;
        imageView.layer.masksToBounds = YES;
        [self.containerView addSubview:imageView];
        BOOL flip = arc4random() & 0x1;
        if (flip) {
            [imageView setImage:[UIImage imageNamed:@"coin_image"]];
        }
    } while ((x+=side) < (self.containerView.frame.size.width - side / 2));
    it++;
    if (it % 2 != 0) {
        x = side / 2;
    } else {
        x = 0;
    }
} while ((y+=(side * 0.85)) < (self.containerView.frame.size.height - side) );

请注意,这不是有效的,它是在主线程中执行的,并没有考虑可能的(实际上可能的)内存限制。