iphone - 碰撞检测

标签 iphone xcode cocoa-touch

我正在尝试创建一种碰撞检测方法,用于检查我的两个对象(2 个椭圆形 uiimage)是否相互碰撞。如果他们这样做,则应将 BOOL 值设置为 YES,否则应将其设置为 NO。

到目前为止,它只是检查 Ruby1 是否高于 Ruby2 的 IF 语句。它不关心 ruby​​1 是否在 ruby​​2 下面,甚至在它的左边还是右边。它只是继续执行 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,那么 ruby​​1 将移动到该位置,如下面的代码所示,否则它将停止移动,直到检测到 ruby​​2 不在它前面。反之亦然。

-(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/

相关文章:

ios - 在 iphone 6 上具有 600x600 pt 框架的 UIViews 加上尺寸等级

iphone - 自定义 map 的布局

ios - Storyboard中的横向和纵向方向

ios - 将音频和视频流式传输到 IOS 应用程序

iphone - 有没有办法在 iOS 上运行脚本?

iphone - UIViewController没有收到touchesBegan消息

iphone - 在 iOS 中取消存档 NSAttributedString

swift - 在 CALayer 上使用自定义 CIFilter 显示 CALayer 没有变化

iphone - dataDetectorTypes 电话链接问题

ios - searchBarTextDidBeginEditing 委托(delegate)方法调用了两次