Разрешение столкновений с прямоугольниками в C ++ - PullRequest
0 голосов
/ 18 марта 2020

Я работаю над 3D-лабиринтом, в котором сам лабиринт генерируется автоматически и случайным образом при каждом запуске программы. Так что в основном стены всегда где-то еще. (не обращайте внимания на «3D», оно в основном работает как 2D, потому что с вертикальной осью ничего общего не имеет)

Мой вопрос / проблема: По сути, я не знаю, как сделать невозможным go сквозь стены. Он работает успешно, пока я не нажимаю клавишу слишком долго, а затем сразу же переключаюсь в противоположную сторону. Итак, как будто я нажимаю кнопку «ВВЕРХ» на некоторое время у стены, затем я нажимаю «ВНИЗ», и он обнаруживает, что он действительно сталкивается со стеной, поэтому он начинает добавлять некоторые значения в позицию, так что в основном это происходит через противоположный ключ! Надеюсь, вы получили это!

(Я пытался изменить свой код, как в функции 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;
}

Теперь моя проблема заключается в том, что я не могу правильно использовать это с ввод с клавиатуры. Я покажу вам свой код, где я до сих пор.

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
        }

}

Надеюсь, вы можете мне помочь, я был бы очень признателен! Спасибо, ребята!

...