在移动视图中使用多个子视图进行碰撞检测

时间:2010-07-17 21:23:45

标签: objective-c syntax uiimageview collision-detection

我正在开发一款OBJ C游戏,它有一个球视图和一个舞台视图。舞台视图有4个子视图。所有视图都是UIImageViews。我有一种工作的碰撞检测方法。我想将它扩展到4个以上的子视图,而不是简单地创建更多的代码行。看看下面的代码,有没有办法将其简化为循环。谢谢!

// convert each square to be relevant to ball's superview in order to collision detect
CGRect square_01Frame = [ball.superview convertRect:square_01.frame fromView:square_01.superview];
CGRect square_02Frame = [ball.superview convertRect:square_02.frame fromView:square_02.superview];
CGRect square_03Frame = [ball.superview convertRect:square_03.frame fromView:square_03.superview];
CGRect square_04Frame = [ball.superview convertRect:square_04.frame fromView:square_04.superview];

// convert CGRects to NSStrings for storage in square_frames array
NSString *square_01FrameString = NSStringFromCGRect(square_01Frame);
NSString *square_02FrameString = NSStringFromCGRect(square_02Frame);
NSString *square_03FrameString = NSStringFromCGRect(square_03Frame);
NSString *square_04FrameString = NSStringFromCGRect(square_04Frame);    

// load array of NSStrings
[square_frames replaceObjectAtIndex:0 withObject:square_01FrameString];
[square_frames replaceObjectAtIndex:1 withObject:square_02FrameString];
[square_frames replaceObjectAtIndex:2 withObject:square_03FrameString];
[square_frames replaceObjectAtIndex:3 withObject:square_04FrameString];

// create a for loop
for (int i=0; i<4; i++) { // 4 squares
    // create test frame
    CGRect test_frame = CGRectFromString([square_frames objectAtIndex:i]);
    if (CGRectIntersectsRect(test_frame,ball.frame)) { // collision detection
        // do something
    }
}

1 个答案:

答案 0 :(得分:1)

好吧,我会做很多事情。

首先,我会创建一个球“模型”,只是一个NSObject子类来表示Ball。可能会有一个属性“位置”或其他东西,这是CGRect。

然后,您当前的视图可能在屏幕上有一个球对象数组,只是循环遍历它们。

总的来说,我不认为使用UIView的rects是管理碰撞检测的最佳方法。我认为你最好以其他方式定义它,然后简单地相应地更新UI。

通常,依靠您的UI实现进行游戏设计并不是一个好主意。这使得很难改变(正如你在问题中所说的那样)。