我有一个应用程序的布局,需要检测图像何时与另一个图像碰撞。
在这里,用户通过点击他们想要的位置在屏幕上创建多个'球',即名为'imgView'的UIImageView的相同实例:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *myTouch = [[event allTouches] anyObject];
imgView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 40, 40)];
imgView.image = [UIImage imageNamed:@"ball.png"];
[self.view addSubview:imgView];
imgView.center = [myTouch locationInView:self.view];
}
(imgView在标题中声明为UIImageView):
UIImageView *imgView;
现在,我还有一个名为'staff'的图像。这是一个长条,横跨屏幕平移。我希望图像'staff'能够检测到它与变量'imgView'的碰撞,或用户放置在屏幕上的球。 因此,用户可以点击屏幕上的10个不同的位置,“员工”应该能够捕捉到每一个。
我使用由NSTimer激活的CGRectIntersectsRect代码:
-(void)checkCollision {
if( CGRectIntersectsRect(staff.frame,imgView.frame)) {
[self playSound];
}
}
但是,仅使用LAST实例或用户创建的“ball”检测交集。工作人员对那个人作出反应,但对其余部分进行调整。任何帮助修复我的代码以检测所有实例将不胜感激。
答案 0 :(得分:1)
每次创建新球时,都会覆盖imgView
实例变量。因此,您的checkCollision
方法只会看到imgView
的最新值,即最后创建的球。
相反,您可以在NSArray
中跟踪屏幕上的每个球,然后检查该阵列中每个元素的碰撞。为此,请将您的imgView
实例变量替换为:
NSMutableArray *imgViews
然后,在早期的某个时候,请在viewDidLoad
中初始化数组:
imgViews = [[NSMutableArray alloc] init]
在-touchesEnded:withEvent:
中将新的UIImageView
添加到数组中:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *myTouch = [[event allTouches] anyObject];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 40, 40)];
imgView.image = [UIImage imageNamed:@"ball.png"];
[self.view addSubview:imgView];
imgView.center = [myTouch locationInView:self.view];
[imgViews addObject:imgView]
}
最后,在checkCollision
中遍历您的数组并对每个元素执行检查
- (void)checkCollision {
for (UIImageView *imgView in imgViews) {
if( CGRectIntersectsRect(staff.frame,imgView.frame)) {
[self playSound];
}
}