2017-01-22 6 views
0

Two RectanglesСтоп два прямоугольника из пересекающихся

Этот маленький мир содержит человека (синий прямоугольник) и дерево (большой зеленый прямоугольник). Лицом можно управлять, нажимая клавиши вверх, вниз, влево, вправо на клавиатуре. Синий прямоугольник перемещается только при нажатии клавиш. Синий прямоугольник не должен сойти с карты (т. Е. Не должен выходить из серой области) и не должен перекрывать зеленый прямоугольник.

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

if (blueRect.rightEdge >= (canvas.width - 1)) { 
    // Don't allow going further to the right 
    // But allow going up, down, and to the left 
} 

// Check the same thing for the other sides of the grey area 

То, что я не уверен в том, как предотвратить два прямоугольника из пересекающихся. Two Rectangles

На картинке выше, как мне «отключить» движение вправо (чтобы предотвратить перекресток)? Я все равно хотел бы подняться, опуститься и уйти.

+0

Узнайте об обнаружении столкновения? Я уверен, что есть достаточные учебники и ресурсы, которые вы можете найти, используя поисковую систему по вашему выбору. – UnholySheep

+0

@UnholySheep. Проблема в том, что в большинстве учебных пособий показано, как обнаружить пересечения. Мне не нужно обнаруживать пересечения. Мне нужно предотвратить пересечения. – Flux

+0

Это называется «разрешение столкновения» - это следующий шаг после обнаружения столкновения. Если вы хотите предотвратить пересечение, вам сначала нужно определить, что это произойдет, если вы переместите свой объект. – UnholySheep

ответ

3

Что вы имеете в виду, называется collision detection. Я не верю, что есть простой ответ, который всегда применяется.

Однако в вашем случае, потому что у вас есть простые прямоугольники, вы можете проверить, чтобы увидеть, если какой-либо один из четырех углов МЕНЬШЕ прямоугольника внутри БОЛЬШИЙ прямоугольника.

Если вы не знаете, что меньше, а что больше, вы можете проверить в обоих направлениях (т. Е. Прямоугольник A в углу внутри прямоугольника B, а затем, если угол прямоугольника B находится внутри прямоугольника A). Убедитесь, что вы используете> = и < = чтобы поймать это надоедливое граничное условие.

Возможно, что-то, как это необходимо (псевдокод):

nextLocation = translate(rectangleA, "up") 
if (isIntersecting(rectangleB, nextLocation)) { 
    error("collision!") 
} else { 
    rectangleA = nextLocation 
} 
+0

Но разве ваш предложенный метод не создаст пересечение? Проблема с пересечением состоит в том, что если я нажимаю правую кнопку и сталкиваюсь с чем-то, нет никакого способа узнать, что правильный способ выйти из беспорядка - нажать левую кнопку. – Flux

+0

Вы хотите определить, приведет ли запрошенный ход к пересечению. Если это так, вы запретите это движение, основанное на «столкновении». Не забывайте - это не простой предмет, с которым вы имеете дело. –