Tiled中的对象与cocos2d中Sprite的边界框之间的碰撞检测

时间:2014-08-24 15:35:59

标签: ios cocos2d-iphone collision tiled

我正在尝试使用cocos2d和Tiled(用于地图)为iphone制作平台游戏。 我在网上看到的所有教程都使用Tiled中的Layers进行碰撞检测。 我想使用对象来做到这一点......不是图层。 使用对象,您可以创建自定义形状,从而为游戏提供更好的“现实”。 举一个我的意思的例子: enter image description here

我将地面作为背景绘制并在顶部创建了一个对象图层。 我希望用它来检测玩家碰撞,而不是背景图块。

现在使用最着名的教程:http://www.raywenderlich.com/15230/how-to-make-a-platform-game-like-super-mario-brothers-part-1 我试图重写checkForAndResolveCollisions方法来检查对象的冲突。 问题是在Tiled中坐标系与cocos2d不同。平铺从左上角开始,cocos2d从左下角开始....不仅如此......我注意到Tiled(可能)中对象属性的宽度和高度与iphone设备中的相同。 上面的矩形具有以下属性:

enter image description here

它的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

对不起,很长的帖子。 谢谢你提前得到任何答案。

0 个答案:

没有答案