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