Cocos2d iphone 基于Cocos2d的Tilemap平台碰撞检测

Cocos2d iphone 基于Cocos2d的Tilemap平台碰撞检测,cocos2d-iphone,Cocos2d Iphone,我在iPhone上使用Cocos2d开发平台,这让我对游戏开发如痴如醉。我正在努力运行碰撞检测,以便我的角色在撞到平台时取消跳跃动作 我正在使用一种技术,从中我创建了一个单独的元瓷砖层。问题在于,直到角色精灵位于可碰撞互动程序中,而不是其顶部,碰撞检测才会发生 我使用下面的代码根据角色精灵的当前位置确定平铺坐标: - (CGPoint) tileCoordForPosition: (CGPoint) position { int x = position.x / tileMap.

我在iPhone上使用Cocos2d开发平台,这让我对游戏开发如痴如醉。我正在努力运行碰撞检测,以便我的角色在撞到平台时取消跳跃动作

我正在使用一种技术,从中我创建了一个单独的元瓷砖层。问题在于,直到角色精灵位于可碰撞互动程序中,而不是其顶部,碰撞检测才会发生

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

    - (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中的冲突?

我有解决此问题的方法

在方法CGPoint TILECORDFORPOSITION:CGPoint position中,必须编写以下内容:

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);

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

你需要做的是使用CGRectContainRect检查玩家精灵的边界框是否与不应该相交的瓷砖相交

你还记得你用了什么解决方法吗?嗨,詹姆斯,我的情况和你发布这个问题时的情况一样。你有什么愿意分享的解决方案吗?非常感谢你。