当前位置: 首页 > news >正文

CSS实现经典打字小游戏《生死时速》

在这里插入图片描述

🌻 前言

CSS 中有这样一个模块:Motion Path 运动模块,它可以使元素按照自定义的路径进行移动。本文将为你讲解这个模块属性的使用,并且利用它实现我小时候电脑课经常玩的一个打字游戏:金山打字的《生死时速》。

🪴 Motion Path 使用教程

css中有这样一个模块:Motion Path ,它可以实现元素按不规则路径移动。

Motion Path模块包含 offset 的一系列属性,包括以下几个:

  • offset-path:设置元素运动路径;
  • offset-distance:控制当前元素基于 offset-path 运动的距离;
  • offset-anchor:定义元素在路径上移动时的锚点。 简单来说就是,运动元素可能不是一个点,那么就需要指定元素中的哪个点附着在路径上进行运动
  • offset-position:指定运动的初始位置;
  • offset-rotate:定义沿 offset-path 运动路径移动时元素的朝向;

1. offset-path

offset-path 属性可以取以下几个值来设置元素的运动路径:

  • ray()函数ray([<angle> && <size> && contain?]),设置以射线状路线偏移;
  • url()函数:用id选择器绑定页面内联SVG元素中任意图形元素的路径;
  • <basic-shape>:一些css的基本形状函数,例如:circle(), ellipse(), inset(), path(), polygon(), rect()等,对于可以设置position位置的circle(), ellipse(),如果没有设置position的话,就会应用offset-position的值;
  • box-edge:设置以相对的父元素的边缘为运动路径,例如设置content-box、border-box、fill-box等,可以设置按内容区的边缘还是边框边缘等;

看下面例子就懂了:

下面代码中ray射线运动是设置元素朝70度方向运动200px;
按svg路径运动是让电车以一个五角星的svg的路线运动;
shape图形是让电车以polygon()绘制的菱形运动;
box是在其父盒子边缘运动;
jcode

2. offset-distance

设置运动的距离,可以是值,也可以是百分比,例如设置0%处于初始位置,100%就是移动到路径的终点。所以一般实现元素按不规则路径移动,就是通过animation修改offset-distance实现的。

jcode

3. offset-anchor

设置元素的哪个点沿着路径运动,例如设置offset-anchor: center bottom为元素的底部中心点沿路径移动,其他就不多说了,使用方式和background-position一样。

jcode

4. offset-position

设置运动的起始位置,只能作用于可以设置position的路线.

例如 ray() 射线运动,可以设置起点位置,或者ellipse()、circle()等这些需要设置position的图形元素。而且如果在定义路径时已经写明了position的话,offset-position是不会生效的,例如circle(50% at 25% 25%)

5. offset-rotate

offset-rotate定义元素沿偏移路径定位时的方向,默认的话是元素角度会一直和运动路径的水平角度保持一致,当然你也可以自定义固定角度,或者反向显示元素(reverse)。

看下面例子就明白了:

jcode

🎯 游戏开发

1. 游戏简介

游戏开始后,警察在3秒后开始出动,如果警察抓到小偷(位置重合)即游戏失败。
你需要根据页面底部的对话正确输入单词,即可让小偷不断运动,拉开与警察的距离,如果在输入全部对话前没有被警察逮到,即闯关成功。

整个游戏其实实现起来很简单,只需要在设置offset路径动画的基础上加一点点细节就完成了。

2. 利用offset属性实现运动路径

找个svg在线编辑网站,设计一个用来当道路等路径path,然后将两个位置重合的元素设置相同的运动路径,即可实现警察和小偷的运动路线。

tutieshi_640x347_4s.gif

3. 实现警察追小偷

  1. 如何实现警察小偷你追我赶的情景呢?很简单,警察是一直在运动的,只要小偷不要一直运动,两者错开即可。

只需要利用animation-play-state: paused属性控制小偷运动暂停即可,如果你输入正确的字符,则设置为animation-play-state: running继续运动。

  1. 如何制作打字控制小偷移动的效果呢?

很简单,监听键盘输入即可,如果输入正确,则将此字符推入答案中,并设置小偷animation-play-state: running让他继续运动,延时一小段时间再设置为paused暂停。
答案和题目重合,并且答案设置为了蓝色,在答案尾部还利用step逐帧动画,方便体现打字的进度。因为输入时,输入空格也需要光标移动,所以一定要在答案元素上设置white-space: pre以保留空白符的所有空白。另外,为了使要输入的字符永远显示出来,我在推入答案时会使光标调用scrollIntoView()方法使其滚动到可视区。

document.addEventListener('keydown', function (event) {const myinput = answer.textContentif (event.key === words[myinput.length]) {timer && clearTimeout(timer)answer.textContent = myinput + event.keythief.style.setProperty('--paused', 'running');document.querySelector('.show').scrollIntoView(true)timer = setTimeout(() => {thief.style.setProperty('--paused', 'paused');}, 400);}
});
setTimeout(() => {checkCollision()police.style['animation-play-state'] = 'running'
}, 2000);

在这里插入图片描述

4. 判断结果

如果做碰撞检测呢并显示结果呢?

碰撞检测其实很简单,只需要利用getBoundingClientRect()方法获取警察和小偷的定位,判断是否几乎重合即可。判断输赢的方式为:如果你在打完所有文字之前不被逮捕则闯关成功,否则闯关失败。

// 碰撞检测
function checkCollision() {const policeRect = police.getBoundingClientRect()const thiefRect = thief.getBoundingClientRect()if (answer.textContent.length >= words.length) {showResult(true)return}if (Math.abs(policeRect.x - thiefRect.x) < 2 && Math.abs(policeRect.y - thiefRect.y) < 2) {showResult()return}requestAnimationFrame(checkCollision)
}
// 结局判断
function showResult(flag) {if (flag) {document.querySelector('.success').style.display = 'grid'} else {document.querySelector('.fail h1').textContent =`你被逮捕了!${document.querySelector(".timing").textContent}`document.querySelector('.fail').style.display = 'grid'}
}

在这里插入图片描述

🎮 玩游戏

《生死时速》游戏地址

更多游戏

🎁最后

学如逆水行舟,不进则退~
我是喜欢归纳总结前端相关知识的前端阿彬,欢迎点赞关注

在这里插入图片描述

相关文章:

CSS实现经典打字小游戏《生死时速》

&#x1f33b; 前言 CSS 中有这样一个模块&#xff1a;Motion Path 运动模块&#xff0c;它可以使元素按照自定义的路径进行移动。本文将为你讲解这个模块属性的使用&#xff0c;并且利用它实现我小时候电脑课经常玩的一个打字游戏&#xff1a;金山打字的《生死时速》。 &…...

推箱子-小游戏

学习目标&#xff1a; 巩固Java基础&#xff0c;数据类型、二维数组、条件语句等&#xff1b; 效果展示&#xff1a;...

AI数字人的开源解决方案

目前&#xff0c;国内外已经涌现出一些优秀的数字人开源解决方案&#xff0c;这些解决方案为开发者提供了构建数字人应用的工具和基础设施。以下是一些比较知名的数字人开源解决方案。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…...

java写一个验证码

生成验证码 内容&#xff1a;可以是小写字母&#xff0c;也可以是大写字母&#xff0c;还可以是数字 规则 长度为5 内容中是四位字母&#xff0c;1位数字。 其中数字只有1位&#xff0c;但是可以出现在任意的位置。 package User;import java.util.ArrayList; import jav…...

【星海随笔】ELK优化

ELS 再遇到大的日志文件的时候不会自动进行清理的,我们可以通过 logrotate 转储工具进行操作。 该命令是基于 Cron 实现,由系统执行,当然也可以手动进行执行例如 logrotate -f configfile# more /etc/logrotate.confweekly // 默认每一周执行一次rotate轮转工作 r…...

SQL Auto Increment

SQL Auto Increment 在关系型数据库中&#xff0c;自动增量&#xff08;Auto Increment&#xff09;是一个常见且实用的特性。它允许数据库自动为表中插入的新行分配唯一的标识符&#xff0c;通常用于主键字段。本文将深入探讨SQL中的自动增量功能&#xff0c;包括其工作原理、…...

网络安全练气篇——PHP编程语言基础

目录 PHP基础 一、PHP简介与环境搭建 什么是PHP&#xff1f; PHP环境安装 代码编辑选择 二、基本语法 PHP基本语法操作 PHP变量与输出 啥是常量? PHP注释 PHP单引号双引号声明 三、PHP表单 PHP表单 四、登录界面搭建与讲解 构建登陆页面 登陆页面端 服务器端…...

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时&#xff0c;若发现程序运行时间越长&#xff0c;占用内存越大直至崩溃&#xff0c;通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因&#xff0c;包括数组和字符串处理、未释放的资源、循环中的对象创建等&#xff0c;并提供具体的解决方…...

JVM垃圾回收器介绍

Serial GC: 算法: 使用的是标记-清除算法。特点: 串行执行&#xff0c;适用于单CPU环境或较小的堆内存配置。在新生代和老年代的回收中都是单线程执行&#xff0c;因此在进行垃圾回收时会暂停所有应用线程&#xff08;Stop-The-World&#xff09;。 Parallel GC (也称为吞吐量优…...

subprocess隐藏cmd窗口

process subprocess.Popen(command, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.PIPE,creationflagssubprocess.CREATE_NO_WINDOW) 添加参数即可不显示cmd运行窗口 creationflagssubprocess.CREATE_NO_WINDOW...

编程前端看什么书比较好:深入解析与推荐

编程前端看什么书比较好&#xff1a;深入解析与推荐 在编程前端的学习道路上&#xff0c;书籍无疑是我们最宝贵的财富。一本好的书籍&#xff0c;不仅可以提供系统的知识体系&#xff0c;还能引导我们深入探索技术的奥秘。然而&#xff0c;面对市面上琳琅满目的前端书籍&#…...

HarmonyOS(36) DevEco Studio 配置debug和release

在android开发中可以在build.gradle来配置realease和debug,在HarmonyOS中可以通过build-profile.json5文件中通过buildModeSet配置&#xff1a; 在DevEco Studio 中可以通过下面来选择运行debug还是release&#xff1a; 我们可以通过BuildProfile.ets里面的静态变量获取当前…...

PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现

PHP语言在设计时忽略了Windows对字符编码转换的 Best-Fit 特性&#xff0c;导致未授权的攻击者可以通过特定字符串绕过 CVE-2012-1823 补丁&#xff0c;执行任意PHP代码&#xff0c;导致服务器失陷。 1.漏洞级别 高危 2.漏洞搜索 fofa: app"XAMPP"3.影响范围 P…...

WHAT - React 学习系列(二)

目录 一、官方介绍二、框架具体对比1. Next.js(Pages Router)2. Remix3. Gatsby4. Expo&#xff08;用于原生应用&#xff09;5. Next.js(App Router)Next.js App Router主要特性与 Pages Router 的对比 具体使用示例创建 App Router 项目目录结构示例示例代码 总结 这一篇主要…...

Java 反射机制 -- Java 语言反射的概述、核心类与高级应用

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 010 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

【Python入门与进阶】Jupyter Notebook配置与优化

目录 1.Jupyter Notebook简介 2.Jupyter Notebook的安装 2.1 命令行安装 2.2 可视化界面安装 3.Jupyter Notebook的使用 3.1 启动 Jupyter Notebook 3.2 Jupyter Notebook 界面介绍 3.3 创建新的 Notebook 3.4 编写和运行代码单元 3.5 使用 Markdown 编写文档 3.6 保…...

DataCap 自定义 File 转换器

DataCap 支持自定义 File 转换器&#xff0c;使用者可以编写自己的文件转换器集成到 DataCap 中。该文档主要讲解如何快速集成一个文件转换器到 DataCap 系统中。 该模块我们主要使用到的是 file 模块内的代码&#xff0c;我们本文使用 json 来做示例。 模块基本配置 新建项目…...

ARM32开发--IIC原理

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 I2C通讯规则 I2C写操作 I2C读流程 通讯信号 开始 结束 发送数据 bit发送 Byte发送 等待响应 接收数据 bit接收 Byte接收 发送响应 总结 前言 在现代消费电子和工业电子领域&#xff0c;各种类型的…...

列表、集合、字典的相关练习

1、使用列表推导式&#xff0c;输出1~100的所有素数 输入下面代码 # 定义一个辅助函数用来判断是否是素数 def is_prime(num):if num < 1:return Falsefor i in range(2, int(num**0.5) 1): #int函数将结果转换为整数&#xff0c;向下取整if num % i 0:return Falsere…...

填报志愿选大学专业,文科生如何选专业?

读文科的同学接触的专业知识相对广泛&#xff0c;往往被认为是“万金油”&#xff0c;他们仿佛什么都能做&#xff0c;但是和专业技能类知识不同&#xff0c;缺乏技术支持&#xff0c;从而使得文科专业的就业方向和前景远远比不上理科专业那么明朗&#xff0c;对于众多文科生而…...

AI营销SaaS榜单评测:原圈科技如何助力品牌客户破局增长?

本文深度探讨AI营销行业趋势与SaaS产品评选标准。在众多解决方案中&#xff0c;原圈科技的AI营销SaaS平台凭借其领先的技术底层能力、产品成熟度及客户成功案例&#xff0c;在市场适配度与服务落地性等多个维度下表现突出&#xff0c;被普遍视为企业实现精细化营销升级的有力选…...

【Java外部函数性能优化黄金法则】:20年JVM专家亲授JNI/FFM调优的7大致命误区与3步极速修复方案

第一章&#xff1a;Java外部函数优化的演进脉络与性能本质Java平台对外部函数调用&#xff08;Foreign Function & Memory API&#xff0c;即JEP 454/464/471/472&#xff09;的演进&#xff0c;标志着JVM从“纯Java世界”迈向系统级互操作的新纪元。其性能本质并非单纯降低…...

马年市场快报分析:欧美组合式一氧化碳及可燃气体报警器指南

马年市场快报分析&#xff1a;欧美组合式一氧化碳及可燃气体报警器指南根据您提供的快报内容&#xff0c;我将从专业角度逐步分析欧美组合式一氧化碳&#xff08;CO&#xff09;及可燃气体报警器的关键信息&#xff0c;包括安全标准、风险因素、探测器区别、安装建议以及相关产…...

猫抓插件:浏览器资源嗅探的革命性解决方案

猫抓插件&#xff1a;浏览器资源嗅探的革命性解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾在浏览网页时&#xff0c;看到心仪的…...

ai赋能开发:让快马智能助手帮你诊断和优化openclaw ubuntu部署难题

最近在Ubuntu上部署OpenClaw项目时&#xff0c;遇到了不少头疼的问题。从依赖冲突到参数调优&#xff0c;每一步都可能踩坑。不过我发现&#xff0c;借助AI辅助开发工具&#xff0c;这些问题可以变得更可控。今天就来分享下如何构建一个AI工具箱来优化OpenClaw的部署和开发体验…...

国产N32芯片开发避坑指南:J-Link在Keil中的特殊配置(含Cortex-M0配置模板)

国产N32芯片开发实战&#xff1a;J-Link调试配置深度解析与Keil环境优化 在国产MCU生态快速崛起的背景下&#xff0c;N32系列芯片凭借优异的性价比和本土化服务优势&#xff0c;正逐步成为工程师替代进口方案的新选择。然而&#xff0c;从传统ST芯片转向国产平台时&#xff0c;…...

论文AI率高怎么降最安全?2026保姆级降AIGC工作流:实测权威指令揭秘与3款工具横评

辛辛苦苦肝了三个月的论文&#xff0c;可是一经过学校的AI检测系统&#xff0c;却给我标了个醒目的65%&#xff01;这我真是百口莫辩&#xff01;明明每一个观点、每一处引用&#xff0c;都是我一点点阅读文献琢磨出来的&#xff01; 为了把要命的 AI率 打下来&#xff0c;我之…...

GooglePlay多账号管理神器推荐:5款工具帮你轻松实现合规隔离(2025亲测有效)

GooglePlay多账号管理实战指南&#xff1a;2025年高效合规工具与策略 在移动应用生态中&#xff0c;Google Play作为全球最大的应用分发平台&#xff0c;其严格的账号管理政策让许多开发者感到头疼。特别是对于那些需要运营多个账号的开发者来说&#xff0c;如何在合规前提下实…...

告别重复造轮子:用快马平台高效生成ibbot开发脚手架与核心模块

今天想和大家分享一个提升ibbot开发效率的实用技巧。作为一个经常需要开发对话机器人的程序员&#xff0c;我发现每次从零开始搭建项目结构、编写基础模块特别耗时。最近尝试用InsCode(快马)平台生成项目脚手架&#xff0c;效果出乎意料的好。 项目结构自动生成 平台能根据自然…...

别再用Delay了!用GD32的TIMER5实现精准1ms定时,让你的嵌入式程序更高效

告别阻塞式延时&#xff1a;用GD32 TIMER5构建高效嵌入式系统心跳 在嵌入式开发中&#xff0c;时间管理如同系统的心跳&#xff0c;决定了整个应用的响应速度和执行效率。许多开发者习惯使用delay_ms()这类阻塞式延时函数&#xff0c;却不知这会让CPU陷入无意义的等待状态&…...