点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

@alphardex,一个兴趣使然的前端,号称“CSS魔法使”,重度中二病患者,喜欢独自研究CSS的奥秘,口头禅是”我不是无所不知,只是刚好知道而已。”,爱好动漫、日语,平时经常在codepen进行创作。

“密室逃脱”这个词想必大家并不陌生,在以前的flash时代,这是一类很经典的益智游戏之一。玩家常常会被困在一间密室中,而过关的目的就是想法设法逃出这件密室。以下是笔者玩的最早的一个密室逃脱游戏——深红房间,它也可以说是密室逃脱类游戏的先祖。

接下来,笔者要用纯CSS实现一款类似的密室逃脱类游戏。

是的,你没听错,纯CSS,也就意味着完全没有JS的参与。有人就纳闷了:WTF?CSS,一个网页布局的语言,居然还能写游戏?可惜的是,CSS还真能写游戏。接下来随笔者一起进入这个不思议的国度吧。

攻略

每次笔者玩密室逃脱游戏卡关时,总会去搜搜攻略,看完后就能把游戏玩通。因此当我们做密室逃脱类游戏时,首先要考虑的事情就是攻略。以下是笔者为本文密室逃脱游戏所制定的攻略

  • 左转,转动地球仪

  • 右转,发现一根锤子,点击捡起,记住墙上的数字

  • 左转,点击柜子,用锤子砸开它,获得一个圆盘

  • 点击墙上的壁画,壁画移开,看到一圆盘印,嵌入圆盘,获得一个usb

  • 右转2次,将usb插入电脑,电脑开启,输入墙上的密码,获得钥匙

  • 右转,用钥匙打开大门,游戏结束

开关

制定完攻略后,就要开始确定该游戏的核心所在——开关。说到开关,大家觉得HTML里的哪个元素最适合用来做开关?答案是单复选框。

说起单复选框,就不得不提这2个CP——label和兄弟选择符。label负责将该元素与其对应的复选框用for来关联起来,而兄弟选择符则负责与:checked伪类配合好,当某元素被勾选时,其相邻的元素就会受到它的影响。

首先,让我们来看一看一个简单的开关例子

<input type="radio" id="globe" class="globe-trigger" />
<input type="radio" id="hammer" class="hammer-trigger" />
<label for="globe" class="globe"><img src="https://i.loli.net/2020/10/25/YBnOQ2jVtSTmFkE.png" alt class="w-8" />
</label>
<label for="hammer" class="hammer"><img src="https://i.loli.net/2020/10/25/KhVp4EaMoYrjlIC.png" alt class="w-6" />
</label>
.hammer {display: none;
}
.globe-trigger:checked {& ~ {.globe {pointer-events: none;}.hammer {display: inline-block;}}
}
.hammer-trigger:checked {& ~ {.hammer {transform: scale(0);opacity: 0;}}
}

可以看到我们用label元素包裹了对应的图片,并关联好了对应的开关。当用户点击地球仪globe时,globe-trigger开关就会被触发,这就是label的关联性

触发开关后,开关旁边对应的元素状态就发生了变化:globe变得无法被点击;hammer元素出现,这就是兄弟选择符的作用

同理,点击锤子hammer时,与其关联的hammer-trigger开关被触发,与此同时旁边的hammer就会消失,代表被用户“捡起”这一动作

理解开关的原理后,我们就可以把开关给隐藏起来啦

input[type="checkbox"],
input[type="radio"] {display: none;
}

场景切换

假设我们游戏地图分为4块,且可以用导航箭头来切换。

游戏的地图其实是一张长图,如下图所示

<div class="camera"><!-- 导航 --><input type="radio" id="nav-1" name="nav" class="nav-trigger-1" /><input type="radio" id="nav-2" name="nav" class="nav-trigger-2" /><input type="radio" id="nav-3" name="nav" class="nav-trigger-3" /><input type="radio" id="nav-4" name="nav" class="nav-trigger-4" /><!-- 长图 --><form class="stage"><!-- 开关 --><input type="checkbox" id="globe" class="globe-trigger" />...<!-- 场景 --><div class="scene scene-1"><label for="...">...</label><nav class="navs"><label for="nav-4" class="nav-left"></label><label for="nav-2" class="nav-right"></label></nav></div></form>
</div>

首先,设定游戏的固定视角,将多余的部分裁掉

.camera {--stage-width: 18rem;--scene-id: 0;position: relative;width: var(--stage-width);height: var(--stage-width);overflow: hidden;
}

然后,设定导航,根据所选的导航来确定长图的平移距离

@for $i from 1 through 4 {.nav-trigger-#{$i}:checked {& ~ .stage {--scene-id: #{$i - 1};}}
}
.stage {transform: translateY(calc(var(--stage-width) * var(--scene-id) * -1));
}
.scene {position: relative;width: var(--stage-width);height: var(--stage-width);
}

比如在场景1,用户向右走,导航2被触发,长图将上平移一个单位,如下图所示

这样就完成了场景切换这一效果

完成项目

此刻,我们已经具备完成密室逃脱游戏所必须的知识了。根据上面的攻略,一步步定制好所有开关,摆放好所有物件,且能确保场景能自由切换,这样一个纯CSS密室逃脱游戏就成功诞生啦

在线游玩地址:https://codepen.io/alphardex/full/GRqWRyB

关于本文 作者:@alphardex 原文:https://juejin.im/post/6887792725031288839

声明:文章著作权归作者所有,如有侵权,请联系小编删除。

内推社群

我组建了一个氛围特别好的腾讯内推社群,如果你对加入腾讯感兴趣的话(后续有计划也可以),我们可以一起进行面试相关的答疑、聊聊面试的故事、并且在你准备好的时候随时帮你内推。下方加 winty 好友回复「面试」即可。

纯CSS实现密室逃脱游戏相关推荐

  1. 基于Spring MVC + Spring + MyBatis的【密室逃脱游戏主题排行榜】

    资源下载: https://download.csdn.net/download/weixin_44893902/25706959 一.语言和环境 1. 实现语言:Java语言 2. 环境要求:ecl ...

  2. ERM LABS 与 The Sandbox 战略合作,将真人密室逃脱游戏引进元宇宙

    将现实生活中的体验带入一个全新的维度!ERM LABS 专注于将现实生活中的娱乐及冒险体验以游戏独特架构设计扩展到元宇宙裡.与 The Sandbox 合作,该项目旨在为全球合作的真人密室逃脱场所提供 ...

  3. 创业-创新构思:一款关于地铁的密室逃脱游戏

    游戏名称:地铁密室逃脱 游戏规则: 1. 地铁车厢里有10个座位,每个座位上都坐着一位乘客. 2. 这10位乘客中有一位是"X先生",他手里拿着一张密室逃脱的提示卡.玩家需要在3站 ...

  4. Mixlab无界社区新年礼!密室逃脱游戏社交内测资格放送!

    Mixlab无界社区新年礼! 密室逃脱游戏社交内测资格放送! 无界社区与Vland共同推出的元宇宙社交活动. AI 让我想象下密室是什么样的? ♾️密室主题的科技活动? shadow 为了赋予您更好的 ...

  5. 元宇宙密室逃脱游戏攻略来啦!

    今天还是数字人小杜 如果有一款线上 PC 端游戏,不用安装下载,一秒登入,且在开头5分钟就甚至能撸出大致结局,你会去玩吗? 今晚我在 Vland 元宇宙空间,体验语音版的密室逃脱. LetmeOut ...

  6. 面试官:你用纯CSS来写个游戏吗?

    作者:陈大鱼头 github: KRISACHAN 前言 不知道大家小时候有没有玩过一款游戏叫『井字棋』的. 它长这样: (我赢了,快夸我 ~o(´^`)o) 上面的就是本次文章的最终结果,一个用纯C ...

  7. 密室逃脱游戏解决方案-森林迷宫-炸弹人等

    1森林迷宫 4个人配合,送兔子走出迷宫,兔子移动的速度与关卡有关系. 通关后,系统送出通关信号. 2 炸弹人 图片中的炸弹会在短时间内爆炸,需要把角色配合移动到安全房间. 转载于:https://ww ...

  8. 密室逃脱,越恐怖、越赚钱

    文|熔财经 作者| 青月 不同于以前KTV.电影院.网吧这些场所,现代年轻人的娱乐活动更多的聚焦在密室逃脱.剧本杀.狼人杀和真人CS等年轻新业态之中. 据头豹研究院数据,中国真人密室逃脱市场规模从20 ...

  9. 十二届蓝桥杯python青少年组第五题——密室逃脱

    密室逃脱 提示信息: 有一个密室逃脱游戏,有100间密室连在一排.密室编号是从1开始连续排列一直排到第100间密室,如下图: 游戏规则: 玩家初始位置在1号密室: 每次玩家可以进入右边的一个密室,也可 ...

最新文章

  1. typedef的四个用途和两大陷阱
  2. QIIME 2用户文档. 5粪菌移植分析练习Fecal microbiota transplant (FMT) study
  3. 网页打开慢与服务器有关吗,网站打开好慢! 原来是这些原因造成的
  4. Parallel学习
  5. 我的2018年终总结
  6. 原来fb可以在一个工程里面输出多个swf模块
  7. 系统集成资质 -考点分析- “三点估算法”出题的形式演化分析
  8. 嵌入式面试中常见的问答题(线程进程、TCP等)
  9. java中FileInputStream和OutputStream解析
  10. 零基础python入门-零基础 Python 入门
  11. 推荐系统-猜你喜欢设计
  12. CMMI中的过程改进
  13. linux下c语言图形界面实现,「分享」C语言如何编写图形界面
  14. java数组排序(反转排序)
  15. 【JSP入门】只知道HTML却不知道JSP?
  16. 什么是飞秒激光技术?
  17. ipad怎么清理内存垃圾
  18. Feign整合Sentinel 开启 feign.sentinel.enabled=true 启动报错
  19. 微信罕见出手,再造一个万能的电商平台!
  20. 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java

热门文章

  1. js 根据id获取数组中对应的对象
  2. math-方程组和不等式组
  3. flowableの历史查询
  4. Unity常用文件夹
  5. ccfcsp题库c语言,2019年CCF认证第一轮CSP-S信息学C++试题答案A卷
  6. 名编辑电子杂志大师教程 | 主题模板设置
  7. 教你一键虚化视频边框
  8. 组织安全策略的四个组成部分及其目的
  9. python 异步编程:协程与 asyncio
  10. [ENVI] 转移矩阵