使用Cocos2d进行Tilemap平台冲突检测

时间:2011-09-01 02:11:21

标签: cocos2d-iphone

通过使用Cocos2d for iPhone在平板电脑上工作,我开始了解游戏开发。我正在努力让碰撞检测运行,以便我的角色在他击中平台时取消他的跳跃动作。

我正在使用this tutorial中的一种技术,在那里我创建了一个单独的“元图块”层。问题是,直到角色精灵完全位于可碰撞的磁贴内,而不是在它之上时才会发生碰撞检测。

我正在使用下面的代码根据我的角色精灵的当前位置确定平铺坐标:

    - (CGPoint) tileCoordForPosition: (CGPoint) position {
    int x = position.x / tileMap.tileSize.width;
    int y = ((tileMap.mapSize.height * tileMap.tileSize.height) - position.y) / tileMap.tileSize.height;
    return ccp(x, y);
}

我尝试了各种技巧,甚至试图用这段代码弄清楚我的角色下面是什么牌:

- (void) update: (ccTime) dt {
    BOOL isCollision = NO;
    if (firstRun) {
        oldY = player.position.y;
        firstRun = NO;
    }
    CGPoint oneTileDown = ccp(player.position.x, player.position.y / 2);
    CGPoint tileCoord = [gameplayLayer tileCoordForPosition:oneTileDown];
    int tileGid = [gameplayLayer.meta tileGIDAt:tileCoord];

    if (tileGid) {
        NSDictionary* tileProperties = [gameplayLayer.tileMap propertiesForGID:tileGid];
        if (tileProperties) {
            NSString* collision = [tileProperties valueForKey:@"Collidable"];
            if (collision && [collision compare:@"True"] == NSOrderedSame) {
                //CCLOG(@"Collision Below");
                isCollision = YES;
                if (player.characterState == kStateFalling) {
                    [player stopAllActions];
                }
            }
        }
    }

    if (oldY < player.position.y) {
        CCLOG(@"Character is jumping");
        player.characterState = kStateJumping;
    }
    else if (oldY > player.position.y) {
        CCLOG(@"Character is falling");
        player.characterState = kStateFalling;
    }

    oldY = player.position.y;
}

但是同样的问题发生了:我的角色跳跃,落在碰撞瓦片内部并停止而不是降落在瓷砖顶部。

有没有更好的方法来检查tilemap中的碰撞?

2 个答案:

答案 0 :(得分:0)

我有解决这个问题的方法。

在方法(CGPoint) tileCoordForPosition: (CGPoint)位置,您必须编写以下内容:

int x = position.x / tileMap.tileSize.width;
    int y = ((tileMap.mapSize.height * tileMap.tileSize.height + player.contenSize().height / 2) - position.y) / tileMap.tileSize.height;
    return ccp(x, y);

player是一个精灵,你必须从中添加一半的高度。

答案 1 :(得分:0)

你需要做的是使用CGRectContainRect检查玩家精灵的边界框是否与不应该匹配的图块相交。