.m:
-(void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{
if(CGRectIntersectsRect(ball.bounds , fang.bounds))
{
UIImage *image = [UIImage imageNamed:@"guy.png"];
UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
[self.view addSubView:imageview];
[imageview release];
}
NSLog(@"x : %g", acceleration.x);
NSLog(@"y : %g", acceleration.y);
NSLog(@"z : %g", acceleration.z);
delta.y = acceleration.y * 60;
delta.x = acceleration.x * 60;
ball.center = CGPointMake(ball.center.x + delta.x, ball.center.y + delta.y);
// Right
if(ball.center.x < 0) {
ball.center = CGPointMake(320, ball.center.y);
}
// Left
if(ball.center.x > 320) {
ball.center = CGPointMake(0, ball.center.y);
}
// Top
if(ball.center.y < 0) {
ball.center = CGPointMake(ball.center.x, 460);
}
// Bottom
if(ball.center.y > 460) {
ball.center = CGPointMake(ball.center.x, 0);
}
}
·H:
UIImageView *ball;
IBOutlet UIImageView *fang;
我的麻烦: 当我打开应用程序时,图像@“guy.png”显示自己没有任何触及牙齿的东西。我需要帮助。还是//“”**我的加速计是如此不稳定,几乎不能使用这个.m代码:
if(CGRectIntersectsRect(ball.bounds , fang.bounds))
{
UIImage *image = [UIImage imageNamed:@"endScreenImage.png"];
UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
[self.view addSubView:imageview];
[imageview release];
}
请帮助
答案 0 :(得分:3)
一些问题:
CGRectIntersectsRect()
正在返回YES
,因为您正在比较对象的边界,而不是帧。对象的边界是描述对象如何看待自己的尺寸的矩形。它的起源通常为(0,0),大小是视图的大小。由于两个视图都有一个从(0,0)开始的边界,因此边界矩形做相交。
您真正想要的是视图的框架。视图的框架表示该视图中占据的空间,与其超视图相关。那就是:
if (CGRectIntersectsRect(ball.frame, fang.frame)) { // etc. }
框架代表视图的位置。边界表示视图本身内容的位置。当您比较两个视图的位置时,您几乎总是想要使用框架。
按照目前的说法,每次有交叉点时,您的代码都会添加一个新的子视图,但永远不会删除旧的子视图。由于加速计可以每秒多次触发,因此可能会导致很多视图被添加到视图层次结构中。这可能会对性能产生重大影响,也可能是您看到这种糟糕表现的原因。我建议改为创建一个UIImageView
作为实例变量,然后使用hidden
属性来控制它是否可见。
因此,我建议您按如下方式修改代码:
if (CGRectIntersectsRect(ball.frame, fang.frame)) {
guyView.hidden = NO;
}
else {
guyView.hidden = YES;
}