【发布时间】:2017-05-31 20:31:21
【问题描述】:
我有一个画布,里面有一个板/网格。当用户在网格的交叉点上突出显示他们的鼠标时,我希望它显示他们的游戏将去哪里。当电路板与画布的确切尺寸相同时,这非常有效。我一直把它变小x。
如下图所示,绿色表示画布,网格表示板。我将光标放在绿色的右下角以显示它何时触发。唯一可以正常工作的是中间那个,因为不管我把板子做多大,中间永远是中间。
任何简单的解决方法就是使用鼠标悬停事件创建区域,板的尺寸而不是画布,但事件侦听器位于画布上。我的代码在图片下方
变量:
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;
}
我留下了一些东西,比如网格如何刷新,所以它不是跟随你的鼠标和东西的一串圆圈,为了让它尽可能短,我希望它只是一个简单的 asnwer,没有人需要重新创建它但是如果你这样做,我可以包含刷新网格并绘制所有内容的功能。谢谢你的任何建议
【问题讨论】:
标签: javascript html canvas