不一样的推箱子游戏

前言

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

  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 移除后部署成功。

相关推荐
java1234_小锋10 分钟前
一周学会Flask3 Python Web开发-redirect重定向
前端·python·flask·flask3
琑9528 分钟前
nextjs项目搭建——头部导航
开发语言·前端·javascript
light多学一点39 分钟前
视频的分片上传
前端
Gazer_S1 小时前
【Windows系统node_modules删除失败(EPERM)问题解析与应对方案】
前端·javascript·windows
bigyoung1 小时前
基于 React 的列表实现方案,包含创建和编辑状态,使用 Modal 弹框和表单的最佳实践
前端
沙子迷了蜗牛眼1 小时前
antv G6绘制流程图
开发语言·javascript·ecmascript
乌木前端1 小时前
包管理工具lock文件的作用
前端·javascript
司玄2 小时前
3dtiles平移旋转原理及可视化工具实现
前端
m0_748236582 小时前
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
前端·tcp/ip·flask
Jet_closer_burning2 小时前
Vue2 和 Vue3 的响应式原理对比
前端·javascript·vue.js·html