基于canvas和web audio实现低配版MikuTap

Techgogogo 2019-06-28

导言

最近发掘了一个特别happy的网页小游戏--MikuTap。打开之后沉迷了一下午,导致开发工作没做完差点就要删库跑路了,还好boss瞥了我一眼就没下文了。于是第二天我就继续沉迷,随着一阵抽搐,这个游戏索然无味之后,冷静的我决定用canvas和web audio开发出一个低配版MikuTap。


先放上游戏的原链接: https://aidn.jp/mikutap/
再放上我的高仿低配链接: http://weapp.zzuzsj.cn/zmiku
恬不知耻地再git库链接: https://github.com/zzuzsj/Zsa...

在用canvas和web audio实现的基础上学习了一下webpack的配置,算是搭建了一个比较简易的webpack项目。webpack入门者可以大概了解一下

模块分析


简易说一下我的代码模块

  • main.js 实现页面中的主题逻辑和事件逻辑,代码比较混乱,没有用类的概念管理,但是我比较懒,以后再说嘻嘻嘻
  • audio.js 对应的是页面中音乐播放模块,通过web audio实现。音乐资源来自原网页的json数据,是base64格式的,可以先将base64转为arraybuffer然后再利用audioContext的decodeAudioData将arraybuffer数据转为buffer数据然后播放。值得注意的是:一个context.source只能播放一个音源,如果想播放不同音源需要创建不同的context.source
  • back.js 我把mikutap的渲染部分分为back和cont,back负责渲染画面的背景切换,cont负责交互时的渲染花样
  • shapes.js 最初级的几何体概念,比如线、圆、方形,提供最基础的计算和渲染api
  • shape.js 由不同的shapes组成,不同数量的初级几何体通过一定的动效组成可以成为一种shape。可根据自己的想法不断扩充,暂时只有八种
  • cont.js 负责管理并渲染不同种类的shape,通过addShape增加页面内容中的渲染样式,达到实时交互的效果
  • res.js 是页面中的背景音乐和交互音乐的音源,为base64格式

主体内容由这些类组成,进行一定的管理即可实现效果。

后续想法


不得不吐槽一下的是,canvas和webgl的性能还是有一定差距的。我的低配版mikutap在交互操作比较高的情况下,还是比较卡的,没有原网页的流畅性,可能后续考虑webgl版本实现。
web audio api是一个很牛逼的东西,我只是初步实现了多个音源的播放,但是在节奏感这方面还有很大的改善,需要深入学习(坑也不少。。)。
对应自己写的shape和shapes模块觉得还可以,只要有想法,就可以进行后续花式的扩充,说不定哪天就实现32种样式了,想想还有点小激动呢~


今天的分享到这里就结束啦~
如果觉得我的代码可能对大家有帮助~欢迎大家star~~
有疑问的可以留评论问我

相关推荐