圣诞节星星飘落的效果(微信小程序版)

news2024/9/29 13:27:08

圣诞节快到啦~🎄🎄🎄🎄咱们也试着做做小程序版本的星星✨飘落效果吧
在微信小程序内如何实现雪花飘落,星星飘落的效果呢~
先来个效果图:

1576672109245.gif

一步一步来:
页面内容wxml,先简单切个图吧。

<view class="container">
  <image src="https://qiniu-image.qtshe.com/merry_001.jpg" mode="widthFix"/>
  <image src="https://qiniu-image.qtshe.com/merry_02.jpg" alt="" mode="widthFix"/>
  <image src="https://qiniu-image.qtshe.com/merry_03.jpg" alt="" mode="widthFix"/>
  <image src="https://qiniu-image.qtshe.com/merry_04.jpg" alt="" mode="widthFix"/>
  <image src="https://qiniu-image.qtshe.com/merry_05.jpg" alt="" mode="widthFix"/>
  <image src="https://qiniu-image.qtshe.com/merry_06.jpg" alt="" mode="widthFix"/>
  <image src="https://qiniu-image.qtshe.com/merry_07.jpg" alt="" mode="widthFix"/>
</view>
<canvas  canvas-id="myCanvas" />

页面样式wxss,因为切片用的不太熟练,图片之间有个2rpx的空隙。

.container {
  height: 100%;
  box-sizing: border-box;
  min-height: 100vh;
}

image {
  width: 100%;
  display: block;
  margin-top: -2rpx;  //不会切图造的孽
}

canvas {
  width: 100%; 
  min-height:100vh; 
  position: fixed;
  top: 0;
  z-index: 888;
}

重点JS:

//获取应用实例
const app = getApp()
// 存储所有的星星
const stars = []
// 下落的加速度
const G = 0.01
const stime = 60

// 速度上限,避免速度过快
const SPEED_LIMIT_X = 1
const SPEED_LIMIT_Y = 1

const W = wx.getSystemInfoSync().windowWidth
const H = wx.getSystemInfoSync().windowHeight
const starImage = 'https://qiniu-image.qtshe.com/WechatIMG470.png' //星星素材

Page({
  onLoad() {
    this.setAudioPlay()
  },
  onShow() {
    this.createStar()
  },
  createStar() {
    let starCount = 350 //星星总的数量
    let starNum = 0 //当前生成星星数
    let deltaTime = 0
    let ctx = wx.createCanvasContext('myCanvas')
    let requestAnimationFrame = (() => {
      return (callback) => {
        setTimeout(callback, 1000 / stime)
      }
    })()
    starLoop()

    function starLoop() {
      requestAnimationFrame(starLoop)
      ctx.clearRect(0, 0, W, H)
      deltaTime = 20 //每次增加的星星数量
      starNum += deltaTime
      if (starNum > starCount) {
        stars.push(
          new Star(Math.random() * W, 0, Math.random() * 5 + 5)
        );
        starNum %= starCount
      }
      stars.map((s, i) => { //重复绘制
        s.update()
        s.draw()
        if (s.y >= H) { //大于屏幕高度的就从数组里去掉
          stars.splice(i, 1)
        }
      })
      ctx.draw()
    }

    function Star(x, y, radius) {
      this.x = x
      this.y = y
      this.sx = 0
      this.sy = 0
      this.deg = 0
      this.radius = radius
      this.ax = Math.random() < 0.5 ? 0.005 : -0.005
    }

    Star.prototype.update = function() {
      const deltaDeg = Math.random() * 0.6 + 0.2

      this.sx += this.ax
      if (this.sx >= SPEED_LIMIT_X || this.sx <= -SPEED_LIMIT_X) {
        this.ax *= -1
      }

      if (this.sy < SPEED_LIMIT_Y) {
        this.sy += G
      }

      this.deg += deltaDeg
      this.x += this.sx
      this.y += this.sy
    }

    Star.prototype.draw = function() {
      const radius = this.radius
      ctx.save()
      ctx.translate(this.x, this.y)
      ctx.rotate(this.deg * Math.PI / 180)
      ctx.drawImage(starImage, -radius, -radius * 1.8, radius * 2, radius * 2)
      ctx.restore()
    }
  },
  setAudioPlay() {
    const adctx = wx.createInnerAudioContext()
    adctx.autoplay = true
    adctx.loop = true
    adctx.src = 'https://dn-qtshe.qbox.me/Jingle%20Bells.mp3'
    adctx.onPlay(() => {
      console.log('开始播放')
      adctx.play()
    })
  }
})

以上只是简单实现了一个星星飘落的效果,预览的时候需要开启不校验合法域名哦~
目前还有更优的h5版本,使用Three.js实现的,在小程序内使用Three.js对于我来说有点打脑壳,先把效果分享出来吧。圣诞快乐

如果有需要的可以留言,我可以整理下发源码给你。



作者:人类进化又没带我
链接:https://www.jianshu.com/p/30d2e487f393
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【稳定ACM出版、EI检索|武汉场线上线下结合】2024年第五届医学人工智能国际学术会议(ISAIMS 2024,8月13-17)

第五届医学人工智能国际学术会议&#xff08;ISAIMS2024&#xff09;将于2024年8月13-17日于荷兰阿姆斯特丹自由大学召开&#xff0c;国内分会场将于2024年10月25-27日于中国武汉召开。 本届会议将继续围绕人工智能在医学领域的最新研究成果&#xff0c;为来自国内外高等院校、…

智能化的Facebook未来:AI如何重塑社交网络的面貌?

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;社交网络的面貌正在经历深刻的变革。Facebook&#xff08;现Meta Platforms&#xff09;作为全球最大的社交媒体平台之一&#xff0c;正积极探索如何利用AI技术来提升用户体验、优化内容管理并推动平台创新。…

全红婵夺冠后答记者问,太风趣了

8月6日晚&#xff0c;在巴黎结束的跳水女子10米台比赛中&#xff0c;17岁的中国选手全红婵以425.60分的高分成功卫冕&#xff0c;帮助中国代表团获得第22枚金牌。赛后采访时有记者想煽情&#xff0c;故意问到全红婵的哥哥来现场为她加油&#xff0c;结果小女子竟然毫无表情地回…

【python】Pandas处理Excel表格用法分析与最佳实践

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

AI大模型03:Function Calling

接口Interface &#xff08;1&#xff09;人际交互接口 UI &#xff08;User Interface&#xff09; &#xff08;2&#xff09;应用程序编程接口 API &#xff08;Application Programming Interface&#xff09; 接口能通的关键&#xff1a;是两方都要遵守约定。 &#xff0…

EI检索,2天录用,3天见刊!截稿在即,这本水刊你还不投吗?

点击关注&#xff1a;关注GZH【欧亚科睿学术】&#xff0c;GET完整版2023JCR分区列表&#xff01; &#x1f389; &#x1f389; &#x1f389; &#x1f389; 恭喜&#xff01;这本毕业水刊仅2天录用&#xff01;3天见刊&#xff01; 重要时间节点如下 2024-08-03 Sub…

360安全大模型为什么是“非卖品”?

大模型虽然不是万能的&#xff0c;但是没有大模型又是万万不能的。以AI大模型为动力引擎&#xff0c;AI正在重塑各行各业&#xff0c;并快速“飞入寻常百姓家”。 AI安全 以“模”制“模” 2024年全国两会&#xff0c;“人工智能”首次被写入政府工作报告。报告中提出&#xff…

Vue3 搭建前端工程,并使用idea配置项目启动

1 下载node.js 先下载 node.js LTS 并安装&#xff1a;node.js 的 npm&#xff0c;用于管理前端项目包依赖&#xff0c;这里以 14.17.3 这个版本为例。如果已经安装过 node.js&#xff0c;可以在设置中找到应用&#xff0c;点进去搜索 node.js 即可卸载 node.js 14.17.3 安装…

人生感悟|该如何最大化提升个人价值?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 你肯定也听到过这个观点&#xff1a;人际关系的本质是价值交换&#xff0c;社会的本质就是价值互换。 我们立足社会&#xff0c;无论是上班还是创业&#xff0c;本质上都是在互换价值。 那么我们该如何最大化提升我…

Linux IPC-管道

前言 前面我们已经对进程概念、进程控制做了介绍&#xff01;本期开始将来介绍进程的最后一章进程间通信&#xff0c;即如何让两个进程进行通信&#xff01;本博客主要介绍管道&#xff01; 本期内容介绍 • 初识进程间通信 • 管道 一、初识进程间通信 1、进程间通信的概念…

基于Java+SpringBoot+Vue的教师工作量管理系统

基于JavaSpringBootVue的教师工作量管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345…

OpenAi not returning result and exited with code=0

题意&#xff1a;OpenAi 没有返回结果&#xff0c;程序以代码 0 退出 问题背景&#xff1a; Im trying to use OpenAI, but I cant get a result. Im accessing the API via Visual Studio Code. I have downloaded these extensions for Visual Studio Code: Code Runner and…

Bash考古以及 StackOverflow的2024年度技术统计报告

0.缘起 前段时间&#xff0c;有一次调试.sh时废了好大功夫&#xff0c;单独执行各行指令&#xff0c;可以&#xff0c;但是存储为.sh就不行了&#xff0c;最终发现&#xff0c;我漏加了文件头部的那个声明&#xff1a; #!/bin/bash https://wikimili.com/en/Stephen_R._Bourne…

代发考生战报:考试通过 H12-831科目

代发考生战报&#xff1a;考试通过 H12-831科目&#xff0c;同事2人分别2天考HCIP续认证&#xff0c;考试题基本都是题库里的&#xff0c;印象有1-2个题是新题&#xff0c;也许是自己没记准&#xff0c;题库更新很及时&#xff0c;题库看会了考试很简单&#xff0c;考试半个小时…

认识Modbus RTU与Modbus TCP

&#xff08;选自成都纵横智控-Modbus RTU与Modbus TCP协议区别详解 &#xff09; Modbus RTU 和 Modbus TCP 是两种常用的工业通信协议&#xff0c;用于连接电子设备&#xff0c;但它们在多方面有所不同。以下是它们的详细比较&#xff1a; Modbus RTU 协议类型&#xff1a; …

【精通Redis】Redis持久化和复制

文章目录 前言一、Redis持久化1.1 RDB快照手动触发自动触发save和bgsave的区别 1.2 AOF持久化appendonly配置 二、Redis复制2.1 开启Redis主从复制2.2 Redis复制的启动过程 前言 本文主要讨论Redis的持久化方式和复制特性。Redis的持久化方式有两种&#xff0c;一种叫RDB&…

越秀大悦城·天悦海湾 | 繁华底色 北方头等地标

每一座骄傲的城市&#xff0c;都以奔涌向前的气魄&#xff0c;屹立时代潮头。每一处让城市仰望的居所&#xff0c;亦怀揣与城市共美好的磐心&#xff0c;以焕新的生活方式致敬理想生活家。 越秀大悦城天悦海湾&#xff0c;踞青岛北站旁创新创业活力区&#xff0c;以优越生态基…

望获实时Linux与EtherCAT的硬实时解决方案

在追求极致实时性与可靠性的工业自动化领域&#xff0c;望获实时Linux以其卓越的实时性能和广泛的兼容性&#xff0c;正逐步成为工业控制领域的核心力量。结合EtherCAT这一高效通信协议&#xff0c;我们共同打造了一套创新的硬实时工业控制方案&#xff0c;旨在满足现代工业对快…

怎样批量音频格式转换?5个方法帮你搞定

炎炎夏日的到来&#xff0c;大学生们也迎来了期盼已久的暑期生活。对于无论是计划外出旅行&#xff0c;还是宅在家中享受悠闲时光的朋友们来说&#xff0c;音乐总是不可或缺的伴侣。 然而&#xff0c;面对不同设备对音频格式的要求&#xff0c;如何轻松转换音频格式&#xff0…