Я работаю над 3D-лабиринтом, в котором сам лабиринт генерируется автоматически и случайным образом при каждом запуске программы. Так что в основном стены всегда где-то еще. Здесь мне нужна помощь, чтобы выяснить, как обнаружить столкновение, и, таким образом, игрок не может нажимать кнопки, чтобы двигаться, так как там стена. (3D на самом деле не имеет значения, так как он виден сверху, и теперь он работает как 2D-лабиринт)
Вот где я сейчас:
Мой персонаж - простой куб:
struct Cube {
glm::vec3 position;
glm::vec3 size;
};
Ниже вы можете найти, как я могу сделать моего персонажа подвижным. Я мог бы проверить, есть ли край лабиринта, чтобы вы не могли пройти через эти стены, но внутри лабиринта вы все еще можете. Стены всегда 0,25 ширины. Я хотел бы реализовать такую функцию, как IsCollide, но я не знаю как. Когда я вызову функцию, std::vector<Cube> maze
будет содержать данные, которые я покажу на картинке.
static void MoveCharacter(Cube &character, Keyboard keyboard, std::vector<Cube> maze)
{
if (keyboard.getKey(GLFW_KEY_UP))
{
if (character.position.x >= MazeHeight - 1.0f) || IsCollide(character, maze))
{
character.position += glm::vec3(0,0,0);
} else character.position += glm::vec3(0.05, 0, 0);
}
if (keyboard.getKey(GLFW_KEY_DOWN))
{
if (character.position.x <= 0.0f)
{
character.position += glm::vec3(0, 0, 0);
} else character.position -= glm::vec3(0.05, 0, 0);
}
if (keyboard.getKey(GLFW_KEY_RIGHT))
{
if (character.position.z >= MazeWidth - 1.0f)
{
character.position += glm::vec3(0, 0, 0);
} else character.position += glm::vec3(0, 0, 0.05);
}
//...
}
Я пытался написать свою функцию как-то так, но я в значительной степени потерян в этом и не уверен, как go на ...
static bool IsCollide(Cube character, std::vector<Cube> maze)
{
for (auto i : maze)
if ( (character.position.x < (i.position.x + i.size.x)) && (character.position.x + character.size.x > i.position.x)) // && (//...) && (//...)
// to implement!
{
return true;
} return false;
}
Я был бы ОЧЕНЬ рад каждому ответу и помощи!
Заранее большое спасибо!