我对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");
}
}
答案 0 :(得分:0)
您没有说出测试时设置的_userToken.frame
和_friendly.frame
- 在测试时记录它们是个好主意,这样您就可以手动验证。
另一种方法,如果有效屏幕区域是矩形,则检查令牌和有效区域的交集并验证它是否等于令牌帧:
if (CGRectEqualToRect(CGRectIntersection(_userToken.frame, validFrame), _userToken.frame)) { ...
通过任何方法检查帧是否在相同的坐标空间(视图具有相同的超视图,或者将它们转换为相同的公共超视图)时,这一点很重要 - 再次,日志记录将帮助您验证这一点。
除了:
如果计时器失败,尝试重新创建计时器不太可能有所帮助。你应该在创建一个新计时器之前检查一个现有的计时器并使其无效(否则你最终可能会运行多个计时器而无法阻止它们。)