Canvas/JavaScript-鼠标单击时翻转正方形的颜色
Canvas/JavaScript - flip color of a square on mouse click
下面是创建一个由白色/黑色正方形随机填充的6x6网格的代码。当您单击一个正方形时,它会在控制台中显示给定正方形的数组中的位置。我正在努力的是,一旦你点击一个正方形,它就会翻转颜色(例如,当你点击白色正方形时,它会变成黑色,等等)。这个变化也应该更新数组,因为最后我会检查得到的图案是否有对称线。
// Create canvas
var canvas = document.getElementById('canvas');
ctx = canvas.getContext("2d");
var canvasCreate = function(w, h) {
canvas.width = w;
canvas.height = h;
};
function resetCanvas() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawGrid(genArray(6));
}
// Generate a 6x6 array of 0s or 1s
function genArray(aSize) {
a = new Array();
for (var i=0;i<aSize;i++) {
a[i] = new Array();
for (var j=0;j<aSize;j++) {
a[i][j] = Math.floor(Math.random() * 2);
}
}
return a
}
function drawGrid(arr) {
var n = 6;
for (var i=0;i<n;i++) {
for (var j=0;j<n;j++) {
ctx.beginPath();
ctx.strokeStyle = '#555';
if (arr[i][j] === 1) {
ctx.fillRect(i*50, j*50, 50, 50);
}
ctx.rect(i * 50, j * 50, 50, 50);
ctx.stroke();
}
}
// Get mouse position within canvas
function mouseClick(e) {
var mouseX, mouseY;
if(e.offsetX) {
mouseX = e.offsetX;
mouseY = e.offsetY;
}
else if(e.layerX) {
mouseX = e.layerX;
mouseY = e.layerY;
}
var gridX = Math.floor(mouseX / 50);
var gridY = Math.floor(mouseY / 50);
console.log(gridX, gridY);
var xy = arr[gridX][gridY];
if (xy == 0) {
xy = 1;
console.log("white");
}
else if (xy == 1) {
xy = 0;
console.log("black");
}
//
}
canvas.addEventListener('mousedown', mouseClick, false);
};
arr = genArray(6);
canvasCreate(300, 300);
drawGrid(arr);
以及相应的html:
<button onclick="resetCanvas()">Reset</button>
<canvas id="canvas"></canvas>
编辑:显示我尝试过的内容:
var xy = arr[gridX][gridY];
if (xy == 0) {
xy = 1;
console.log("white");
drawGrid(arr);
}
else if (xy == 1) {
xy = 0;
console.log("black");
drawGrid(arr);
}
正如您在上面看到的,数组中的位置被识别(例如(0,3)),然后值在0和1之间发生变化,整个网格应该被重新绘制。它改变了一些方块的颜色,但不是以我想要的方式。此外(点击几下后,它似乎阻塞了浏览器,表明我做错了什么
编辑2:根据下面的评论,我已将其更新为:
var xy = arr[gridX][gridY];
if (xy == 0) {
arr[gridX][gridY] = 1;
console.log("white");
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawGrid(arr);
}
else if (xy == 1) {
arr[gridX][gridY] = 0;
console.log("black");
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawGrid(arr);
}
尽管如此,它还是出现了故障,导致浏览器没有响应。
下面你会发现一些有效的代码,但让我先来看看我更改的所有内容:
-
在没有
var
的情况下,你必须有很多变量-这不是问题的根源,但尽量总是使用var
(附言:我没有仔细检查所有方法,所以再次检查) -
删除了
new Array()
的使用-再次不是问题,但尝试始终使用[]
-
与问题相关-将
mouseClick
从drawGrid
和addEventListener
中移出,因此不会在每次鼠标点击时不必要地调用它 -
与问题相关-
resetCanvas
没有真正重置任何内容,因为您忘记将新生成的数组保存在arr
变量中。 -
在
arr
中保存了1,0,而不是在xy
中 -
最后但同样重要的是,
drawGrid
只画了黑,加了白两张。并添加了有趣的颜色作为例子。如果没有这个变化,白色就会变成黑色。但黑色并没有变成白色。var canvas = document.getElementById('canvas'); var ctx = canvas.getContext("2d"); var canvasCreate = function(w, h) { canvas.width = w; canvas.height = h; }; function resetCanvas() { ctx.clearRect(0, 0, canvas.width, canvas.height); arr = genArray(6); drawGrid(arr); } // Generate a 6x6 array of 0s or 1s function genArray(aSize) { var a = []; for (i=0;i<aSize;i++) { a[i] = []; for (j=0;j<aSize;j++) { a[i][j] = Math.floor(Math.random() * 2); } } return a; } function drawGrid(arr) { var n = 6; for (var i=0;i<n;i++) { for (var j=0;j<n;j++) { ctx.beginPath(); ctx.strokeStyle = '#555'; if (arr[i][j] === 1) { ctx.fillStyle = '#faf'; ctx.fillRect(i*50, j*50, 50, 50); } else { ctx.fillStyle = '#ffa'; ctx.fillRect(i*50, j*50, 50, 50); } ctx.rect(i*50, j*50, 50, 50); ctx.stroke(); } } }; var arr = genArray(6); canvasCreate(300, 300); drawGrid(arr); // Get mouse position within canvas function mouseClick(e) { var mouseX, mouseY; if(e.offsetX) { mouseX = e.offsetX; mouseY = e.offsetY; } else if(e.layerX) { mouseX = e.layerX; mouseY = e.layerY; } var gridX = Math.floor(mouseX / 50); var gridY = Math.floor(mouseY / 50); console.log(gridX, gridY); var xy = arr[gridX][gridY]; if (xy == 0) { arr[gridX][gridY] = 1; console.log("white"); } else if (xy == 1) { arr[gridX][gridY] = 0; console.log("black"); } drawGrid(arr); } canvas.addEventListener('mousedown', mouseClick, false);
相关文章:
- 通过点击按钮翻转缩略图
- IE中的CSS翻转动画:翻转的一面显示镜像内容
- 如何在运行时在HTML5画布中绘制正方形
- IE中的CSS翻转动画:翻转的一面显示镜像内容
- webgl在一个正方形上操纵两个纹理
- CSS3卡翻转动画,检测是否不支持
- 响应正方形网格中的响应正方形网格
- 卡片翻转动画InternetExplorer11
- 如何使用拉斐尔自由变换翻转图像
- 在JQuery中将页面翻转转换为自定义url
- 只翻转一个DIV,而不是所有DIV都属于同一类
- 在悬停Jquery/cs3时通过翻转动画更改文本
- 可以't实现JavaScript翻转计数器
- 图像翻转脚本未按预期工作
- 如何使用RaphaelJS将文本元素约束在正方形中
- 鼠标悬停从元素数组启动随机翻转
- 有没有办法让 i 从翻转区域触发多个弹出框
- Jquery Mobile 中的翻转开关出错
- 从阵列中翻转调用图像
- Canvas/JavaScript-鼠标单击时翻转正方形的颜色