【问题标题】:HTML5 Canvas Question | Click TrackingHTML5 画布问题 |点击跟踪
【发布时间】:2011-10-28 02:01:38
【问题描述】:

最近,我开始涉足 HTML5 和强大的画布。但是,我正在尝试完成某件事,但我不确定处理它的最佳方法是什么。

我正在尝试制作一组​​随机生成的带有窗户的建筑物,如以下使用 div 的示例所示:

Example Using Divs

我想出的问题是我希望能够在这些建筑物的窗户中随机生成图像/内容,并且能够在单击窗口时轻松捕获,但我不知道如何开始使用画布处理它。

示例建筑:

function Building()
{
     this.floors  = Math.floor((Math.random()+1)*7); //Number of Floors
     this.windows = Math.floor((Math.random()+1)*3); //Windows per Floor
     this.height  = (this.floors*12);                //1px window padding 
     this.width   = (this.windows*12);               //1px window padding

     //Do I need to build an array with all of my windows and their locations
     //to determine if a click occurs?
}

示例窗口:

function Window(x,y)
{
     this.x = x;    //X Coordinate 
     this.y = y;    //Y Coordinate
     this.color =   //Random color from a range
     this.hasPerson //Determines if a person in is the window
     this.hasObject //Determines if an object is in the window
}

总结:我正在尝试生成带有窗户的随机建筑物,但是我不确定如何构建它们、显示它们并使用画布跟踪窗户位置。

更新:

我终于能够按照我的要求生成建筑物,但现在我需要做的就是在建筑物内生成窗户并跟踪它们的位置。

Building Generation Demo

【问题讨论】:

  • 如果有帮助,我很乐意尽可能详细说明或回答任何问题。
  • 您会考虑为此使用一张桌子吗?因为本质上,您只需要一些行和列,对吗?表格可以很好地处理 onclick 事件,无需担心。
  • @TJ,我知道有几种方法可以做到这一点。我只是想更熟悉如何使用画布。

标签: javascript jquery html canvas drawing


【解决方案1】:

使用fillRect 绘制正方形,将它们的西北点坐标存储到数组中。您还需要这些矩形的尺寸,但由于它们都是相等的正方形 - 无需将它们存储在数组中。

然后给canvas元素添加一个点击监听,通过pageX/pageY减去canvas元素的位置来检测指针的位置。

然后在每次点击时遍历矩形数组,看看它们是否包含指针的坐标:

if (((pageX > rectX && pageX < rectX + rectWidth) || (pageX < rectX && pageX > rectX + rectWidth))) &&
    ((pageY > rectY && pageY < rectY + rectHeight) || (pageY < rectY && pageY > rectY + rectHeight))) { 
    /* clicked on a window */
}

Demo.

【讨论】:

  • 当用户开始滚动页面时,这会变得非常非常棘手,甚至缩放也会影响这一点。
  • @TJHeuvel,是的,获取指针的相对位置可能很棘手,但这是另一个话题。
【解决方案2】:

实际上,您必须检查鼠标单击的位置,如果它在窗口中,则调用一些函数。是的,你需要有一个位置数组。

看看here

【讨论】:

    【解决方案3】:

    我猜如果您正在绘制窗口,您已经拥有创建画布路径的功能。
    因此您可以在所有窗口上应用isPointInPath 函数,以确定用户是否单击了窗口。

     canvasContext.beginPath()
     {
        (functions corresponding to your window path)
     }
    canvasContext.closePath()
    var isInWindow = canvasContext.isInPath(clicPosX,clicPosY);
    

    【讨论】:

    • 我是否理解正确,您必须在每次点击时重新绘制画布(这在游戏中是可以的)才能使用isPointInPath
    • 不,您只需要使用 beginPath 和 closePath 函数重新创建路径。创建路径并不意味着重绘窗口。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2014-04-06
    • 2015-01-06
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多