如何动画的不透明的星星画在画布上?我在试图在一座山后面画多颗星星。到目前为止,我能想到两个选择。
我有两个问题。
window.requestAnimationFrame(this.animate);,我尝试使用setInterval,但是动画并不像requestAnimationFrame那么流畅这是在react组件的内部编写的。
// Animation Loop
animate = () => {
window.requestAnimationFrame(this.animate);
this.c.clearRect(0, 0, this.canvas.width, this.canvas.height);
// fill background
this.c.fillStyle = this.backgroundGradient;
this.c.fillRect(0, 0, this.canvas.width, this.canvas.height);
// createmountainRange
this.createMountainRange(1, this.canvas.height - 50, "#384551");
this.createMountainRange(2, this.canvas.height - 150, "#2B3843");
this.createMountainRange(3, this.canvas.height - 250, "#26333E");
this.backgroundStars.forEach(backgroundStar => {
this.draw(backgroundStar);
});
};
//draw function
draw = star => {
const opacity = 1 / utils.randomIntFromRange(1, 10);
this.c.save() // only affects code in between
this.c.beginPath();
this.c.arc(star.x, star.y, star.radius, 0, Math.PI * 2, false);
this.c.fillStyle = `rgba(227, 234, 239, ${opacity})`
this.c.shadowColor = '#e3eaef'
this.c.shadowBlur = 20
this.c.fill();
this.c.closePath();
this.c.restore()
console.log('opacity', opacity)
};发布于 2019-08-22 19:03:48
source * (1 - factor) + target * factor,或查找公式)在原始不透明度和新不透明度之间逐步过渡。一个单独的画布方法可以使用,但只有当你希望所有的恒星有完全相同的阿尔法在任何给定的点;
您可能可以使用globalAlpha,而不是缝纫新的fillStyle在每次抽签,这也可能看起来更好的阴影。
发布于 2019-08-22 19:19:57
您的动画函数有一个框架参数,可以与sin函数一起使用以添加闪烁效果,我需要更多的代码来检查是否有一个精确的解决方案,但是您可以尝试这样的方法:
// Animation Loop
animate = (frame) => {
window.requestAnimationFrame(this.animate);
this.c.clearRect(0, 0, this.canvas.width, this.canvas.height);
// fill background
this.c.fillStyle = this.backgroundGradient;
this.c.fillRect(0, 0, this.canvas.width, this.canvas.height);
// createmountainRange
this.createMountainRange(1, this.canvas.height - 50, "#384551");
this.createMountainRange(2, this.canvas.height - 150, "#2B3843");
this.createMountainRange(3, this.canvas.height - 250, "#26333E");
this.backgroundStars.forEach((backgroundStar, i) => {
this.draw(backgroundStar, i, frame || 0);
});
};
//draw function
draw = (star, index, frame) => {
const opacity = Math.sin(index * frame * 0.01);
this.c.save() // only affects code in between
this.c.beginPath();
this.c.arc(star.x, star.y, star.radius, 0, Math.PI * 2, false);
this.c.fillStyle = `rgba(227, 234, 239, ${opacity})`
this.c.shadowColor = '#e3eaef'
this.c.shadowBlur = 20
this.c.fill();
this.c.closePath();
this.c.restore()
console.log('opacity', opacity)
};https://stackoverflow.com/questions/57615384
复制相似问题