【问题标题】:Update canvas on mouse events更新鼠标事件的画布
【发布时间】:2016-04-08 12:19:44
【问题描述】:

我使用this JS library 创建了一个六边形网格。网格确实被正确地绘制到了画布上。我的问题是尝试在鼠标事件上引入事件。例如,当我将鼠标悬停在某个六边形上时,我希望它的背景颜色发生变化。

目前,无论光标悬停在哪个六边形上,mouseover 上只有最后创建的六边形会发生变化。如何让事件监听器更新光标所在的特定六边形?

如果由于绘制的对象被“光栅化”到画布中而无法做到这一点,建议采用什么替代方法?

代码如下:

<canvas id="stage"></canvas>
<script>
  var element        = document.getElementById("stage");
      element.height = window.innerHeight;
      element.width  = window.innerWidth;

  var stage   = new createjs.Stage("stage");
      stage.x = window.innerWidth/2;
      stage.y = window.innerHeight/2;
      stage.enableMouseOver();

  var grid             = new Grid();
      grid.tileSize    = 55;

  var stageTransformer = new StageTransformer().initialize({ element: element, stage: stage });
  stageTransformer.addEventListeners();

  var tick = function (event) { stage.update(); };
  var colorHexagon = function(hexagon, fill) {
    hexagon.graphics
      .beginFill(fill)
      .beginStroke("rgba(50,50,50,1)")
      .drawPolyStar(0, 0, grid.tileSize, 6, 0, 0);
  };

  var coordinates = grid.hexagon(0, 0, 3, true)
  for (var i = 0; i < coordinates.length; i++) {
    var q = coordinates[i].q,
        r = coordinates[i].r,
        center = grid.getCenterXY(q, r),
        hexagon = new createjs.Shape();
        hexagon.cursor = "pointer";

    hexagon.addEventListener("mouseover", function() {
      colorHexagon(hexagon, "rgba(50,150,0,1)")
    });

    hexagon.addEventListener("mouseout", function() {
      colorHexagon(hexagon, "rgba(150,150,150,1)")
    });

    hexagon.q = q;
    hexagon.r = r;
    hexagon.x = center.x;
    hexagon.y = center.y;

    colorHexagon(hexagon, "rgba(150,150,150,1)");

    stage.addChild(hexagon);
    stage.update();
  }

  tick();
  createjs.Ticker.setFPS(30);
  createjs.Ticker.addEventListener("tick", tick);
</script>

【问题讨论】:

    标签: javascript canvas hexagonal-tiles


    【解决方案1】:

    这应该可行。

    stage.addEventListener("mouseover", function(evt) {
      colorHexagon(evt.target, "rgba(50,150,0,1)")
    });
    
    stage.addEventListener("mouseout", function(evt) {
      colorHexagon(evt.target, "rgba(150,150,150,1)")
    });
    

    您可以将它们放在脚本的最底部。它们不必处于循环中。

    【讨论】:

      【解决方案2】:

      将您的事件处理程序绑定到六边形的容器,而不是分别绑定到每个六边形,然后使用鼠标的坐标找到悬停的六边形。并检查图书馆的文档,也许他们有一个包含的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2012-11-28
        • 1970-01-01
        • 2014-05-29
        • 2015-11-03
        • 2013-01-13
        相关资源
        最近更新 更多