首页 > 其他分享 >canvas实现星空动画

canvas实现星空动画

时间:2023-10-10 23:22:05浏览次数:34  
标签:动画 canvas const 星空 random blinkCount any Math

效果

  • 大概就是星星的运动轨迹是一个椭圆形的面,逆时针旋转,会随机眨眼睛,随机速度,随机运动半径(但是运动轨迹导致椭圆中心的点最密集),不会录制gif,暂不放图

实现

  • 每颗星星都有自己的属性,所以需要封装
export class Star {
  radius: any
  w: any
  h: any
  timePassed: any
  speed: any
  dis: any
  blinkCount: any

  constructor(w: any, h: any, count: any){
    // 星星大小
    this.radius = Math.random() * 1.5 + 0.1 ;
    this.w = w;
    this.h = h;
    // 星星移动速度
    this.timePassed = Math.random() * count;
    this.speed = Math.random() / 800;
    this.dis = Math.random()
    this.blinkCount = Math.floor(Math.random() * 500)
  }

  draw(ctx: any) {
    ctx.beginPath()
    const x = Math.sin(this.timePassed) * this.w * this.dis + this.w / 2;
    const y = Math.cos(this.timePassed) * this.h * this.dis + this.h / 2;
    // const opacity = Math.random() < 0.1 ? 
    const opacity = this.blinkCount > 20 ? this.dis : Math.abs(this.blinkCount - 10) / 20
    ctx.fillStyle = `rgba(255,255,255,${opacity})`
    ctx.arc(x, y, this.radius, 0, Math.PI * 2);
    ctx.fill();
    ctx.closePath();
    this.blinkCount = (this.blinkCount + 1) % 500
    this.timePassed += this.speed;
  }
}
  • 然后生成多个星星,并开启动画
initStarSky() {
  const dom = document.getElementById('canvas') as HTMLCanvasElement
  dom.width = window.innerWidth
  dom.height = window.innerHeight
  this.canvas = dom.getContext('2d')
  const w = dom.width
  const h = dom.height
  for(let i = 0; i < this.starCount; i++) {
    const star = new Star(w, h, this.starCount)
    this.stars.push(star)
  }
  this.starSkyTimer = setInterval(() => {
    this.canvas.clearRect(0, 0, w, h)
    this.stars.forEach(item => {
      item.draw(this.canvas)
    })
  }, 50)
}

标签:动画,canvas,const,星空,random,blinkCount,any,Math
From: https://www.cnblogs.com/mizuki-vone/p/17756022.html

相关文章

  • 【动画进阶】神奇的背景,生化危机4日食 Loading 动画还原
    最近,在Steam玩一款老游戏(生化危机4重置版),其中,每当游戏转场的过程中,都有这么一个有趣的Loading动画:整个效果有点类似于日食效果,中间一圈黑色,向外散发着太阳般的光芒。本文,我们将尝试使用CSS,还原这个效果。整个效果做出来,类似于如下两个动画效果这样:实现主体效果其实......
  • 金蝶云星空插件项目新建类不写public修饰符的问题
     当类不屑修饰符时,生成dll后,bos平台注册时无法显示刚创建的类,也就无法选择。如下图:  结论:声明命名空间、类,前面不加限制访问修饰符时,默认访问权限为internal——访问仅限于当前程序集。 添加public修饰符后, 如图所见,可以选择到我们的目的类了。 完美。......
  • canvas实现睡眠波
    成果产品借鉴(抄袭)了华为运动健康App上对用户睡眠数据的展示,要我们也实现这种效果。App开发的同事虽然做出了一点样子,但是有点小丑,担子落到了web的头上(虽然笔者实现的效果也没有华为的好,但是还看的过去)分析与实现图形图形有点折线图和柱状图结合的意思,但是两者都不是,作为w......
  • 前端canvas实现签名功能,可以横屏/竖屏签名
    页面展示效果,点保存后生成图片链接图片链接展示效果这里只展示了竖屏签名效果,横屏自己粘贴代码测试css.box{width:98%;display:flex;flex-direction:column;margin:auto;}.canvasbox{width:100%;border:1pxsolid#bbb;margin:0auto;overflow:hidden;}canvas......
  • 小程序技术未来发展的思考 - 高级动画和效果
    微信小程序、支付宝小程序等已经成为移动应用开发的主要方式之一,而动画和特效是提高用户体验和吸引用户的重要因素之一。未来的小程序技术将继续发展,提供更高级的动画和效果功能,以满足开发者的创意和用户的需求。在本文中,我们将探讨小程序技术在高级动画和效果方面的发展趋势,并提供......
  • 题解 P9697【[GDCPC2023] Canvas】
    好题。后面的操作会覆盖前面的操作,这东西不好处理,我们不妨时光倒流,将问题转化为一个位置一旦被填了数,就再也不会变了。如果解决了这个问题,只需将操作序列倒过来,就得到了原问题的解。显然,所有\(x_i=y_i=2\)的操作会最先被执行,所有\(x_i=y_i=1\)的操作会最后被执行。只需要给......
  • HTML Canvas 画布
      HTML <canvas>画布元素用于通过脚本(通常是JavaScript)动态绘制图形。 <canvas> 画布元素只是图形的容器。您必须使用脚本来实际绘制图形。 <canvas>有几种用于绘制路径、框、圆、文本和添加图像的方法。绘制canvas<!DOCTYPEhtml><htmllang="en"><head><met......
  • [官方培训]08-UE动画基础 戴浩军 Epic 笔记
    UE动画基础UE动画概述UE动画功能强大,复杂,灵活不同类型项目对动画系统应用范围各不相同“动画”作为一个宽泛概念,在引擎中有多种实现方式,需要灵活选择影视CG相关常见动画种类浏览骨骼网格体动画(动画序列,变形目标,动画曲线,PoseAsset)物理动画(刚体,布料,破碎,实时毛发模拟)顶点......
  • 【前端动画】—— 再看tweenJS
    16开始接触前端,一直对一个问题特别感兴趣,那就是js动画,也就是从那时起开始探究动画的各种表现形式,也是那个时候开始意识到编程这块东西最终考验的就是抽象和逻辑,而这一切完全是数学里边的东西。最早接触tweenJS是去年还是前年来着有点忘了,不过当时有点不大看得懂,勉勉强强算是过了一......
  • 【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器
    【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器@AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。​●......