我正在尝试使用cocos2d和Tiled(用于地图)为iphone制作平台游戏。 我在网上看到的所有教程都使用Tiled中的Layers进行碰撞检测。 我想使用对象来做到这一点......不是图层。 使用对象,您可以创建自定义形状,从而为游戏提供更好的“现实”。 举一个我的意思的例子:
我将地面作为背景绘制并在顶部创建了一个对象图层。 我希望用它来检测玩家碰撞,而不是背景图块。
现在使用最着名的教程:http://www.raywenderlich.com/15230/how-to-make-a-platform-game-like-super-mario-brothers-part-1 我试图重写checkForAndResolveCollisions方法来检查对象的冲突。 问题是在Tiled中坐标系与cocos2d不同。平铺从左上角开始,cocos2d从左下角开始....不仅如此......我注意到Tiled(可能)中对象属性的宽度和高度与iphone设备中的相同。 上面的矩形具有以下属性:
它的w / h是480/128平铺(用于视网膜设备),这意味着它可能在地图内部很大,如果我像这样保留它们。我猜我必须把它除以2。 到目前为止我得到了这个:
-(void)checkForAndResolveObjCollisions:(Player *)p {
CCTiledMapObjectGroup *objectGroup = [map objectGroupNamed:@"Collision"];
NSArray* tiles = [objectGroup objects];
CGFloat x, y, wobj, hobj;
for (NSDictionary *dic in tiles) {
CGRect pRect = [p collisionBoundingBox]; //3
x = [[dic valueForKey:@"x"] floatValue];
y = [[dic valueForKey:@"y"] floatValue];
wobj = [[dic valueForKey:@"width"] floatValue];
hobj = [[dic valueForKey:@"height"] floatValue];
CGPoint position = CGPointMake(x, y);
CGPoint objPos = [self tileForPosition:position];
CGRect tileRect = CGRectMake(objPos.x, objPos.y, wobj/2, hobj/2);
if (CGRectIntersectsRect(pRect, tileRect)) {
CCLOG(@"INTERSECT");
CGRect intersection = CGRectIntersection(pRect, tileRect);
NSUInteger tileIndx = [tiles indexOfAccessibilityElement:dic];
if (tileIndx == 0) {
//tile is directly below player
p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y + intersection.size.height);
p.velocity = ccp(p.velocity.x, 0.0);
p.onGround = YES;
} else if (tileIndx == 1) {
//tile is directly above player
p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y - intersection.size.height);
p.velocity = ccp(p.velocity.x, 0.0);
} else if (tileIndx == 2) {
//tile is left of player
p.desiredPosition = ccp(p.desiredPosition.x + intersection.size.width, p.desiredPosition.y);
} else if (tileIndx == 3) {
//tile is right of player
p.desiredPosition = ccp(p.desiredPosition.x - intersection.size.width, p.desiredPosition.y);
} else {
if (intersection.size.width > intersection.size.height) {
//tile is diagonal, but resolving collision vertially
p.velocity = ccp(p.velocity.x, 0.0);
float resolutionHeight;
if (tileIndx > 5) {
resolutionHeight = -intersection.size.height;
p.onGround = YES;
} else {
resolutionHeight = intersection.size.height;
}
p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y + resolutionHeight );
} else {
float resolutionWidth;
if (tileIndx == 6 || tileIndx == 4) {
resolutionWidth = intersection.size.width;
} else {
resolutionWidth = -intersection.size.width;
}
p.desiredPosition = ccp(p.desiredPosition.x + resolutionWidth , p.desiredPosition.y);
}
}
}
// }
}
p.position = p.desiredPosition; //8
}
- (CGPoint)tileForPosition:(CGPoint)p
{
NSInteger x = (NSInteger)(p.x / map.tileSize.width);
NSInteger y = (NSInteger)(((map.mapSize.height * map.tileSize.width) - p.y) / map.tileSize.width);
return ccp(x, y);
}
我得到对象x,y,w,h并尝试将它们转换为cocos2d尺寸和大小。
以上翻译为:
Dimens: 480.000000, 128.000000
Coord: 0.000000, 40.000000
基本上是一团糟。它根本不起作用.....玩家刚刚过来。 我很惊讶没有人在之前做过基于物体的碰撞检测......除非我错了。
有谁知道这是否可以做到或如何做到这一点? 有点他在这里做的事:https://www.youtube.com/watch?feature=player_detailpage&v=2_KB4tOTH6w#t=30
对不起,很长的帖子。 谢谢你提前得到任何答案。