То, как вы использовали hitTest, неверно. Метод hitTest
не проверяет объект на объект. Он принимает координаты x и y и определяет, есть ли в этой точке в ее собственной системе координат заполненный пиксель.
Я изменил ваш пример, чтобы сделать его более правильным, хотя на самом деле он не делает то, что вы ожидаете:
circle.addEventListener('pressmove', moveF);
function moveF(e) {
circle.x = stage.mouseX;
circle.y = stage.mouseY;
if (rect.hitTest(circle.x, circle.y)) {
rect.alpha = 0.1;
} else {
rect.alpha = 1;
}
stage.update();
}
Ключевые моменты:
- Возобновлено движение прессы. Это работает нормально.
- Обновление круга перемещено над проверкой hitTest. В противном случае вы проверяете, где это было последний раз
- Переместил этап обновления на последний. Это должно быть последнее, что вы обновляете. Однако обратите внимание, что вы можете удалить его полностью, потому что у вас есть прослушиватель Ticker на рабочей области в вашем HTML-файле, который постоянно обновляет рабочую область.
- Добавлен оператор
else
для возврата альфы к 1, если hitTest не пройден.
Затем, наиболее важным моментом является то, что вместо этого я изменил hitTest на прямоугольник. По сути, это говорит: «Есть ли заполненный пиксель в заданных координатах x и y внутри прямоугольника?» Поскольку границы прямоугольника равны -49.4, -37.9, 99, 76
, это будет верно, когда координаты круга находятся в этих диапазонах, то есть как раз тогда, когда он находится в верхнем левом углу холста. Если вы замените свой код моим, вы увидите это поведение.
Итак, чтобы заставить его работать так, как вы хотите, вы можете сделать несколько вещей.
- Преобразуйте свои координаты. Используйте localToGlobal или просто схитрите и используйте
localToLocal
. Это берет [0,0]
в круге и преобразует эту координату в координатное пространство прямоугольника.
Пример:
var p = rect.localToLocal(0, 0, circle);
if (rect.hitTest(p.x, p.y)) {
rect.alpha = 0.1;
} else {
rect.alpha = 1;
}
- Не используйте хиттест. Используйте
getObjectsUnderPoint
, передайте координаты x/y круга и проверьте, находится ли прямоугольник в возвращаемом списке.
Надеюсь, это поможет. Как я упоминал в комментарии выше, вы не можете сделать полное столкновение формы, только точечное столкновение (одна точка на объекте).
person
Lanny
schedule
01.04.2016