SFML与tilemaps碰撞

时间:2017-12-19 14:09:26

标签: c++ sfml

我目前的做法是检查我的数组并为每个不同的值创建案例。它适用于只有1或2个可碰撞瓷砖的小地图,但如果我有超过100个,我必须创建超过100个案例,如果玩家进入另一个地图,我必须创建更多非常低效的案例。有没有更好的方法可以与玩家进行瓷砖地图碰撞?

例如

int x = player.getPlayerPositionX() / map.getTileWidth();
int y = player.getPlayerPositionY() / map.getTileHeight();

switch (player.getDirection())
{
case 3:
    if (map.data[x + y * map.getMapWidth()] == 1)
    {
        player.moveRect(1.0f, 0);
    }
    break;
case 4:
    x = (player.getPlayerPositionX() + 20) / map.getTileWidth();
    if (map.data[x + y * map.getMapWidth()] == 1)
    {
        player.moveRect(-1.0f, 0);
    }

    break;
}

2 个答案:

答案 0 :(得分:1)

通常,游戏中的磁贴应标记为可通过或无法通过。无需检查每种可能的情况。

struct Tile {
    bool passable;
};

bool collision(tileMap, playerCharacter) {
    if(tileMap[playerCharacter.x][playerCharacter.y].Tile != passable) {
        //some collision logic here
    }

}

答案 1 :(得分:0)

我认为你的问题是space partitionning。在您的情况下,如果您的瓷砖具有已知尺寸,并存储在网格中(2d数组);您可以使用整数除法(播放器坐标的平铺宽度)来确定网格中的索引以检查您的碰撞。对于“保守性”,你也会检查邻居,这样你就可以确保跨越玩家的大小并检查激活的牌。我在极端大屠杀中实现了多个版本,你可以参考zip https://sourceforge.net/projects/extremecarnage/中的源代码,有一个用于横向构建的二叉树版本,以及一个用于敌人存储分区的网格/磁贴版本