Объект под курсором не найден

Я пробовал три разных подхода, но ни один не работал.

Я помещаю два прямоугольника на холст и хочу поймать объект под курсором мыши, когда произошло событие mousedown.

Сценарная работа работает, но объекты не найдены. Наблюдая за отладчиком, я вижу, что у прямоугольника все еще есть координаты рисования, а не те, которые я установил позже. Существует также "hitarea", который я не знаю, как использовать, так как он проверяется во время hittest и getObjectUnderPoint.

Подход 1: makeButton создает обработчик в строках 66ff -> он никогда не срабатывает

Подход 2: getObjectUnderPoint, когда происходит сбой mousedown. -> возвращает всегда ноль

Подход 3: переберите каждого дочернего элемента и примените метод hitttest -> всегда возвращает false.

Я пришел из Java и C# и далек от того, чтобы иметь опыт работы с JS, но я надеялся, что смогу поймать муссоун хотя бы одним подходом.

Что заставляет меня задуматься, так это то, что x и y в прямоугольнике никогда не меняются по сравнению с теми, которые использовались при создании (0,0). Это не текущая позиция, которую я установил, например, в 73 и 74!

Кажется, я не нахожу НАСТОЯЩИХ x и y объекта, и ни один из них не подходит к подходам 2 и 3. Я хотел, чтобы подход 1 работал, так как это имеет для меня наибольшее значение.

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="stylesheet" href="./css/style.css">
    <meta charset="utf-8" />
    <title></title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/EaselJS/1.0.2/easeljs.js"></script>
    <script>

    function init() {
        var followme = 0;
        var canvas = document.getElementById("canvas");
        var stage=new createjs.Stage(canvas);
        var shape=new createjs.Shape();
        var dispO = new createjs.Shape();

        makeBtn(3,3);
        makeBtn(300,300);
        stage.on("stagemousedown", function (evt) {
            followme = 1;
            found=stage.getObjectUnderPoint(stage.mouseX, stage.mouseY,0)
            if(found != null)
            {
                console.log(found);
            }
            var xxx=stage.children;
            for (i=0; i<xxx.length;i++)
            {
                if (xxx[i].hitTest(stage.mouseX, stage.mouseY))
                {
                    shape.alpha=1;
                }
            }
        });
        stage.on("stagemouseup", function (evt) {
            followme = 0;
        });
        stage.update();

        createjs.Ticker.setFPS(30);
        createjs.Ticker.addEventListener("tick", handleTick);
        function handleTick(event) 
        {
            if ((followme === 1) && (dispO != null))
            {
                var difX = stage.mouseX - dispO.x - 100;
                var difY = stage.mouseY - dispO.y - 50;

                dispO.x += difX / 20;
                dispO.y += difY / 20;
                stage.update();
            }
            else
            if(dispO != null)
            {
                var dmy=dispO;
            }
        }
        function makeBtn(x,y)
        {
                shape = new createjs.Shape();
                shape.graphics.beginStroke("black").setStrokeStyle(2, 0, 1).drawRect(0, 0, 200, 100);
                dispO=shape;
                dispO.mouseEventsEnabled = true;
                var handler=dispO.on("mousedown", 
                    function(event) {console.log(instance == this); },// true, "on" uses dispatcher scope by default.      
                    null,
                    once=true,
                    'theButton',
                    useCapture=true
                );
                dispO.x=x;
                dispO.y=y;
                stage.addChild(dispO);
                
        }
    }

    </script>
</head>
<body onload="init();">
    <div id="outer">
        <canvas id="canvas" width="500" height="600">
        </canvas>
            <menu id="controls">
            </menu>
    </div>
</body>
</html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/EaselJS/1.0.2/easeljs.js"></script>

1 ответ

Ваша демонстрация работает отлично - просто у вашего квадрата нет заливки, поэтому кликабельна только граница. Если вы добавите заливку, то она прекрасно работает:

https://jsfiddle.net/lannymcnie/ozcr6tna/

shape.graphics.beginStroke("black")
  .setStrokeStyle(2, 0, 1)
  .beginFill("white") //      <----- Fill call
  .drawRect(0, 0, 200, 100);

Если вы хотите, чтобы интерактивная область была прозрачной, вы можете использовать hitArea. Просто назначьте другую форму с заливкой как hitArea (и не добавляйте эту форму на сцену). Тестирование попаданий в EaselJS использует заполнение пикселями - так что если нет пикселей, то и попадания нет!

Надеюсь, это поможет!

Другие вопросы по тегам