Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTML画布&;Javascript-悬停并单击事件_Javascript_Html_Canvas_Hover_Click - Fatal编程技术网

HTML画布&;Javascript-悬停并单击事件

HTML画布&;Javascript-悬停并单击事件,javascript,html,canvas,hover,click,Javascript,Html,Canvas,Hover,Click,下面是一个脚本,它定义了两个函数,分别绘制4个矩形按钮和1个圆形按钮。我正在尝试在按钮中实现特定的悬停和单击功能(如脚本警报中所述),但对于如何实现这一点,我有点不知所措。我尝试在每次单击时调用makeInteractiveButton()函数,但这会导致很多奇怪的重叠和延迟。我希望脚本执行以下操作: 如果圆形按钮悬停,我希望它的FillColor更改,如果单击,我希望它再次更改为代码中描述的颜色(#FFC77E表示悬停,#FFDDB0表示单击)。这只应在悬停或单击期间发生 HTML: Ja

下面是一个脚本,它定义了两个函数,分别绘制4个矩形按钮和1个圆形按钮。我正在尝试在按钮中实现特定的悬停和单击功能(如脚本警报中所述),但对于如何实现这一点,我有点不知所措。我尝试在每次单击时调用makeInteractiveButton()函数,但这会导致很多奇怪的重叠和延迟。我希望脚本执行以下操作:

如果圆形按钮悬停,我希望它的FillColor更改,如果单击,我希望它再次更改为代码中描述的颜色(#FFC77E表示悬停,#FFDDB0表示单击)。这只应在悬停或单击期间发生

HTML:


JavaScript:

var c=document.getElementById('game'),
    canvasX=c.offsetLeft,
    canvasY=c.offsetTop,
    ctx=c.getContext('2d')
    elements = [];

c.style.background = 'grey';

function makeInteractiveButton(x, strokeColor, fillColor) {
    ctx.strokeStyle=strokeColor;
    ctx.fillStyle=fillColor;
    ctx.beginPath();
    ctx.lineWidth=6;
    ctx.arc(x, 475, 20, 0, 2*Math.PI);
    ctx.closePath();
    ctx.stroke();
    ctx.fill();
    elements.push({
        arcX: x,
        arcY: 475,
        arcRadius: 20
    });
}

b1 = makeInteractiveButton(235, '#FFFCF8', '#FFB85D');

c.addEventListener('mousemove', function(event) {
    x=event.pageX-canvasX; // cursor location
    y=event.pageY-canvasY;

    elements.forEach(function(element) {
        if (x > element.left && x < element.left + element.width && 
            y > element.top && y < element.top + element.height) { // if cursor in rect
          alert('Rectangle should undergo 5 degree rotation and 105% scale');
        }
        else if (Math.pow(x-element.arcX, 2) + Math.pow(y-element.arcY, 2) < 
                 Math.pow(element.arcRadius, 2)) { // if cursor in circle
            alert('Set b1 fillColour to #FFC77E.');
        }
    });
}, false);

c.addEventListener('click', function(event) {
    x=event.pageX-canvasX; // cursor location
    y=event.pageY-canvasY;

    elements.forEach(function(element) {
        if (x > element.left && x < element.left + element.width && 
            y > element.top && y < element.top + element.height) { // if rect clicked
            alert('Move all cards to centre simultaneously.');
        }
        else if (Math.pow(x-element.arcX, 2) + Math.pow(y-element.arcY, 2) < 
                 Math.pow(element.arcRadius, 2)) { // if circle clicked
            alert('Set b1 fillColour to #FFDDB0.');
        }
    });
}, false);
var c=document.getElementById('game'),
canvasX=c.offsetLeft,
拉票,
ctx=c.getContext('2d')
元素=[];
c、 style.background='灰色';
函数makeInteractiveButton(x、strokeColor、fillColor){
ctx.strokeStyle=strokeColor;
ctx.fillStyle=fillColor;
ctx.beginPath();
ctx.线宽=6;
弧(x,475,20,0,2*Math.PI);
ctx.closePath();
ctx.stroke();
ctx.fill();
元素。推({
arcX:x,
arcY:475,
弧半径:20
});
}
b1=生成交互按钮(235'#FFFCF8','#FFB85D');
c、 addEventListener('mousemove',函数(事件){
x=event.pageX-canvasX;//光标位置
y=event.pageY-canvasY;
elements.forEach(函数(元素){
如果(x>element.left&&xelement.top&&yelement.left&&xelement.top&&y

一种方法是保留所有元素数据并编写hitTest(x,y)函数,但当您有许多复杂形状时,最好使用辅助画布以其ID而不是其中的颜色渲染元素,第二个画布中的x,y的颜色是hitted元素的ID,我应该提到的是,第二块画布是不可见的,它只是一个用于获取hitted元素的凝胶器

Github示例:

矩形hitTest的简单实现:
var Rectangle=函数(id、x、y、宽度、高度、颜色){
this.id=id;
这个.x=x;
这个。y=y;
这个。宽度=宽度;
高度=高度;
this.color=color | |'#7cf';
this.selected=false;
}
Rectangle.prototype.draw=函数(ctx){
ctx.fillStyle=this.color;
ctx.fillRect(this.x,this.y,this.width,this.height);
如果(选择此选项){
ctx.strokeStyle='red';
ctx.setLineDash([5,5]);
ctx.lineWidth=5;
ctx.strokeRect(这个.x,这个.y,这个.宽度,这个.高度);
}
}
Rectangle.prototype.hitTest=函数(x,y){

return(x>=this.x)&&&(x=this.y)&&&&(y)这篇文章听起来更像是一个编程作业,而不是一个问题。你能解释一下这段代码在做什么吗?到目前为止它有多少工作?你现在有什么问题吗?如果你在做一个游戏(我根据id猜),你可以看看pixi.js。这里有一个带有PNG和canvas的按钮示例:我也提出了一个问题,让它听起来不像是一个编程任务。我正在制作一个游戏,但我希望在没有外部库的情况下做所有事情。谢谢。你能详细说明这个问题中的代码吗?<代码的目的是什么>hitTest
函数表示“每当发生任何事件时,重新绘制画布”?这对于识别单击很有效,但我正在努力更改悬停时的颜色。请参见。只需向Rectangle类添加所选属性,并在draw方法中使用它,就像我所做的一样,我对代码进行一些更改,再次运行代码段Hanks!如果可以nge你的代码,这样当你停止在对象上悬停时,悬停边界就会消失。我接受这个答案。我只是删除了一个条件,它工作得很好,我写的github链接中还有一个高级的例子。
var c=document.getElementById('game'),
    canvasX=c.offsetLeft,
    canvasY=c.offsetTop,
    ctx=c.getContext('2d')
    elements = [];

c.style.background = 'grey';

function makeInteractiveButton(x, strokeColor, fillColor) {
    ctx.strokeStyle=strokeColor;
    ctx.fillStyle=fillColor;
    ctx.beginPath();
    ctx.lineWidth=6;
    ctx.arc(x, 475, 20, 0, 2*Math.PI);
    ctx.closePath();
    ctx.stroke();
    ctx.fill();
    elements.push({
        arcX: x,
        arcY: 475,
        arcRadius: 20
    });
}

b1 = makeInteractiveButton(235, '#FFFCF8', '#FFB85D');

c.addEventListener('mousemove', function(event) {
    x=event.pageX-canvasX; // cursor location
    y=event.pageY-canvasY;

    elements.forEach(function(element) {
        if (x > element.left && x < element.left + element.width && 
            y > element.top && y < element.top + element.height) { // if cursor in rect
          alert('Rectangle should undergo 5 degree rotation and 105% scale');
        }
        else if (Math.pow(x-element.arcX, 2) + Math.pow(y-element.arcY, 2) < 
                 Math.pow(element.arcRadius, 2)) { // if cursor in circle
            alert('Set b1 fillColour to #FFC77E.');
        }
    });
}, false);

c.addEventListener('click', function(event) {
    x=event.pageX-canvasX; // cursor location
    y=event.pageY-canvasY;

    elements.forEach(function(element) {
        if (x > element.left && x < element.left + element.width && 
            y > element.top && y < element.top + element.height) { // if rect clicked
            alert('Move all cards to centre simultaneously.');
        }
        else if (Math.pow(x-element.arcX, 2) + Math.pow(y-element.arcY, 2) < 
                 Math.pow(element.arcRadius, 2)) { // if circle clicked
            alert('Set b1 fillColour to #FFDDB0.');
        }
    });
}, false);