flash cc createjs hittest работает без ошибок

прямоугольник должен быть альфа = 0,1, как только круг касается прямоугольника. но если заявление не работает. становится 0,1 непрозрачности без удара

/* js

var circle = new lib.mycircle();
stage.addChild(circle);

var rect = new lib.myrect();
stage.addChild(rect);
rect.x=200;
rect.y=300;

circle.addEventListener('mousedown', downF);
function downF(e) {
stage.addEventListener('stagemousemove', moveF);
stage.addEventListener('stagemouseup', upF);
};
function upF(e) {

stage.removeAllEventListeners();
}
function moveF(e) {
circle.x = stage.mouseX;
circle.y = stage.mouseY;
}

if(circle.hitTest(rect))
{
  rect.alpha = 0.1;

}
stage.update();
*/

person Salma    schedule 28.03.2016    source источник
comment
В этой демонстрации hitTest запускается только один раз (в начале). Это намерение?   -  person Lanny    schedule 28.03.2016
comment
Кроме того, какую версию CreateJS вы используете? Синтаксис кода /*js */ взят из довольно старой версии CreateJS Toolkit (по сравнению с форматом документа Flash/Animate HTML5, который поддерживает код JavaScript).   -  person Lanny    schedule 28.03.2016
comment
Я обновил последнюю размещенную библиотеку. Нет проблем . Но намерение состоит в том, чтобы сделать код, при котором прямоугольник должен переходить в альфа-канал 0,1, когда круг касается его.   -  person Salma    schedule 29.03.2016
comment
Обратите внимание, что hitTest в CreateJS основан только на точках. Он скажет вам, если определенная точка попадает в объект. Если вам нужна коллизия на основе формы, вам придется создать ее или использовать что-то вроде Box2D (демо)   -  person Lanny    schedule 01.04.2016


Ответы (1)


То, как вы использовали 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, это будет верно, когда координаты круга находятся в этих диапазонах, то есть как раз тогда, когда он находится в верхнем левом углу холста. Если вы замените свой код моим, вы увидите это поведение.

Итак, чтобы заставить его работать так, как вы хотите, вы можете сделать несколько вещей.

  1. Преобразуйте свои координаты. Используйте 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;
}
  1. Не используйте хиттест. Используйте getObjectsUnderPoint, передайте координаты x/y круга и проверьте, находится ли прямоугольник в возвращаемом списке.

Надеюсь, это поможет. Как я упоминал в комментарии выше, вы не можете сделать полное столкновение формы, только точечное столкновение (одна точка на объекте).

person Lanny    schedule 01.04.2016