为对象创建边界

时间:2014-06-22 09:31:28

标签: ios objective-c

我对Xcode中的objective-c和iOS编程相当新,在制作我的第一个应用程序时遇到了在屏幕边缘创建障碍的问题,对象无法通过该障碍。我尝试在边界处放置对象并使用CGRectIntersectsRect,但边界和主对象之间的碰撞未注册。有谁知道我会怎么做呢?

这是我用于对象移动的代码:

const float rate= 0.025;
NSTimer *goLeft;
NSTimer *goRight;

- (IBAction)right {

    goRight=[NSTimer scheduledTimerWithTimeInterval:rate
                                            target:self
                                          selector:@selector(goRight)
                                          userInfo:nil
                                           repeats:YES];
    if (goRight == nil){
        goRight=[NSTimer scheduledTimerWithTimeInterval:rate target:self selector:@selector(goRight) userInfo:nil repeats:YES];
    }




}



- (IBAction)left{


    goLeft=[NSTimer scheduledTimerWithTimeInterval:rate
                                           target:self
                                         selector:@selector(goLeft)
                                         userInfo:nil
                                          repeats:YES];
    if (goLeft == nil){
        goLeft=[NSTimer scheduledTimerWithTimeInterval:rate target:self selector:@selector(goLeft) userInfo:nil repeats:YES];
    }


}

-(IBAction)stopLeft{
    [goLeft invalidate];
    goLeft=nil;
}


-(IBAction)stopRight{
    [goRight invalidate];
    goRight=nil;
}

-(void)goLeft{
    _userToken.center =CGPointMake(_userToken.center.x -20, _userToken.center.y);
}

-(void)goRight{
    _userToken.center =CGPointMake(_userToken.center.x +20, _userToken.center.y);

}

与左边框对象的碰撞(userToken和friendly都是UIImageView)。但是当它们发生碰撞时,NSLog不会被执行。

 -(void)checkForCollision{
        if (CGRectIntersectsRect(_userToken.frame, _friendly.frame)){
            NSLog(@"Left Intersect");

        }
    }

1 个答案:

答案 0 :(得分:0)

您没有说出测试时设置的_userToken.frame_friendly.frame - 在测试时记录它们是个好主意,这样您就可以手动验证。

另一种方法,如果有效屏幕区域是矩形,则检查令牌和有效区域的交集并验证它是否等于令牌帧:

if (CGRectEqualToRect(CGRectIntersection(_userToken.frame, validFrame), _userToken.frame)) { ...

通过任何方法检查帧是否在相同的坐标空间(视图具有相同的超视图,或者将它们转换为相同的公共超视图)时,这一点很重要 - 再次,日志记录将帮助您验证这一点。

除了:

如果计时器失败,尝试重新创建计时器不太可能有所帮助。你应该在创建一个新计时器之前检查一个现有的计时器并使其无效(否则你最终可能会运行多个计时器而无法阻止它们。)