JS 引入序列帧动画 两种方法

JS 引入序列帧动画 两种方法

那 什么是序列帧呢?

序列帧是把某些类似或者是视频 用一帧一帧的图像文件来表示 并且循环展示 当然一般的序列帧都是首尾相连的那种 这样才能保证动画看起来相对流畅

1.使用requestAnimationFrame方法进行回调

<img src="" id="player">

img {
  width: 100px; // 必须设置定宽高
  height: 100px;
}

const imgArr = [];
let frameId = 0;
let index = 0

function changeImg() {
  document.getElementById('player').src = imgArr[index];
  index = (index + 1) % imgArr.length;
  frameId = requestAnimationFrame(changeImg)
}

// 在页面初始化时
frameId = requestAnimationFrame(changeImg)

当然 建议在离开页面后清楚frameId

2.使用settimeout

<img src="" id="player">

img {
  width: 100px; // 必须设置定宽高
  height: 100px;
}

const imgArr = [];
let frameId = 0;
let index = 0

function changeImg() {
  document.getElementById('player').src = imgArr[index];
  index = (index + 1) % imgArr.length;
  frameId = setTimeout(changeImg, 50);
}

// 在页面初始化时
frameId = setTimeout(changeImg, 50);

第二种方法的好处就是可以控制每一帧的时间 相对于第一张种方法来讲要好很多
当然 clearTimeout别忘了

最后 讲一下requestAnimationFrame

requestAnimationFrame是浏览器用于定时循环操作的一个api 它跟settimeout类似 主要的用途就是按帧对网页进行重绘 它的刷新频率只有60Hz-75Hz左右 requestAnimationFrame的基本思想就是与这个刷新频率保持同步 利用这个刷新频率进行页面重绘 它还有一个好处就是当你的页面不处于当前标签的话 它会自动停止刷新 节省你的cpu性能 它接收的是一个回调作为参数 在浏览器重绘前进行调用 最后 可以用cancelAnimationFrame(callback)对它进行取消重构

Phaser3中实现序列帧动画方法有以下几种: 1. 使用动画(Animation)方式 这种方式与我上一条回答中提到的方法类似,只需要将 `frames` 参数指定为序列帧即可。 ```javascript this.anims.create({ key: 'play', frames: this.anims.generateFrameNumbers('spritesheet', { start: 0, end: 7 }), frameRate: 10, repeat: -1 }); this.add.sprite(400, 300, 'spritesheet').play('play'); ``` 上述代码中,我们使用了 `generateFrameNumbers()` 方法生成了一个序列帧数组,其中 `{ start: 0, end: 7 }` 表示从 0 到 7 的序列帧。然后将该序列帧数组作为 `frames` 参数传递给 `this.anims.create()` 方法,创建了一个名为 `play` 的动画。最后使用 `play()` 方法播放动画。 2. 使用精灵表(Spritesheet)方式 这种方式需要将序列帧图像合并成一张精灵表,然后使用 `Phaser.GameObjects.Sprite` 类的 `setFrame()` 方法设置当前帧。 ```javascript this.load.spritesheet('spritesheet', 'assets/spritesheet.png', { frameWidth: 64, frameHeight: 64 }); this.add.sprite(400, 300, 'spritesheet').setFrame(0); ``` 上述代码中,我们使用 `this.load.spritesheet()` 方法加载了一个名为 `spritesheet` 的精灵表,其中 `frameWidth` 和 `frameHeight` 分别指定了每帧图像的宽度和高度。然后使用 `Phaser.GameObjects.Sprite` 类的 `setFrame()` 方法设置当前帧。 3. 使用纹理集(Texture Atlas)方式 这种方式需要将序列帧图像和其它相关信息打包成一个纹理集,然后使用 `Phaser.GameObjects.Sprite` 类的 `setFrame()` 方法设置当前帧。 ```javascript this.load.atlas('atlas', 'assets/atlas.png', 'assets/atlas.json'); this.add.sprite(400, 300, 'atlas', 'frame0.png'); ``` 上述代码中,我们使用 `this.load.atlas()` 方法加载了一个名为 `atlas` 的纹理集,其中 `atlas.png` 是纹理集图像,`atlas.json` 是包含序列帧信息的 JSON 文件。然后使用 `Phaser.GameObjects.Sprite` 类的 `setFrame()` 方法设置当前帧。 总的来说,使用动画方式是最常用的实现序列帧动画方法,但是如果需要对每帧图像进行更加细致的控制,可以选择使用精灵表或纹理集方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值