【发布时间】: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