我有一個畫布,裏面有一個板/網格。當用戶在網格的交叉點上突出顯示他們的鼠標時,我希望它顯示他們的遊戲peice將要去的地方。當電路板是畫布的確切尺寸時,這非常合適。我一直讓它稍微小一點。獲取畫布內的矩形的光標位置
因此,您可以在下面的圖片中看到,綠色顯示畫布,網格是董事會。我將光標放在綠色的右下角以顯示觸發時間。唯一能夠正常工作的是中間一個,因爲不管我做多少板子,中間都是中間的。
任何簡單的解決方法只是使用鼠標懸停事件來創建區域,而不是畫布的板的尺寸,但事件偵聽器位於畫布上。我的代碼是下面的圖像
變量:
var canvas = document.getElementById("game-canvas");
var context = canvas.getContext("2d");
var boardSize = 13;
var border = canvas.width/20;
var boardWidth = canvas.width - (border * 2);
var boardHeight = canvas.height - (border * 2);
var cellWidth = boardWidth/(boardSize - 1);
var cellHeight = boardHeight/(boardSize - 1);
var lastX;
var lastY;
鼠標懸停事件:
canvas.addEventListener('mousemove', function(evt)
{
var position = getGridPoint(evt);
if ((position.x != lastX) || (position.y != lastY))
{
placeStone((position.x * cellWidth) + border, (position.y * cellWidth) + border, 'rgba(0, 0, 0, 0.2)');
}
lastX = position.x;
lastY = position.y;
});
獲取對電網的點並將其轉換成數字0 - 13 (在這種情況下)
function getGridPoint(evt)
{
var rect = canvas.getBoundingClientRect();
var x = Math.round((evt.clientX-rect.left)/(rect.right-rect.left)*boardWidth);
var y = Math.round((evt.clientY-rect.top)/(rect.bottom-rect.top)*boardHeight);
var roundX = Math.round(x/cellWidth);
var roundY = Math.round(y/cellHeight);
return {
x: roundX,
y: roundY
};
}
最後借鑑了板件:
function placeStone(x, y, color)
{
var radius = cellWidth/2;
context.beginPath();
context.arc(x, y, radius, 0, 2 * Math.PI, false);
context.fillStyle = color;
context.fill();
context.lineWidth = 5;
}
我留下了幾個位出怎麼樣的電網refreshs所以它不是圓的字符串後面你的鼠標之類的東西,保持它短,因爲我可以,即時通訊希望它只是一個簡單的asnwer,沒有人需要重新創建它,但如果你這樣做,我可以包含刷新網格並繪製所有內容的函數。三江源的任何建議
我想我明白你這意味着,只需將原點(0,0)移至框的原點即可。 - 改變了這個'var x = Math.round((evt.clientX-rect.left) - border /(rect.right-rect。左)* boardWidth);'所以它包括 - 邊界,它似乎工作正常,我有一種感覺我錯過了一些東西,但生病找到它,謝謝:) –