gpt4 book ai didi

javascript - 如何使用类和函数为 html5-canvas 上的多个对象设置动画?

转载 作者:行者123 更新时间:2023-11-30 20:13:36 25 4
gpt4 key购买 nike

我想为 HTML5 Canvas 上向下移动的多个矩形制作动画。有一个类,通过它我可以通过简单地向类传递参数来轻松创建我想要的任何矩形。问题在于类和内置方法“requestAnimationFrame”,我只能为单个对象设置动画:代码如下:

function resize(canvasElement) {
window.addEventListener("resize", function () {
canvasElement.width = window.innerWidth / 3;
canvasElement.height = window.innerHeight * 0.9975;
})
}
var radius = 5;
class roundRect {
constructor(rectX, rectY, rectHeight, rectWidth, stroke, fill, c) {
c.clearRect(rectX-100, rectY-100, rectX + 100, rectY + 100);
c.beginPath();
c.strokeStyle = stroke;
c.fillStyle = fill;
c.moveTo(rectX + rectWidth/2, rectY);
c.arcTo(rectX + rectWidth, rectY, rectX + rectWidth, rectY + rectHeight, radius);
c.arcTo(rectX + rectWidth, rectY + rectHeight, rectX, rectY + rectHeight, radius);
c.arcTo(rectX, rectY + rectHeight, rectX, rectY, radius);
c.arcTo(rectX, rectY, rectX + rectWidth / 2, rectY, radius);
c.closePath();
c.fill();
c.stroke();
}
}
var rectY = 10;
function animate() {
new roundRect(10, rectY, 50, 7, "red", "red", ctx);
requestAnimationFrame(animate);
rectY++;
}
{
var canvas = document.body.querySelector("#canvasOne");
canvas.width = window.innerWidth / 3;
canvas.height = window.innerHeight * 0.9975;
resize(canvas);
var ctx = canvas.getContext("2d");
animate();
}
canvasOne {
border:1px solid black;
}
<!DOCTYPE html>
<html>
<head>
<link href="homeComing.css" rel="stylesheet" />
<meta charset="utf-8" />
<title></title>
</head>
<body>
<canvas id="canvasOne"></canvas>
<script src="homeComing.js"></script>
</body>
</html>

如果有人知道一种只需编写几行代码即可为多个对象设置动画的方法,我们将不胜感激。提前致谢!

最佳答案

在您的类(class)中,您使用 clearRect 的方式可能会删除其他对象。
只需要在外面做clear,然后你就可以得到多个矩形就好了。

这是一个非常简单的例子:

class roundRect {
constructor(rectX, rectY, rectHeight, rectWidth, stroke, fill, c) {
var radius = 5;
c.beginPath();
c.strokeStyle = stroke;
c.fillStyle = fill;
c.moveTo(rectX + rectWidth / 2, rectY);
c.arcTo(rectX + rectWidth, rectY, rectX + rectWidth, rectY + rectHeight, radius);
c.arcTo(rectX + rectWidth, rectY + rectHeight, rectX, rectY + rectHeight, radius);
c.arcTo(rectX, rectY + rectHeight, rectX, rectY, radius);
c.arcTo(rectX, rectY, rectX + rectWidth / 2, rectY, radius);
c.closePath();
c.fill();
c.stroke();
}
}

var objects = [
{x:10, y:10, speed:{x:0, y:1}, w:50, h:7, stroke:"red", fill:"red"},
{x:50, y:10, speed:{x:0.5, y:1}, w:25, h:20, stroke:"black", fill:"blue"},
{x:190, y:10, speed:{x:-0.2, y:1}, w:20, h:18, stroke:"black", fill:"lime"}
]

function animate() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (i = 0; i < objects.length; i++) {
var o = objects[i]
new roundRect(o.x, o.y, o.w, o.h, o.stroke, o.fill, ctx);
o.x += o.speed.x
o.y += o.speed.y
}
requestAnimationFrame(animate);
}

var canvas = document.body.querySelector("#canvasOne");
canvas.width = window.innerWidth / 3;
canvas.height = window.innerHeight * 0.9975;
var ctx = canvas.getContext("2d");
animate();
<canvas id="canvasOne"></canvas>

这是基于您的代码的示例,但如果您真的想用更少的代码行完成所有这些工作,您应该使用游戏引擎。

关于javascript - 如何使用类和函数为 html5-canvas 上的多个对象设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52151714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com