gpt4 book ai didi

javascript - 检测用户是否单击 Canvas 内的任何圆圈

转载 作者:行者123 更新时间:2023-12-03 05:37:43 24 4
gpt4 key购买 nike

作为我的 previous question 的补充,现在,我正在尝试检测用户是否单击了任何创建的圈子。

当用户按键时,我正在创建 Node 对象。

jQuery(document).ready(function() {
$('#canvas').attr('height', $('#canvas').css('height'));
$('#canvas').attr('width', $('#canvas').css('width'));
var x = -1;
var y = -1;
var V = [];

function Node(id) {
var _this = this;

// constructor
(function() {
_this.x = x || null;
_this.y = y || null;
_this.id = id || null;
_this.clicked = false;

})();

this.draw = function(ctx) {
ctx.beginPath();
ctx.arc(x, y, 20, 0, 2 * Math.PI);
ctx.font = '16pt Calibri';
ctx.fillStyle = 'black';
ctx.textAlign = 'center';
ctx.fillText(id, x, y+3);

ctx.stroke();
V.push(v);
}

this.clicked = function(e) {
var xDif = e.offsetX - _this.x;
var yDif = e.offsetY - _this.y;
var d = Math.sqrt((xDif*xDif) + (yDif*yDif));
if(d < 20) return true;
else return false;

}

this.update = function() {
_this.x = x;
_this.y = y;

}
}
var overCanvas = false;
$('#canvas').mouseover(function() {
overCanvas = true;
});
$('#canvas').mouseleave(function() {
overCanvas = false;
});
$("#canvas").mousemove(function(e) {
x = e.offsetX;
y = e.offsetY;
$('#status').html(x + ', ' + y);
});
$(document).keypress(function(e) {

if (!overCanvas) {
return;
}
var id = -1;
switch(e.keyCode)
{
case 97:
case 49: id = '1'; break
case 98:
case 50: id = '2'; break;
case 99:
case 51: id = '3'; break;
case 100:
case 52: id = '4'; break;
case 101:
case 53: id = '5'; break;
case 102:
case 54: id = '6'; break;
case 120:
case 88: id = 'x'; break;
default: return;
}

var v = new Node(id);
v.draw(canvas.getContext("2d"));
});

然后,我想知道用户是否单击了任何对象。为了实现这一点,我使用一个简单的循环:

$('#canvas').mousedown(function() {
for(var i = 0; i < V.length; i++)
{

if(V[i].clicked())
{
$('#clicked').html(V[i].id);
V[i].update();
V[i].draw(canvas.getContext("2d"));
}
}

});

在以下 html 中不会执行任何操作:

<body> 
<h2 id="status">0, 0</h2>
<h2 id="clicked">init</h2>
<canvas style="width: 1000px; height: 1000px; border:1px ridge green;" id="canvas">

</canvas>
</body>

我认为我计算的距离没有错误。我认为我错过了一些要点(也许是在返回 truefalse 时?)。

我想要做的事情是能够单独拖动每个圆圈。

最佳答案

您的代码中存在一些错误:

行:

V.push(v);

Node.draw() 中的内容应在节点创建后移至此处:

var v = new Node(id);
v.draw(canvas.getContext("2d"));
V.push(v);

此外,您的 mousedown 事件处理程序实际上并未获取对该事件的引用,您需要:

    $('#canvas').mousedown(function(e) {
for(var i = 0; i < V.length; i++)
{
if(V[i].clicked(e))
{
$('#clicked').html(V[i].id);
V[i].update();
V[i].draw(canvas.getContext("2d"));
}
}

});

Fiddle

关于javascript - 检测用户是否单击 Canvas 内的任何圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40659556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com