碰撞检测不适用于UIImageView的所有方面

时间:2014-10-27 18:05:24

标签: ios objective-c uiimageview

此代码用于测试我的碰撞,但它仅适用于每个UIImageView的两侧。为什么它不适用于三方?它永远不会在UIImageView的顶部和底部或左右工作。它只能在顶部和左侧或顶部和右侧或底部和右侧或底部和左侧工作。这是为什么?我如何让它至少在三个方面起作用?

int moveX;

int moveY;

viewController.h{

IBOutlet UIImageView *circle;

NSTimer *time;

IBOutlet UIImageView *platform;

}

-(IBAction)StartGame:(id)sender;
-(void)moveCircle;

-(void)bounce;

@end

viewcontroller.m

-(IBAction)StartGame:(id)sender{
    start.hidden=YES;

    time=[NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(moveCircle) userInfo:nil repeats:YES];

    circleX=arc4random()%11;
    circleX=circleX-5;         

    circleY=arc4random()%11;
    circleY=circleY-5;

    circleX=arc4random()%11;
    circleX=circleX+5;

    circleY=arc4random()%11;;
    circleY=circleY+5;

    if (circleX==0) {
        circleX=1;
    }
    if (circleY==0) {
        circleY=1;
    }

-(void)moveCircle{

    circle.center=CGPointMake(circle.center.x -circleX, circle.center.y -circleY);


    if (circle.center.x <30) {   
        circleX=0-circleX;
    }
    if (circle.center.x >320) {
        circleX=0-circleX;
    }
    if (circle.center.y <28 ) {
        circleY=0-circleY;
    }
    if (circle.center.y >568) {
        circleY=0-circleY;
    }

 [self bounce];  


}

 -(void)bounce{

        if (CGRectIntersectsRect(circle.frame, platform.frame)) {

            circleY=arc4random()%5;  
            circleY=0+circleY;      

            circleX=arc4random()%5;
            circleX=0+circleX;   

            circleY=arc4random()%5;
            circleY=0-circleY;        

            circleX=arc4random()%5;
            circleX=0-circleX;
}

}

1 个答案:

答案 0 :(得分:0)

我在你的问题中看不出任何意义,但让我们看看你的代码:

假设你从StartGame开始,希望只发生一次:

  • 你创建了一个计时器(当游戏结束时,这应该是无效的,但不管现在如何)
  • 您将circleXcircleY设置为-5到5之间的某个随机位置
  • 您将circleXcircleY设置为5到15之间的某个随机位置(再次?!)
  • 检查circleXcircleY是否为0并将其设置为1(由于之前的陈述,这种情况极不可能发生)

然后移动圈子:

  • 您将circleXcircleY值添加到圆心,然后我假设这两个值实际上是速度。 (到目前为止一直很好)
  • 您检查圆圈位置是否超出边界并取消适当的速度。 (这个硬编码的值有点奇怪,但现在我觉得还可以)
  • 您致电bounce

反弹方法:

  • 检查circleplatform帧是否相交。 (哦,我猜)
  • 您将随机速度设置为circleX,将circleY设置为0到4
  • 您将随机速度设置为circleXcircleY从0到-4(再次?!)

所以我可以从这段代码中假设你在视图控制器上有2个视图,其中一个是名为platform的静态障碍,另一个是移动circle。根据{{​​1}}方法中的一些随机值并正确地从硬编码边界反弹,圆圈本身将向某个方向移动。如果StarGamecircle相交,则圆圈会将速度更改为X和Y中从-4到0的某些随机负值。

那么究竟是什么问题呢? platform的反弹将使platform移动到屏幕的左上角,无论circlecircle点击platform。也许您需要在if方法中使用bounce个语句来为新速度找到正确的值,具体取决于platform来自哪一侧。