2013-05-05 3 views
0

Мне нужно заблокировать два прямоугольника, сталкивающихся друг с другом в Action Script. Код, который у меня есть, работает только по-разному (только столкновение X на X или Y на Y). Когда я проверяю, сталкивается ли он на оси X и Y, они мешают.AS3 2D Прямоугольная блокировка блокировки

функция collisionTest (obj1, obj2) {

var b1 = getBound(obj1); 
var b2 = getBound(obj2); 

if(((b1.x < b2.x + b2.width) && (b1.x + b1.width > b2.x)) && ((b1.y + b1.height > b2.y) && (b1.y < b2.y + b2.height))) 
{ 
    if(b1.x + b1.width > b2.x + b2.width) 
     obj1.x = b2.x + b2.width; 
    else if(b1.x < b2.x) 
     obj1.x = b2.x - obj1.width; 
    else if(b1.y < b2.y) 
     obj1.y = b2.y - obj1.height; 
    else if(b1.y + b1.height > b2.y + b2.height) 
     obj1.y = b2.y + b2.height; 
} 

}

Если есть другой способ, чтобы проверить на столкновения и блокировать его, то пожалуйста, скажите мне, но я искал на Google и stackoverflow, и не нашли ничего полезного для блокировки столкновения, однако я нашел много о тестировании для них.

ответ

0

Шаг 1: Получите Box2d. Шаг 2: Спасибо!

По всей серьезности используйте хорошо известные высоко оптимизированные библиотеки. Вероятно, у вас больше механиков, чтобы идти с столкновением.

Если столкновение - единственное, что вы хотите, то я предлагаю вам использовать hitTest. Преимущество заключается в том, что вы можете сравнивать нерегулярные фигуры друг с другом, а не только с коробками. Вы просто проверяете каждый раз, когда ваши объекты перемещаются, если hitTest истинно. Если это так, вы возвращаетесь к предыдущему состоянию или помещаете их рядом друг с другом.

Другой вариант этого метода - добавить «ауру» к движущемуся объекту. Если aura hitTests целевой объект, STOP. Таким образом, вам не нужно выполнять дополнительный шаг для перемещения объекта.

Надежда Я выражался ясно, я полусон: D

0

hitTestObject работает просто отлично для двух прямоугольных объектов:

if (obj1.hitTestObject(obj2)) 
{ 
    // handle collision 
} 
0

Если это чистые столкновения прямоугольника, вы можете использовать пересекающийся метод прямоугольника ,

var overlapRect:Rectangle = RECTANGLE1.intersection(RECTANGLE2); 

Это будет сбрасывать информацию о столкновении, подобном этому, в overlapRect.

enter image description here

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

enter image description here