Я работаю над 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
}
}
Надеюсь, вы можете мне помочь, я был бы очень признателен! Спасибо, ребята!