'mousemove'画布中的事件侦听器-指针仅在最后一个矩形中更改

'mousemove' event listener in canvas - pointer change in last rectangle only

本文关键字:最后一个 mousemove 布中 侦听器 事件 指针      更新时间:2023-09-26

https://jsfiddle.net/jlpiedra90/3a7cojgw/4/

查看上面的fiddle以获取实际代码。

我正在尝试创建一个2d画布游戏的基本菜单。我现在对大部分内容都很满意,因为它很适合我的需求。然而,除了更改屏幕所需的"mouseclick"事件外,我认为添加"mousemove"会更清楚地表明,当鼠标悬停在按钮上时,用户实际上是在鼠标悬停在他们可以单击的按钮上。

无论如何,这是我的按钮功能的相关代码:

var Button = function(...) {
    ...        
    I.over = function(event) {
        x = event.offsetX;
        y = event.offsetY;
        if (x >= I.bX && x <= (I.bX+I.bW) && y >= I.bY && y <= (I.bY+I.bH)) {
            $('#canvas').css('cursor','pointer');
        } else {
            $('#canvas').css('cursor','auto');
        };
    };
    I.removePress = function () {
        canv.removeEventListener('mousemove', I.over, false);
        canv.removeEventListener('mousedown', I.pressed, false);
    };
    canv.addEventListener('mousemove', I.over, false);
    canv.addEventListener('mousedown', I.pressed, false);
    return I;
};

当我将每个按钮的"函数"推送到一个数组GUI时,就会添加事件侦听器。奇怪的是,虽然"mousedown"监听器对每个单独的按钮都能正常工作,但"mousemove"监听器只对添加的最后一个按钮工作。因此,将鼠标移到"关于"按钮上会显示更改后的光标;"帮助"或"启动"的情况并非如此。我正在使用jQuery来处理光标的更改。

如果有任何帮助,我们将不胜感激,但请注意,我正在努力从零开始尽可能多地做到这一点。我知道像Easel、Create等库,但我不希望在这个项目中使用它们。非常感谢。

所有按钮一个接一个地设置同一节点的光标属性:#canvas

所以,假设光标在第二个按钮上,下面是当你得到一个事件时会发生的事情:

  1. 按钮1获取事件,它将canvas的光标设置为'auto'
  2. 反过来,按钮2获得事件,它将canvas的光标设置为'pointer'(覆盖按钮1的操作)
  3. 反过来,按钮3获取事件,它将设置回canvas的光标为'auto'(这将覆盖两个第一的操作)

因此,目前,只有最后创建的按钮很重要。

这是一把正在工作的小提琴。我在Button构造函数中添加了一个布尔值,这样每个按钮只有在光标之前位于canvas的顶部时才会将其设置回