对于更简单但功能强大的碰撞检测,您很可能需要物理引擎。
我推荐 Chipmunk 引擎的 SpaceManager 扩展。
在 Tiled 中,您可以将对象层添加到 tmx 文件中,您可以在其中列出所有障碍物。
这就是我在游戏场景中解析这些信息的方式:
在初始化中:
self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"TileMap.tmx"];
...
smgr = [[SpaceManagerCocos2d alloc] init];
smgr.constantDt = 1/60.0;
smgr.gravity=ccp(0, 0);
[smgr addWindowContainmentWithFriction:0.0 elasticity:0.0 size:CGSizeMake(1000, 1000) inset:cpvzero radius:1.0f]; //borders of your world, can be set from tmx size
player = [smgr addCircleAt:ccp(x,y) mass:6 radius:15];
在某处:
- (void) drawWalls {
//searching for object layer called "Collisions"
CCTMXObjectGroup *objects = [_tileMap objectGroupNamed:@"Walls"];
NSMutableDictionary * objPoint;
int x ;
int y ;
int w ;
int h ;
for (objPoint in [objects objects]) {
x = [[objPoint valueForKey:@"x"] intValue];
y = [[objPoint valueForKey:@"y"] intValue];
w = [[objPoint valueForKey:@"width"] intValue];
h = [[objPoint valueForKey:@"height"] intValue];
GameController *controller = [GameController sharedController];
if(controller.retina==1)
{
x=x/2;
y=y/2;
w=w/2;
h=h/2;
}
cpShape *staticShape = [smgr addRectAt:ccp(x+w/2,y+h/2) mass:STATIC_MASS width:w height:h rotation:0];
}
}
然后,您可以对“玩家”对象施加力并在“更新”方法中更新您的精灵位置:
playerSprite.position=ccp(player->body->p.x, player->body->p.y);
当然您可以使用其他算法来检测碰撞,但这只是从 tmx 存储和检索此信息的示例。