由于喜欢玩拼图游戏,因此本身开用canvas开发了一个拼图游戏,在这里分享一下开发的过程。html
拼图块有直线和弯曲的两种边,要生成直线边只需知道两个点就能够生成一条线段,而生成弯曲的边则稍微复杂一些。这里用四个点来生成弯曲的线。首要用随机数决定弯曲的方向是凹仍是凸。再由是凹仍是凸计算出垂直于边的向量,即下图中的紫色与蓝色向量。首先按比例由A和B获得E和F两个点的坐标:A和B坐标记做 和 ,比例为 ,则E点坐标 ,F点坐标 。加上垂直的向量获得C与D两个点。git
最后只需用贝塞尔曲线就获得了拼图的一个边。 (参考:stackoverflow.com/a/49371349/… )github
为了加快拼图块的绘制速度,须要再建立一个隐藏的canvas用于缓存拼图块。以下图所示全部拼图块只需绘制一次复杂的形状,以后绘制只需从隐藏的canvas复制到用户看到的canvas中。canvas
虽然在必定程度上缓存解决了卡顿问题,可是当拼图块数量达到数千张时,移动时仍是会出现卡顿。虽然每次移动的只是一小部分的拼图块,可是全部拼图块仍是须要从新绘制。更好的办法是,每次鼠标移动时只绘制移动的拼图块,而不是全部拼图块。为了实现这种效果,须要用两层canvas。以下图所示,底部灰色背景层在底部绘制静止的部分,只须要移动开始时从新绘制。图中紫色的另一层在最上面,绘制移动的拼图块,每次鼠标移动都须要绘制。缓存