Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ C+中矩形的碰撞分辨率+;_C++_Collision Detection_Collision - Fatal编程技术网

C++ C+中矩形的碰撞分辨率+;

C++ C+中矩形的碰撞分辨率+;,c++,collision-detection,collision,C++,Collision Detection,Collision,我正在制作一个3D迷宫游戏,每次运行程序时,迷宫本身都会自动随机生成。所以基本上,墙总是在别的地方。(不要介意“3D”,它基本上像2D一样工作,因为与垂直轴无关) 我的问题:基本上,我不知道如何使穿墙变得不可能。只要我不长时间按某个键,然后立即切换到相反的方向,它就会成功工作。所以,就像我对着墙按下“向上”按钮一段时间,然后按下“向下”按钮,它检测到它实际上与墙碰撞,所以它开始向位置添加一些值,所以基本上它通过相反的键!希望你得到它 (我试图修改我的代码,就像在函数IsCollide中一样,我没

我正在制作一个3D迷宫游戏,每次运行程序时,迷宫本身都会自动随机生成。所以基本上,墙总是在别的地方。(不要介意“3D”,它基本上像2D一样工作,因为与垂直轴无关)

我的问题:基本上,我不知道如何使穿墙变得不可能。只要我不长时间按某个键,然后立即切换到相反的方向,它就会成功工作。所以,就像我对着墙按下“向上”按钮一段时间,然后按下“向下”按钮,它检测到它实际上与墙碰撞,所以它开始向位置添加一些值,所以基本上它通过相反的键!希望你得到它

(我试图修改我的代码,就像在函数IsCollide中一样,我没有添加或删除值,只是使位置保持不变,但一旦发生碰撞,所有的代码都会阻塞。)

我通过以下功能成功检测到墙与角色(实际上是一个立方体)之间的碰撞:

bool IsCollide(Cube character, std::vector<Cube> maze)
{
    bool collided = false;
    for (auto i : maze)
        if (i.position.z < character.position.z + character.size.z &&
            i.position.z + i.size.z > character.position.z &&
            i.position.x < character.position.x + character.size.x &&
            i.size.x + i.position.x > character.position.x)
        {
            collided = true;
            return collided;
        } return collided;
}
booliscollide(立方体字符,标准::向量迷宫)
{
布尔碰撞=假;
用于(自动i:迷宫)
如果(i.position.z字符.position.z&&
i、 position.x字符.position.x)
{
碰撞=真;
返回碰撞;
}返回碰撞;
}
现在我的问题是,我不能正确使用键盘输入。我给你看我的代码,到目前为止我在哪里

static void MoveCharacter(Cube& character, Keyboard keyboard, std::vector<Cube> maze)
{
        if (keyboard.getKey(GLFW_KEY_UP))
        {
            if ((character.position.x >= MazeHeight - 1.0f)) //top of the maze, don't let it go out
            {
               character.position += glm::vec3(0, 0, 0);
            }
            else if (IsCollide(character, maze)) //it shall go a bit backwards, if it collides
            {
               character.position -= glm::vec3(0.01, 0, 0);
            }
            else character.position += glm::vec3(0.01, 0, 0); //now you can go
        }
        if (keyboard.getKey(GLFW_KEY_DOWN))
        {
            if ((character.position.x <= 0.0f))
            {
                character.position += glm::vec3(0, 0, 0);
            }
            else if (IsCollide(character, maze))
            {
               character.position += glm::vec3(0.01, 0, 0);
            }
            else character.position -= glm::vec3(0.01, 0, 0);

        }
        if (keyboard.getKey(GLFW_KEY_RIGHT))
        {
            if (character.position.z >= MazeWidth - 1.0f)
            {
                character.position += glm::vec3(0, 0, 0);
            }
            else if (IsCollide(character, maze))
            {
                character.position -= glm::vec3(0, 0, 0.01);
            }
            else character.position += glm::vec3(0, 0, 0.01);

        }
        if (keyboard.getKey(GLFW_KEY_LEFT))
        {
            if ((character.position.z <= 0.0f))
            {
                character.position += glm::vec3(0, 0, 0);
            }
            else if (IsCollide(character, maze))
            {
                character.position += glm::vec3(0, 0, 0.01);
            }
            else character.position -= glm::vec3(0, 0, 0.01);
        }
        if (character.position.x >= MazeHeight - 1.0f && character.position.z >= MazeWidth - 1.0f)
        {
            std::cout << "YOU WIN" << std::endl;
            //reached the goal
        }

}
static void-MoveCharacter(立方体和字符、键盘、std::vector迷宫)
{
if(keyboard.getKey(GLFW_KEY_UP))
{
如果((character.position.x>=MazeHeight-1.0f))//在迷宫的顶部,不要让它出去
{
character.position+=glm::vec3(0,0,0);
}
else if(IsCollide(character,maze))//如果发生碰撞,它将向后移动一点
{
character.position-=glm::vec3(0.01,0,0);
}
else character.position+=glm::vec3(0.01,0,0);//现在可以开始了
}
if(keyboard.getKey(GLFW_KEY_DOWN))
{
if((character.position.x=MazeWidth-1.0f)
{
character.position+=glm::vec3(0,0,0);
}
else if(IsCollide(字符、迷宫))
{
character.position-=glm::vec3(0,0,0.01);
}
else character.position+=glm::vec3(0,0,0.01);
}
if(keyboard.getKey(GLFW_键左))
{
if((character.position.z=MazeHeight-1.0f&&character.position.z>=MazeWidth-1.0f)
{

std::cout如果碰撞检测正在工作,那么总是保存字符的前一个位置如何?如果它撞到墙上,将其设置回其前一个位置。这可能不是最优雅的方式,但它应该可以工作,而无需更改任何其他逻辑。这是我认为应该工作的,但由于此函数是在每个按键处理部件中调用,一旦它与墙发生碰撞,它就不再移动了(如我所述)。如果是这样,则会出现其他问题。如果你除了检测到它击中并将其设置回上一个位置之外,没有任何其他问题(当然不会将非法位置保存为上一个位置)它应该可以正常工作。调试时间似乎到了:-)