不一样的推箱子游戏

前言

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

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

相关推荐
噢,我明白了1 小时前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
幽络源小助理1 小时前
MacCMSPro版视频影视系统源码_全开源高可用视频平台解决方案
前端·php·php源码
不会敲代码17 小时前
手写 Zustand:三十分钟带你搞懂状态管理库的核心原理
前端·javascript·源码
神奇的程序员8 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
橙淮8 小时前
从优化到安全再到未来 ——JavaScript 全维度技术指南
javascript
UXbot9 小时前
一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
前端·低代码·ui·设计模式·交互
kobesdu9 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
诚实可靠王大锤9 小时前
React Native 输入框与按钮焦点冲突解决方案(rn版本0.70.3)
前端·javascript·react native·react.js
aaaffaewrerewrwer9 小时前
免费在线 2048 游戏推荐|经典数字合并玩法 + 流畅浏览器体验
安全·游戏·个人开发
kyriewen10 小时前
测试妹子让我写单测,我偷偷用AI一天干完一周的活
前端·chatgpt·cursor