评论

如何实现圣诞节星星飘落效果

小程序简单实现星星飘落效果

圣诞节快到啦~🎄🎄🎄🎄咱们也试着做做小程序版本的星星✨飘落效果吧~

先来个效果图:

484听起来很叼,看起来也就那样。
来咱们上手开始撸

页面内容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
var starImage = '' //星星素材
wx.getImageInfo({
  src: 'https://qiniu-image.qtshe.com/WechatIMG470.png',
  success: (res)=> {
    starImage = res.path
  }
})

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() {
    let 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对于我来说有点打脑壳,先把效果分享出来吧。
h5版本,手机看效果最佳

h5源码可直接右键查看:https://qiniu-web.qtshe.com/merryChrimas.html

最后一次编辑于  2023-12-07  
点赞 28
收藏
评论

16 个评论

  • 拾忆
    拾忆
    2019-12-18
    先赞再看
    2019-12-18
    赞同 2
    回复 14
    • TNT
      TNT
      2019-12-18
      0110 0110 0110
      2019-12-18
      1
      回复
    • 拾忆
      拾忆
      2019-12-18回复TNT
      上条内容5块钱,请转账
      2019-12-18
      回复
    • TNT
      TNT
      2019-12-19回复拾忆
      已转,请查收
      2019-12-19
      2
      回复
    • 拾忆
      拾忆
      2019-12-19回复TNT
      未收到
      2019-12-19
      回复
    • TNT
      TNT
      2019-12-19回复拾忆
      直接转的银行卡。
      2019-12-19
      回复
    查看更多(9)
  • 零~
    零~
    2021-04-26

    源代码 想要一份3521684912@.qq.com

    2021-04-26
    赞同 1
    回复
  • 卫庄
    卫庄
    2020-04-10

    你这么NB,你女朋友知道嘛

    2020-04-10
    赞同 1
    回复 4
    • TNT
      TNT
      2020-04-10
      我丢~
      2020-04-10
      回复
    • 奇迹
      奇迹
      2021-03-25
      如何,说说呗
      2021-03-25
      回复
    • 奇迹
      奇迹
      2021-03-25
      点击当前星星,当前星星会爆炸的效果
      2021-03-25
      回复
    • nywhereiflow.
      nywhereiflow.
      2023-06-26回复奇迹
      哪个星星?我都点了没爆炸
      2023-06-26
      回复
  • L(~_~;)Q
    L(~_~;)Q
    2023-06-09

    求一份uniapp的代码,谢谢! 405432364@qq.com

    2023-06-09
    赞同
    回复
  • 🇱 🇮 🇫 🇪
    🇱 🇮 🇫 🇪
    2022-10-14

    2022年楼主还有源码分享吗 /dog

    15071220650@163.com

    2022-10-14
    赞同
    回复
  • 麦子
    麦子
    2021-06-08

    房东大人,请一份uniapp的。1347648285@qq.com

    非常感谢!

    2021-06-08
    赞同
    回复
  • 麦子
    麦子
    2021-06-08

    求一份源码,谢谢!

    1347648285@qq.com

    2021-06-08
    赞同
    回复
  • 奇迹
    奇迹
    2021-03-25

    点击当前星星,当前星星会爆炸的效果

    2021-03-25
    赞同
    回复
  • 奇迹
    奇迹
    2021-03-25

    我想点击星星,出现效果,怎么弄呢

    2021-03-25
    赞同
    回复 3
    • 奇迹
      奇迹
      2021-03-25回复TNT
      怎么绑定
      2021-03-25
      回复
    • 奇迹
      奇迹
      2021-03-25回复TNT
      可以帮我处理一下吗,有报酬
      2021-03-25
      回复
    • 奇迹
      奇迹
      2021-03-25回复奇迹
      977691291
      2021-03-25
      回复
  • 雨化
    雨化
    2021-01-21

    1370500483@qq.com,求h5和小程序代码,感谢

    2021-01-21
    赞同
    回复 2
    • TNT
      TNT
      2021-01-25
      已发送
      2021-01-25
      回复
    • 雨化
      雨化
      2021-01-25回复TNT
      收到,感谢大佬
      2021-01-25
      回复

正在加载...

登录 后发表内容