是否有机会获取平铺贴图的平铺块的边界框,并检查此边界框是否与精灵边界框碰撞?
要在瓦片映射的给定位置获得瓦片的边界框:
- (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