瓷砖和精灵边界框之间的碰撞检测



是否有机会获取平铺贴图的平铺块的边界框,并检查此边界框是否与精灵边界框碰撞?

要在瓦片映射的给定位置获得瓦片的边界框:

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

tttttttttt

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

获取精灵的坐标,即锚点(.)计算待测点坐标(X)testpointxpos=与您的球精灵相同测试点ypos=球精灵y位置+半径(如果你想+一点偏移量来测试前方)

每个帧都会在坐标(X)处获得平铺,并检查它是否是具有碰撞特性的平铺。如果是这样的话,那么你就会发生碰撞并做出相应的反应(在这种情况下是运动方向的改变)。

如果你想让球也能与天花板和侧墙碰撞,那么检查所有4个边缘,比如:

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

最新更新