1 回答

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>
添加回答
舉報(bào)