canvas+vue实现60帧FPS的抢金币动画(类天猫红包雨)

先看看我们要做的效果



一、canvas动画核心概念

完全没有canvas基础的同学建议先刷一下 [Canvas的基本用法 - Web API 接口参考 | MDN]

重点是理解canvas动画的基本步骤,在[基本的动画 - MDN]中,动画分为4步走


初学者可以再简单一些,我们先不管状态保存,直接两步走: 

  • 清空canvas 
  • 绘制新的一帧动画 

 用定时器或者window.requestAnimationFrame定时重复以上两步即可


二、抢金币核心原理

想象一下整个业务场景,我们先梳理出3个要解决的核心问题: 

  • 1、生成红包,这里有两种解决方案 
    •  统一生成所有的红包对象,从上到下分布在y轴,触发运动后后整体向下运动 
    •  在屏幕上方持续生成新红包对象,红包一旦生成,立刻开始运动(本次选择此方案) 
  • 2、运动,canvas动画原理 
  • 3、用户点击红包,计算是否点中红包(事件只能绑定在canvas这一层,需要根据点击位置进行计算)


三、核心功能

  • 1、预缓存图片/离屏canvas 
  • 2、canvas绘制多图,改变每一帧形成动画 
  • 3、判断点击位置,冒泡+1效果


下面都是基于vue的代码,不能直接跑的,主要用于理解核心功能

最好是自己理解核心原理后亲自动手做个最简单的demo,有助于加深理解

1、预缓存图片/离屏canvas

页面上感觉有很多很多金币在按各种角度掉落 

其实页面上一共就4种金币图片,只是他们的大小、速度不一样,看起来有每一个都不一样 

我们可以先把这4张图片全都加载好

 // 缓存几种金币图片为DOM元素,避免canvas绘制时还需要异步读取图片
loadImgs(arr) {
  return new Promise(resolve => {
    let count = 0;
    // 循环图片数组,每张图片都生成一个新的图片对象
    const len = arr.length;
    for (let i = 0; i < len; i++) {
      // 创建图片对象
      const image = new Image();
      // 成功的异步回调
      image.onload = () => {
        count++;
        arr.splice(i, 1, {
	  // 加载完的图片对象都缓存在这里了,canvas可以直接绘制
          img: image,
	  // 这里可以直接生成并缓存离屏canvas,用于优化性能,但本次不用,只是举个例子
          offScreenCanvas: this.createOffScreenCanvas(image)
        });
	// 这里说明 整个图片数组arr里面的图片全都加载好了
        if (count == len) {
          this.preloaded = true;
          resolve();
        }
      };
      image.src = arr[i].img;
    }
  });
},
复制代码

创建离屏canvas的方法如下

createOffScreenCanvas(image) {
  const offscreenCanvas = document.createElement("canvas");
  const offscreenContext = offscreenCanvas.getContext("2d");
  // 这里可以是动态宽高
  offscreenContext.width = 30;
  offscreenContext.height = 30;
  offscreenContext.drawImage(
    image,
    0,
    0
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Electron + Vue实现截图,你可以使用 Electron 中的 desktopCapturer 模块来获取屏幕截图。以下是一些步骤: 1. 在你的 Vue 组件中引入 Electron 模块: ```javascript const { desktopCapturer } = require('electron') ``` 2. 创建一个函数来获取屏幕截图。这个函数可以使用 desktopCapturer 模块来获取桌面上的媒体源并将其转换为可用的图像。在这个函数中,你可以使用 Canvas API 或其他图像处理库来对图像进行操作。 ```javascript async function captureScreen() { const sources = await desktopCapturer.getSources({ types: ['screen'] }) const source = sources[0] const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: source.id, minWidth: 1280, maxWidth: 1280, minHeight: 720, maxHeight: 720 } } }) const videoTrack = stream.getVideoTracks()[0] const imageCapture = new ImageCapture(videoTrack) const bitmap = await imageCapture.grabFrame() // 在这里对 bitmap 进行处理 } ``` 3. 在你的 Vue 组件中创建一个函数来触发屏幕截图函数,并将截图显示在页面上。你可以使用 canvas 元素来显示图像。 ```javascript methods: { async takeScreenshot() { const canvas = this.$refs.canvas const context = canvas.getContext('2d') context.clearRect(0, 0, canvas.width, canvas.height) const bitmap = await captureScreen() canvas.width = bitmap.width canvas.height = bitmap.height context.drawImage(bitmap, 0, 0) } } ``` 4. 在你的 Vue 组件中添加一个 canvas 元素来显示截图: ```html <canvas ref="canvas"></canvas> ``` 这样就可以在 Electron + Vue实现截图了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值