首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >碰撞检测

碰撞检测
EN

Stack Overflow用户
提问于 2011-06-30 13:04:11
回答 3查看 462关注 0票数 2

我正在尝试创建一个碰撞检测方法,以检查我的两个对象(两个椭圆形状的uiimages)是否相互碰撞。如果他们这样做了,它应该将BOOL值设置为是,否则它应该设置为否。

到目前为止,它只是检查Ruby1是否高于Ruby2的if语句。它不关心ruby1是否低于ruby2,甚至不关心它的左边或右边。它只会一直到那个IF语句。反之亦然。

代码语言:javascript
复制
-(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不在它前面。反之亦然。

代码语言:javascript
复制
-(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;
    }


}

碰撞检测方法是从触摸移动方法调用的。

代码语言:javascript
复制
 - (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]];
         }
 }

我做错了什么?

**********UPDATE__*******************************

代码语言:javascript
复制
-(void)CollisionDetect{

//不能碰撞,因为Ruby1离Ruby2太远

if( rubin1.framework.源.x+ rubin1.bounds.size.width

代码语言:javascript
复制
CollisionRubies = NO;
NSLog(@"Collision left");

}

//不能碰撞,因为Ruby1离Ruby2太远了

否则,如果(rubin1.framework.源.x>rubin2.framework.源.x+ rubin2.bounds.size.width){

代码语言:javascript
复制
CollisionRubies = NO;
NSLog(@"Collision right");

}

//不能碰撞,因为Ruby1比Ruby2低得多

否则,如果(rubin1.framework.源.y+ rubin1.bounds.size.width

//不能碰撞,因为Ruby1比Ruby2高得多

否则,如果(rubin1.framework.源.y

代码语言:javascript
复制
if( rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){

CollisionRubies = NO;
NSLog(@"Collision left");

}

//不能碰撞,因为Ruby2离Ruby1太远了

否则,如果(rubin2.framework.源.x>rubin1.framework.源.x+ rubin1.bounds.size.width){

代码语言:javascript
复制
CollisionRubies = NO;
NSLog(@"Collision right");

}

//不能碰撞,因为Ruby2比Ruby1低得多

否则,如果(rubin2.framework.源.y+ rubin2.bounds.size.width

//不能碰撞,因为Ruby2比Ruby1高得多

否则,如果(rubin2.framework.源.y

否则{/如果我们到达这里,两个rects必须是碰撞CollisionRubies = YES;NSLog(@“检测到碰撞”);}

EN

回答 3

Stack Overflow用户

发布于 2011-06-30 14:09:42

顺便提一句,如果您使用的是其他代码,那么您的代码可能会更高效一些,特别是如果您经常调用CollisionDetect,我认为您是这样的。这样,如果前面的if语句之一为true,则可以忽略其余语句。

票数 1
EN

Stack Overflow用户

发布于 2011-06-30 13:44:11

在您的CollisionDetect方法中,您在不同的点上设置CollisionRubies = NO,但是不管刚刚发生的任何测试,您都是在最后设置CollisionRubies = YES。如果方法是一行的话,那就好了。

代码语言:javascript
复制
-(void)CollisionDetect{
  CollisionRubies = YES;
}

此外,在计算碰撞时似乎也有问题(在上面或下面计算时,宽度与y是混合的)。

我也建议你阅读目标-C编码风格指南。例如,对变量和方法名称使用小写首字母。例如,如果以标准方式编写代码,collisionRubies-(void)collisionDetect可以帮助其他人更快地阅读代码。

票数 0
EN

Stack Overflow用户

发布于 2011-06-30 13:47:54

而不是从四个方向检查碰撞的四个函数,为什么不使用

代码语言:javascript
复制
if(CGRectIntersectsRect(ruby1.frame,ruby2.frame)
{
//your code
}

当然,这只是当你不需要知道一个物体接近另一个物体的方向的时候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6535173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档