Cocos2d iphone 瓷砖与精灵边界框之间的碰撞检测

Cocos2d iphone 瓷砖与精灵边界框之间的碰撞检测,cocos2d-iphone,Cocos2d Iphone,是否有机会获取平铺贴图的平铺边界框并检查此边界框是否与sprite边界框冲突?要获取平铺贴图给定位置的平铺边界框: - (void) setupTilemap { NSString * aFilename = @"tilemap.tmx"; theTilemap = [CCTMXTiledMap tiledMapWithTMXFile:aFilename]; [self addChild:theTilemap]; } - (CGRect) tileBounding

是否有机会获取平铺贴图的平铺边界框并检查此边界框是否与sprite边界框冲突?

要获取平铺贴图给定位置的平铺边界框:

- (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;
}
但是,正如评论中所说,这可能不是最有效的方法

例如,如果要检查精灵的边界框是否(或即将)与特定类型的瓷砖(例如墙或水)碰撞,则可以在精灵周围的多个点上检查瓷砖的类型

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

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

X-----X
|     |
|     |
|     |
X-----X
您可以根据您的游戏要求测试任意数量的点数。 根据需要,其他偏移可能对您更有意义

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

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

   -------
   |     |
 X |     | X
   |     |
   ------- 
 X    X    X
这样做的好处是,您只需对每个“传感器”点进行测试。 如果使用边界框,则必须测试每个相关的磁贴。 一旦你测试了超过一把瓷砖,效果就会降低

更新。弹跳球示例:

假设球只与始终位于球下方的一面墙(一层楼)碰撞 假设你的球的固定点在中心。使用球的半径计算(X)。 可以通过将精灵的边界框高度除以/2来计算半径

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

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

获取你的精灵的坐标,它是锚定点(.) 计算待测点坐标(X) testpoint xpos=与球精灵相同 测试点ypos=球精灵y位置+半径(如果您希望+一点偏移以进行前方测试)

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

如果您希望球能够与天花板和侧墙碰撞,请检查所有4条边,如下所示:

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

我肯定有,但我想你不会希望每个瓷砖都出现这种情况。使用玩家的世界坐标检查玩家下方的瓷砖可能会更快,然后对这些瓷砖进行处理。这并不是那么简单,我必须检查瓷砖的上方、下方、左侧和右侧。你的意思是要检查玩家所在瓷砖的上方、下方和左侧和右侧的瓷砖?一旦你有了玩家的牌,就很容易得到旁边的牌。问题是我的精灵大小比牌的大小大。例如,如果平铺大小是32x32像素,我的精灵是120x120像素。哪种方法是检测精灵和互动程序之间冲突的最佳方法(精灵不在互动程序上)。此方法适用于任何精灵大小。当然,这取决于您希望通过测试结果实现什么。您想在原始问题中使用边界框测试做什么?你想阻止玩家(或敌人)使用具有碰撞属性的牌吗?或者您想检测玩家是否在多个瓷砖的较大区域内?还是别的什么?如果你提供更多的信息,我可能会给你更具体的建议。例如,我的屏幕上到处都是大小不一的弹跳球。我需要检测球精灵何时与墙砖碰撞并更改球的方向。添加了如何为反弹球执行此操作的示例。
      X
   -------
   |     |
 X |  .  | X
   |     |
   ------- 
      X