我正在使用座標數組在畫布上繪製一系列點。檢查鼠標光標是否在座標數組範圍內
var points = [[102, 267], [254, 163], [343, 318], [522, 112], [610, 163], [681, 112]];
var canvas = document.getElementById('graph');
var c = canvas.getContext('2d');
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
function drawPoints(){
for (i = 0; i < points.length; i++) {
c.beginPath();
c.arc(points[i][0], points[i][1], 5, 0, 2 * Math.PI, true);
c.fillStyle = "black";
c.fill();
}
}
drawPoints();
我想寫一個函數來識別這些點,並將它們標記爲鼠標懸停在畫布上。
canvas.addEventListener('mousemove', function(evt) {
var mousePos = getMousePos(canvas, evt);
var currMouseX = mousePos.x;
var currMouseY = mousePos.y;
for (i = 0; i < points.length; i++){
if ((points[i][0] >= currMouseX-4 && points[i][0] <= currMouseX+4) && (points[i][1] >= currMouseY-4 && points[i][1] <= currMouseY+4)) {
console.log('in range of '+points[i]);
c.beginPath();
c.arc(points[i][0], points[i][1], 8, 0, 2 * Math.PI, true);
c.fillStyle = "red";
c.fill();
}
}
});
我遇到的問題是我想在鼠標光標離開點的範圍時刪除標記。
如果我在最後設置了一條簡單的else
語句,則循環僅適用於數組中的最後一個點,因爲for循環的其餘部分仍然執行。我需要檢查點是否已經命中,停止for循環,檢查鼠標是否離開了點的範圍,如果是,清除畫布並重新繪製點。
也許一個循環不是處理這個問題的最好方法,也許針/乾草堆aproach會更好地工作,但我不知道如何實現這個時,搜索範圍而不是嵌套數組內的單個值。
聽起來是資源密集的 – timo
這是,請注意,我剛剛更新了我的答案。 –
但它不是計算機上的資源密集型。你有這種循環運行每個HTML/JS遊戲,他們這樣做很好。 –