【问题标题】:cocos2d pixel collision detectioncocos2d 像素碰撞检测
【发布时间】:2012-03-25 01:52:34
【问题描述】:

我目前正在编写一个包含多个矩形(比如 30 个)的游戏,如果用户单击四个边之一,则需要执行特定操作。麻烦的是每张卡片都有相同的一面来执行这个动作。例如,对于矩形 1,执行此操作的一侧将是左侧,但矩形 3 的一侧将是顶侧。我的猜测是这里需要像素碰撞检测。你们有什么感想?还有使用 cocos2s 进行像素碰撞的好例子吗?

【问题讨论】:

    标签: iphone objective-c cocos2d-iphone collision-detection sprite


    【解决方案1】:

    您可以简单地使用以下代码

    if (CGRectIntersectsRect(Rect1, Rect2)) 
    {
         //Your code ...                
    }   
    

    使用上面的CGRectIntersectsRect可以检测矩形区域内的碰撞像素。

    【讨论】:

    • 我有那个,那部分工作正常,但是现在我需要确定矩形的哪一侧相交,即左、右下等,实现这一目标的最佳方法是什么?
    • 取两个矩形的中心点,看看它们的相对位置(即x1大于x2?如果是,那么rect1在rect2的右边)。
    【解决方案2】:

    是的,好点,解决方案有点混乱,但它有效,这就是我所做的:我将 CCSprite 子类化并创建了一个名为 state 的新属性,如果相对于该旋转进行旋转,则保存当前位置。根据触摸的哪一侧,我将使用该信息来确定矩形的哪一侧被触摸。 ——

    if((spriteCentre1.x < spriteCentre2.x) && (xAxisDiff < yAxisDiff))  
        {
        [HelloWorldLayer whichSideTouched:sprite1 sideTouched:kStateRightPlus touchingSprite:sprite2];
    }
    

    +(int)whichSideTouched:(SpriteCard *)sprite sideTouched:(int)touchedtouchedSprite:(SpriteCard *)sprite2 {

    开关 (sprite.state) { 案例 kStateUpPlus: 案例 kStateUpMinus: 如果(触摸 == kStateDownPlus) { NSLog(@"修饰"); [精灵 setTop:sprite2]; retValue = kStateUpPlus; } 否则如果(触摸 == kStateRightPlus) { NSLog(@"触摸左"); [精灵 setRight:sprite2]; retValue = kStateLeftPlus;
    } }

    【讨论】:

      【解决方案3】:

      感谢 Dhaval,这是我为希望做类似事情的任何人编写的未来参考代码,它可以进一步微调,如果我找到更准确的方法,我将相应地更新此线程

      -(void)touchWhichSide:(CCSprite *)sprite1 collidingSprite:(CCSprite *)sprite2
      {
          BOOL retValue = NO;
      
          CGPoint spriteCentre1 = sprite1.position;
          CGPoint spriteCentre2 = sprite2.position;
      
          NSLog(@"X %f",spriteCentre2.x - spriteCentre1.x);
          NSLog(@"Y %f",spriteCentre1.y - spriteCentre2.y);
          float xAxisDiff = spriteCentre1.x - spriteCentre2.x;
          float yAxisDiff = spriteCentre1.y - spriteCentre2.y;
      
          NSLog(@"x axis %f",xAxisDiff);
          NSLog(@"y axis %f",yAxisDiff);
      
          if((spriteCentre1.x < spriteCentre2.x) && (xAxisDiff < yAxisDiff))  
          {
              NSLog(@"right touch");
          }
          else if((spriteCentre2.x < spriteCentre1.x) && (xAxisDiff > yAxisDiff)) 
          {
              NSLog(@"left touch");
          }
          else if((spriteCentre2.y < spriteCentre1.y) && (yAxisDiff > xAxisDiff))
          {
              NSLog(@"Bottom touch");
          }
          else if((spriteCentre1.y < spriteCentre2.y) && (yAxisDiff < xAxisDiff))
          {
              NSLog(@"Top touch");
          }
      
      }
      

      【讨论】:

      • 啊是的...但是如果精灵旋转了呢!
      • 是的,好点,解决方案有点混乱,但它有效,这就是我所做的:我将 CCSprite 子类化并创建了一个名为 state 的新属性,如果相对于该旋转旋转,则保存当前位置。根据触摸的哪一侧,我将使用该信息来确定矩形的哪一侧被触摸。
      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多