Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SFML与tilemaps的冲突_C++_Sfml - Fatal编程技术网

C++ SFML与tilemaps的冲突

C++ SFML与tilemaps的冲突,c++,sfml,C++,Sfml,我目前的做法是对照我的数组进行检查,并为我得到的每个不同的值制作案例。它适用于只有1或2个可对撞图块的小地图,但如果我有100多个图块,我就必须创建100多个图块,如果玩家进入另一个地图,我就必须创建更多的图块,这是非常低效的。有没有更好的方法可以和玩家进行tilemap碰撞 比如说 int x = player.getPlayerPositionX() / map.getTileWidth(); int y = player.getPlayerPositionY() / map.getTile

我目前的做法是对照我的数组进行检查,并为我得到的每个不同的值制作案例。它适用于只有1或2个可对撞图块的小地图,但如果我有100多个图块,我就必须创建100多个图块,如果玩家进入另一个地图,我就必须创建更多的图块,这是非常低效的。有没有更好的方法可以和玩家进行tilemap碰撞

比如说

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

通常情况下,游戏中的瓷砖应标记为可通行或不可通行。没有必要检查每一种可能的情况

struct Tile {
    bool passable;
};

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

}

我想你的问题是关于。在您的情况下,如果您有大小已知的磁贴,并且存储在栅格(2d阵列)中;您可以使用整数分割(玩家坐标的平铺宽度)来确定网格中的索引,以检查碰撞。对于“保守”,你也要检查邻居,这样你就可以确定玩家的大小,并检查激活的磁贴。我在极端屠杀中实现了多个版本,你可以参考zip中的源代码。有一个用于景观构建的二叉树版本,还有一个用于敌人存储分区的网格/瓷砖版本

你所说的“制作案例”到底是什么意思?您能提供一些代码来说明您当前的方法吗?您如何存储tilemap?给我们一些代码显示您当前的状态implementation@Omni编辑以显示示例。我将tilemap存储在一个向量中,您为2个玩家移动方向显示
case
语句,而不是可碰撞的Tile;您的代码与您的问题描述不匹配。sry我的英语不是很好,我是指if语句,例如,如果我的向量中的值为1,则停止播放机移动到其中。但是如果我有更多的可碰撞图块,我就必须在向量中为更多的值这样做。所以,如果我有多达100种不同的可碰撞瓷砖,我必须为每一种瓷砖都有一个if语句。