效果就是这样:

具体步骤如下
1.绘制背景
一件事,将天空铺满
1 | // html代码中需要有canvas节点 |
2.添加星星
可根据个人喜好设置,我这里的星星是这样的:
大小有别,颜色不一,位置和移动方向随机,速度值一致
1 | <!-- 生成随机颜色 --> |
到此一副静态的星空图已经跃然纸上,不,屏上。
- 然后引入
requestAnimationFrame(),顾名思义请求动画的每一帧,所以回调函数中执行的都是绘制静态图的动作,即这里的drawStars()。
在使用动画前,考虑如何改造drawStars()
- 每次绘制需要清除上次绘制图案,清空画布重新绘制的消耗较于只清除星星相对较小。
- 使星星移动,需要在上次的位置上添加位移值,并记录移动后位置。
- 星星如果到了画布的边界,需要使他返回,简单点就是速度方向相反就行。
改造后如下:
1 | var stars = genStars(1000); |
此时繁星移动的动画完成
3.增加效果
为实现多种效果,获取鼠标的坐标位置是前提条件,将画布上的鼠标位置做记录,并监听鼠标移动事件,更新画布上的鼠标焦点坐标。
1 | // 初始值 |
3.1 放射状
逻辑:以鼠标坐标为圆心,半径为R (distance)的范围内的星星与鼠标相连
1 | // 用以获取两点间距离的工具函数 |
3.2 网状
逻辑:以鼠标坐标为圆心,半径为R (distance)的范围内的星星与该范围内其他星星并且距离不超过R (distance)的相互连接
1 | if (getDistance(mouse, star) < distance) { |
3.3 其他的一些效果
1.范围内的星星放大
1 | if (getDistance(mouse, star) < distance) { |
2.范围内星星吸引
1 | var dis = getDistance(mouse, star); |
3.范围内星星排斥
1 | var dis = getDistance(mouse, star); |
都是一些稍作改动就能实现的玩法。