不一样的推箱子游戏

前言

推箱子是一款轻松益智小游戏,在其基础上做了些更好趣的东西,推炸弹。 当然不仅仅是换成推炸弹,更有趣的部分:

  1. 除了默认的关卡玩单机外,玩家可以 DIY 地图并分享。
  2. 闯关成功后可以通过链接或生成 GIF 图分享玩法。

玩法

默认关卡

通过上下左右来控制小人移动,目标是把所有的炸弹都推入箱子内即可通关。

通关之后在胜利页面,点击链接分享玩法按钮就已复制游戏玩法链接可用于分享;分享 GIF 会自动生成动态图。

地图绘制

行和列用于控制地图的大小。地图相关的元素点击选择后,可在下面空白地图上点击或拖拽进行地图编辑。

地图编辑好之后点击游玩按钮就可试玩,底部的分享按钮可以复制游戏链接用于分享设计的地图。

新增关卡

欢迎进行地图编辑,并将数据 PR 推送至仓库 Efrice/push-mines: mini-game, welcome play. (github.com)

代码实现

游戏数据的压缩处理

游戏所需数据量较大,直接通过链接分享时太多也不美观,通过使用 pako 库将数据进行压缩和解压处理。

js 复制代码
import pako from 'pako'

export function deflate(raw: any): string {
  const rawParams = JSON.stringify(raw)
  const compressedData = pako.deflate(rawParams)

  return btoa(String.fromCharCode.apply(null, compressedData as any))
}

export function inflate(base64Data: any): any {
  const decodedData = atob(base64Data)
  const uint8array = new Uint8Array(decodedData.length)
  for (let i = 0; i < decodedData.length; i++)
    uint8array[i] = decodedData.charCodeAt(i)

  return JSON.parse(pako.inflate(uint8array, { to: 'string' }))
}

注意:vue-routerroute.query 会将 + 转换为空格,需要特殊处理该问题。

生成 gif 图

结合 html2canvasgif.js 库将玩家每一步移动 dom 的结构转换为 canvas ,再使用 gif.jscanvas 添加至动态图之中,最后生成完整的动态图。

html2canvas 无法将 svg 转换至 canvas 中,游戏中元素需要使用图片来实现。

github pages 部署

在本地开发阶段正常,但是打包后的 docs 推送至 github pages 时无法展示 router-view 中的内容,在本地静态部署时也没问题。最后,将 vue-routerpinia 移除后部署成功。

相关推荐
前端Hardy21 分钟前
HTML&CSS:3D图片切换效果
前端·javascript
spionbo42 分钟前
Vue 表情包输入组件实现代码及完整开发流程解析
前端·javascript·面试
全宝42 分钟前
✏️Canvas实现环形文字
前端·javascript·canvas
lyc23333343 分钟前
鸿蒙Core File Kit:极简文件管理指南📁
前端
我这里是好的呀43 分钟前
全栈开发个人博客12.嵌套评论设计
前端·全栈
我这里是好的呀44 分钟前
全栈开发个人博客13.AI聊天设计
前端·全栈
金金金__1 小时前
Element-Plus:popconfirm与tooltip一起使用不生效?
前端·vue.js·element
lyc2333331 小时前
小L带你看鸿蒙应用升级的数据迁移适配📱
前端
用户26812851066691 小时前
react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
前端