我正在尝试创建一种碰撞检测方法,用于检查我的两个对象(2 个椭圆形 uiimage)是否相互碰撞。如果他们这样做,则应将 BOOL 值设置为 YES,否则应将其设置为 NO。
到目前为止,它只是检查 Ruby1 是否高于 Ruby2 的 IF 语句。它不关心 ruby1 是否在 ruby2 下面,甚至在它的左边还是右边。它只是继续执行 IF 语句。反之亦然。
-(void)CollisionDetect{
//can't be colliding because Ruby1 is too far left of Ruby2
if( rubin1.frame.origin.x + rubin1.bounds.size.width < rubin2.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//can't be colliding because Ruby1 is too far right of Ruby2
if( rubin1.frame.origin.x > rubin2.frame.origin.x + rubin2.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//can't be colliding because Ruby1 is too far below Ruby2
if( rubin1.frame.origin.y + rubin1.bounds.size.width < rubin2.frame.origin.y){
CollisionRubies = NO;
NSLog(@"Collision below");
}
//can't be colliding because Ruby1 is too far above Ruby2
if( rubin1.frame.origin.y < rubin2.frame.origin.y + rubin2.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision above");
}
if( rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//can't be colliding because Ruby2 is too far right of Ruby1
if( rubin2.frame.origin.x > rubin1.frame.origin.x + rubin1.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//can't be colliding because Ruby2 is too far below Ruby1
if( rubin2.frame.origin.y + rubin2.bounds.size.width < rubin1.frame.origin.y){
CollisionRubies = NO;
NSLog(@"Collision below");
}
//can't be colliding because Ruby2 is too far above Ruby1
if( rubin2.frame.origin.y < rubin1.frame.origin.y + rubin1.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision above");
}
//if we get here, the two rects MUST be colliding
CollisionRubies = YES;
NSLog(@"Collision detected");
}
如果 BOOL 值为 NO,那么 ruby1 将移动到该位置,如下面的代码所示,否则它将停止移动,直到检测到 ruby2 不在它前面。反之亦然。
-(void)dispatchTouchEvent:(UIView *)theView toPosition:(CGPoint)position{
// Check to see which view, or views, the point is in and then move to that position.
if (CGRectContainsPoint([rubin1 frame], position)) {
if(!CollisionRubies){
rubin1.center = position;
}
if (CGRectContainsPoint([rubin2 frame], position)) {
if(!CollisionRubies){
rubin2.center = position;
}
}
从touchesmoved方法调用碰撞检测方法
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self CollisionDetect];
NSLog(@"touchesMoved");
if(!GamePaused){
// Enumerates through all touch objects
for (UITouch *touch in touches) {
// Send to the dispatch method, which will make sure the appropriate subview is acted upon
[self dispatchTouchEvent:[touch view] toPosition:[touch locationInView:self.view]];
}
}
我做错了什么?
********* *更新********** *************** ******
-(void)CollisionDetect{
//不能发生碰撞,因为 Ruby1 离 Ruby2 太左边了
if(rubin1.frame.origin.x + rubin1.bounds.size.width < rubin2.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//不能发生碰撞,因为 Ruby1 离 Ruby2 太靠右了
else if( rubin1.frame.origin.x > rubin2.frame.origin.x + rubin2.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//不能发生碰撞,因为 Ruby1 远远低于 Ruby2
else if( rubin1.frame.origin.y + rubin1.bounds.size.width < rubin2.frame.origin.y){ 碰撞 ruby = NO; NSLog(@"下方碰撞"); }
//不能发生碰撞,因为 Ruby1 距离 Ruby2 太远了
else if( rubin1.frame.origin.y < rubin2.frame.origin.y + rubin2.bounds.size.width){ 碰撞 ruby = NO; NSLog(@"上方碰撞"); }
if( rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//不能发生碰撞,因为 Ruby2 离 Ruby1 太靠右了
else if( rubin2.frame.origin.x > rubin1.frame.origin.x + rubin1.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//不能发生碰撞,因为 Ruby2 远远低于 Ruby1
else if( rubin2.frame.origin.y + rubin2.bounds.size.width < rubin1.frame.origin.y){ 碰撞 ruby = NO; NSLog(@"下方碰撞"); }
//不能发生碰撞,因为 Ruby2 远远高于 Ruby1
else if( rubin2.frame.origin.y < rubin1.frame.origin.y + rubin1.bounds.size.width){ 碰撞 ruby = NO; NSLog(@"上方碰撞"); }
其他{ //如果我们到达这里,两个矩形必须发生碰撞 碰撞 ruby =是; NSLog(@"检测到碰撞"); }
最佳答案
顺便说一句,如果您使用 else if 您的代码可能会更高效,特别是如果您经常调用 CollisionDetect,我认为您是这样。这样,如果前面的 if 语句之一成立,您就可以忽略其余的语句。
关于iphone - 碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535173/