我必须从左到右以及从右到左创建一个移动矩形。
我想在矩形每经过20个像素后将矩形的颜色更改为随机颜色。当矩形在右侧时,其大小将更改为100px
,而在左侧时,其大小将返回至50px
。
现在我有:
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
x = 0,
last = performance.now();
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
function draw(timestamp) {
requestAnimationFrame(draw);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.rect(x, 50, 50, 50);
ctx.fillStyle = "#ffffff";
ctx.fill();
x += (timestamp - last) / 10;
last = timestamp;
}
requestAnimationFrame(draw);
感谢您的提前解答!
答案 0 :(得分:1)
您需要做一些事情。首先,您需要为每件可能发生变化的事物创建变量。这包括框的size
,框的color
和框的dir
部分:
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
x = 0,
size = 50,
dir = 1,
boxColor = "#ffffff",
last = performance.now();
变量dir
是1
,这意味着它将采用框的当前方向并乘以1
。如果要更改框的方向,我们需要从x
中减去。这意味着我们需要在每次框碰到右墙时将dir
更改为-1
,并在框碰到左墙时将其更改回1
。
为此,我们可以添加一个名为bounce
的辅助函数,该函数检查框的宽度+框的大小是否超过了画布的宽度。如果是这样,我们知道盒子已经超出了画布容器的右侧。因此,我们可以将盒子的方向更改为-1
。我们还可以将盒子的位置重新定位在墙的外面,以防盒子在移动时能够夹入墙中。我们可以应用相同的逻辑来检查框是否超过画布的左边缘。在此检查过程中,我们还可以更改框的size
,使其在碰到右壁时增大,而在碰到左壁时收缩:
function bounce() {
if(x+size > canvas.width) { // if right edge passes the widtth of the canvas, change the dir
dir *= -1;
size = 100;;
x = canvas.width-size; // move the box outside of the wall (boundary)
} else if(x < 0) {
dir *= -1;
size = 50;
x = 0;
}
}
因此,我们还必须将x
公式中的更改更改为:
x += dir*(timestamp - last) / 10;
最后,我们需要添加一种方法来更改盒子的颜色。这可以通过对%
位置取模(x
)来完成。如果x % 20
等于0
,我们知道盒子位于x
的位置,该位置是20
的倍数,因此我们更改其颜色。但是,由于x
的位置不会每次都1
改变,因此在执行此检查之前,我们需要四舍五入x
。此外,我们需要留出一点余地,因为我们可能会跳过20
th 像素,因此不会得到20的倍数,因此,我们可以使用{{ 1}}作为我们的支票。 (注意:这不是完美的检查,但这是我目前能提出的最好的方法:/):
<=1
请参见以下示例:
function color() {
if(Math.round(x) % 20 <= 1 ) { // if the x divide 20 gives a remainder of 0
var r = Math.floor(Math.random() * 255);
var g = Math.floor(Math.random() * 255);
var b = Math.floor(Math.random() * 255);
boxColor = "rgb(" +r +", " +g +", " +b +")";
} else {
console.log(Math.round(Math.abs(x)) % 20);
}
}
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
x = 0,
size = 50,
dir = 1,
boxColor = "#ffffff",
last = performance.now();
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
function draw(timestamp) {
bounce();
color();
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.fillStyle = boxColor;
ctx.rect(x, canvas.height / 2 - size / 2, size, size);
ctx.fill();
x += dir * (timestamp - last) / 10;
last = timestamp;
requestAnimationFrame(draw);
}
function bounce() {
if (x + size > canvas.width) { // if right edge passes the widtth of the canvas, change the dir
dir *= -1;
size = 100;
x = canvas.width - size; // move the box outside of the wall (boundary)
} else if (x < 0) {
dir *= -1;
size = 50;
x = 0;
}
}
function color() {
if (Math.round(x) % 20 <= 1) { // if the x divide 20 gives a remainder of 0
var r = Math.floor(Math.random() * 255);
var g = Math.floor(Math.random() * 255);
var b = Math.floor(Math.random() * 255);
boxColor = "rgb(" + r + ", " + g + ", " + b + ")";
}
}
requestAnimationFrame(draw);
body {
margin: 0;
}