瓷砖与Sprite Bounding Box之间的碰撞检测

时间:2012-02-07 22:25:13

标签: cocos2d-iphone

有没有机会获得平铺地图的边框并检查此边界框是否与精灵边界框对撞?

1 个答案:

答案 0 :(得分:3)

要在tilemap的给定位置获取tile的边界框:

- (void) setupTilemap
{
    NSString * aFilename = @"tilemap.tmx";
    theTilemap = [CCTMXTiledMap tiledMapWithTMXFile:aFilename];
    [self addChild:theTilemap];   
}

- (CGRect) tileBoundingBoxAt:(CGPoint)mapCoordinate
{
    CGPoint tilepos;
    tilepos.x = abs(mapCoordinate.x / theTilemap.tileSize.width);
    tilepos.y = abs(mapCoordinate.y / theTilemap.tileSize.height);

    CGRect boundingBox;
    boundingBox.origin.x = tilepos.x * theTilemap.tileSize.width;
    boundingBox.origin.y = tilepos.y * theTilemap.tileSize.height;
    boundingBox.size.width = theTilemap.tileSize.width;
    boundingBox.size.height = theTilemap.tileSize.height;

    return boundingBox;
}

但是,正如评论中已经说过的那样,这可能不是最有效的方式。

例如,如果你想检查精灵的边界框是否(或即将)与某种类型的瓷砖(比如墙壁或水)发生碰撞,那么你可以检查周围几个点的瓷砖类型你的精灵。

所以,不要只是在你的锚点(即精灵的中间)测试瓷砖

-------
|     |
|  X  |
|     |
-------

您可以测试精灵边界框的所有4个角。

X-----X
|     |
|     |
|     |
X-----X

您可以根据游戏要求测试尽可能多的积分。 根据您的需要,其他偏移对您来说可能更有意义。

例如,仅水平向左和向右,但在精灵前面有一个偏移:

   -------
   |     |
 X |     | X
   |     |
   -------

   -------
   |     |
 X |     | X
   |     |
   ------- 
 X    X    X

好处是您只对每个“传感器”点进行测试。 如果使用边界框,则必须测试相关的每个图块。 一旦你对少数几块瓷砖进行测试,效果就会降低。

<强>更新。弹跳球的例子:

假设球只与一个始终低于球的墙(一个地板)发生碰撞 假设你的球在中心有一个锚点。你用球的半径来计算(X)。 你可以通过划分精灵的边界框高度/ 2来计算半径。

   -------
   |     |
   |  .  |
   |     |
   ---X--- 

TTTTTTTTTTTTTTTTTTTTTTT

。 =锚点 X =测试与地板碰撞的位置 T =瓷砖

获取精灵的坐标,这是一个锚点(。) 计算测试点的坐标(X) testpoint xpos =和你的球精灵相同 testpoint ypos = ball sprite y pos + radius(如果你想要+一点偏移来提前测试)

每个框架在坐标(X)处获得图块并检查它是否是具有碰撞属性的图块。 如果是,那么你就会发生碰撞并作出相应的反应(在这种情况下改变运动方向)。

如果您希望球能够与天花板和侧壁碰撞,那么请检查所有4个边缘:

      X
   -------
   |     |
 X |  .  | X
   |     |
   ------- 
      X