第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如果我有多個(gè)形狀,如何將鼠標(biāo)懸停在畫(huà)布中的形狀上并更改顏色?

如果我有多個(gè)形狀,如何將鼠標(biāo)懸停在畫(huà)布中的形狀上并更改顏色?

ITMISS 2023-07-06 10:15:19
我希望能夠?qū)⑹髽?biāo)懸停在不同的矩形上,并使矩形在懸停時(shí)改變顏色,我現(xiàn)在適用于最后一個(gè)矩形,但其他矩形被清除。這些矩形是使用類(lèi)/構(gòu)造函數(shù)、數(shù)組和循環(huán)創(chuàng)建的。代碼如下:/*Variables*/let canvas = document.querySelector('#canvas'),    ctx = canvas.getContext('2d'),    square;/*Board Class*/class Board {    constructor(startX, startY, height, width, angle) {      this.startX = startX;      this.startY = startY;      this.height = height;      this.width = width;      this.angle = angle;    }      drawBoard() {        let canvasWidth = window.innerWidth * .95,            drawWidth = canvasWidth * this.width,            drawHeight = canvasWidth * this.height,            drawStartX = canvasWidth * this.startX,            drawStartY = canvasWidth * this.startY;                square = new Path2D();        ctx.rotate(this.angle * Math.PI / 180);        square.rect(drawStartX, drawStartY, drawHeight, drawWidth);        ctx.fillStyle = 'red';        ctx.fill(square);      }  }/*Event Listener for changing rectangle color and redrawing*/  canvas.addEventListener('mousemove', function(event) {    if (ctx.isPointInPath(square, event.offsetX, event.offsetY)) {      ctx.fillStyle = 'white';     }    else {      ctx.fillStyle = 'red';      }      ctx.clearRect(0, 0, canvas.width, canvas.height);    ctx.fill(square);  });  /*Instantiate Array*/  let b = [];  /*Loop to create boards and push to array*/  for(let i = 1; i < 11; i++){    b.push(new Board(.05 * i, .25, .04, .03, 0));    }/*Function to loop through array and draw boards when page loads*/function loadFunctions(){    background.draw();    b.forEach(function(board){        board.drawBoard();    })}這是我使用 Canvas API 的第一個(gè)項(xiàng)目,它給我?guī)?lái)了很多麻煩,通常我可以通過(guò)類(lèi)/id 來(lái)識(shí)別形狀(如果它是用常規(guī) HTML 元素制作的),但我不知道從這里該去哪里。 。我嘗試循環(huán)遍歷包含主板信息的數(shù)組,但無(wú)法讓任何東西起作用。任何幫助表示贊賞!
查看完整描述

1 回答

?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

讓我們逐步檢查您的代碼,以便更好地了解正在發(fā)生的情況。


一旦您將鼠標(biāo)移到畫(huà)布上,mousemove偵聽(tīng)器就會(huì)被觸發(fā)并執(zhí)行其關(guān)聯(lián)的回調(diào)函數(shù)。


在這個(gè)回調(diào)函數(shù)中,我們會(huì)發(fā)現(xiàn)它是第一行:


if (ctx.isPointInPath(square, event.offsetX, event.offsetY)) 

所以這個(gè) if 語(yǔ)句檢查當(dāng)前鼠標(biāo)位置是否在square內(nèi)部。好吧,最大的問(wèn)題是:正方形實(shí)際上是什么?


如果我們進(jìn)一步查看您的代碼,我們會(huì)發(fā)現(xiàn)它是一個(gè)全局變量,它在 Board類(lèi)函數(shù)中獲取一些值drawBoard(),如下所示:


square = new Path2D();

square.rect(drawStartX, drawStartY, drawHeight, drawWidth);

顯然它是一個(gè)Path2D,保存著其中一個(gè)條形的矩形 - 但實(shí)際上是哪一個(gè)呢?


我們來(lái)看看這個(gè)函數(shù):


for (let i = 0; i < 10; i++) {

  b.push(new Board(0.05 * i, 0.25, 0.04, 0.03, 0));

}


function loadFunctions() {

  b.forEach(function(board) {

    board.drawBoard();

  })

}

在第一個(gè)循環(huán)中,您將使用Board的十個(gè)實(shí)例填充數(shù)組b,并且在 forEach 循環(huán)中,您將調(diào)用每個(gè) Board 的drawBoard()函數(shù)。


這是什么意思呢?是的,square將始終保留對(duì) bar 的引用,該 bar 函數(shù)上次被調(diào)用 - 它始終是數(shù)組中的最后一個(gè) Board。


總結(jié)一下:您在 mousemove 回調(diào)中檢查的唯一欄始終是數(shù)組中的最后一個(gè)欄。所以:


if (ctx.isPointInPath(square, event.offsetX, event.offsetY)) {

  ctx.fillStyle = 'white'; 

}

else {

  ctx.fillStyle = 'red';  

}  

ctx.clearRect(0, 0, canvas.width, canvas.height);

ctx.fill(square);

翻譯成簡(jiǎn)單的英語(yǔ)意味著:如果該點(diǎn)在正方形的邊界內(nèi),則將 fillStyle 設(shè)置為紅色,清除整個(gè)屏幕,然后用紅色填充一個(gè)欄。


您需要做的是檢查數(shù)組中每個(gè)Board 實(shí)例的鼠標(biāo)位置。但這并不難 - 只需將 Path2D 設(shè)為 Board 的類(lèi)變量,并在回調(diào)函數(shù)內(nèi)循環(huán)遍歷整個(gè)數(shù)組,并將鼠標(biāo)位置與每個(gè) Board 的 .square屬性進(jìn)行比較。


這是一個(gè)示例(只需單擊“運(yùn)行代碼片段”):


let canvas = document.querySelector('#canvas'),

  ctx = canvas.getContext('2d');

let b = [];


class Board {

  constructor(startX, startY, height, width, angle) {

    this.startX = startX;

    this.startY = startY;

    this.height = height;

    this.width = width;

    this.angle = angle;

    this.square = new Path2D();

  }


  drawBoard() {

    let canvasWidth = window.innerWidth * 0.95,

      drawWidth = canvasWidth * this.width,

      drawHeight = canvasWidth * this.height,

      drawStartX = canvasWidth * this.startX,

      drawStartY = canvasWidth * this.startY;


    ctx.rotate(this.angle * Math.PI / 180);

    this.square.rect(drawStartX, drawStartY, drawHeight, drawWidth);

    ctx.fillStyle = 'red';

    ctx.fill(this.square);

  }

}


canvas.addEventListener('mousemove', function(event) {

  ctx.clearRect(0, 0, canvas.width, canvas.height);

  let currentSquare;

  for (let i = 0; i < b.length; i++) {

    currentSquare = b[i].square;

    if (ctx.isPointInPath(currentSquare, event.offsetX, event.offsetY)) {

      ctx.fillStyle = 'white';

    } else {

      ctx.fillStyle = 'red';

    }

    ctx.fill(currentSquare);

  }

});


for (let i = 0; i < 10; i++) {

  b.push(new Board(0.05 * i, 0.25, 0.04, 0.03, 0));

}


function loadFunctions() {

  b.forEach(function(board) {

    board.drawBoard();

  })

}

loadFunctions();

<canvas id="canvas" width=500 height=300></canvas>


查看完整回答
反對(duì) 回復(fù) 2023-07-06
  • 1 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)