最新要闻
- 星城控股20亿元私募债券获上交所受理
- 张颂文败给了新海诚?同上映11天:两部新片口碑相仿 票房差距5亿
- 世界速递!成都一公寓按排量收停车费每月最低1200元 官方回应:可自行定价
- 北野武悼念坂本龙一:朋友们都不在了 只剩下我一个人
- 环球新动态:无任何定语!真我GT Neo5 SE预售销量破纪录:1999元真香
- 世界微头条丨《小美人鱼》新镜头截图:爱丽儿抚摸王子脸 王子尬笑
- 极氪001车主吐槽:语音助手突然出现故障,无法语音识别指令
- 焦点快报!任天堂或将进军手游!宣布与DeNA合作创立新公司
- 世界通讯!终于不用忍受熊孩子了!复兴号智能动车上线“静音车厢”
- 世界微资讯!真不是电影特效!武汉大暴雨白天秒变黑夜:雷电大风齐上阵
- 当前动态:3月新势力销量排名:理想断崖领先 第二名只卖一款车
- 身残技坚 国外一《守望先锋2》眼睛残疾玩家达到大师段位
- 【焦点热闻】《秋叶原物语2导演剪辑版》Switch中文版开启预购 4月20日发售
- 当前热门:7个摄像头走天下!大疆千元级智驾方案炸场:马斯克看了都得服
- 【环球热闻】2022胡润品牌榜发布:贵州茅台第一 阿里巴巴赢麻了
- 1999元潮玩电竞旗舰!真我GT Neo5 SE图赏
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球快看点丨记录--Canvas实现打飞字游戏
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
打开游戏界面,看到一个画面简洁、却又富有挑战性的游戏。屏幕上,有一个白色的矩形框,里面不断下落着各种单词,而我需要迅速地输入这些单词。如果我输入的单词与屏幕上的单词匹配,那么我就可以获得得分;如果我输入的单词错误或者时间过长,那么我就会输掉游戏。游戏的节奏非常快,每当我输入一个单词,屏幕上就会有新的单词出现,让我不能有丝毫的懈怠。
(相关资料图)
在游戏中,我不断地挑战自己,不断地提高自己的打字速度和准确性。经过一段时间的练习,我发现我的打字速度和准确性都有了显著的提高,这让我非常开心。
一、游戏介绍
打字游戏使用Canvas和JavaScript实现。游戏的核心玩法是,玩家需要在字母下落到底部之前输入相应的单词。如果玩家输入正确,就会得到相应的分数。游戏中包含了许多有趣的功能,如随机生成单词、单词下落、单词匹配、得分计算等等。此外,游戏设计还考虑到了玩家的游戏体验,如游戏难度的调整、游戏音效的设置等等。如果你喜欢挑战和打字游戏,那么这款游戏一定不容错过!
二、效果预览
体验链接:打飞字游戏 - 码上掘金 (juejin.cn)
三、实现思路
在实现游戏时,主要包括以下几个部分:
- 随机生成单词
- 添加新的单词
- 更新画面
- 画出单词
- 处理已输入单词
- 处理未输入单词
- 重置游戏
具体实现可以参考代码中的注释。
1. 搭建页面结构
使用Canvas和JavaScript实现的打字游戏的HTML模板。在这个HTML模板中,我们使用了canvas
元素来显示游戏画面。此外,我们还添加了一个得分标签、一个文本输入框和一个重置游戏按钮。在游戏开始时,用户需要点击文本输入框并输入单词。如果输入的单词与下落的单词匹配,则会得到相应的分数。如果下落的单词没有被输入,则游戏结束。用户可以通过点击重置游戏按钮重新开始游戏。
Canvas打字游戏 得分: 0
2. 美化界面
canvas { border: 1px solid black;}body { display: flex; flex-direction: column; align-items: center;}#gameCanvas { margin: 20px;}input[type=text] { margin: 20px; font-size: 20px; padding: 10px; border: none; border-bottom: 2px solid gray;}#score { font-size: 20px; margin: 20px;}#resetButton { margin: 20px; font-size: 20px; padding: 10px; border: none; background-color: #4CAF50; color: white; border-radius: 5px;}#resetButton:hover { background-color: #3E8E41;}
3. 编写JavaScript代码
对于js代码的编写,我用ES6的class语法来进行编写。使用ES6中的class语法来定义一个游戏类,能够利用class语法的面向对象特性来进行游戏逻辑的封装和组织。使用class语法可以更加清晰地表达游戏的结构和关系,将游戏的各个部分封装在一个类中,可以更加方便地管理和维护代码。
同时,使用class语法还可以更加方便地进行继承和多态的操作,方便扩展和重用代码。在实现游戏时,可能会有不同的游戏模式,或者需要对游戏进行一些特殊的调整。使用class语法可以更加便捷地扩展和修改游戏的逻辑,提高代码的可维护性和可扩展性。
还可以更加方便地进行代码的组织和管理。游戏逻辑封装在一个类中,可以更加清晰地表达游戏的结构和关系,方便代码的组织和管理。同时还可以更加方便地进行代码的测试和调试,提高代码的质量和可靠性。
class TypingGame { constructor() { this.canvas = document.getElementById("gameCanvas"); this.context = this.canvas.getContext("2d"); this.gameStatus = "looping" // 游戏状态,初始值为 "looping" this.blinkInterval = null; this.score = 0 // 得分,初始值为 0 this.wordList = []; this.SPEED = 1; // 字符下落速度 this.ANGLE = Math.PI / 2; this.words = ["apple", "orange", "banana", "pear", "grape"]; this.userInput = document.getElementById("userInput"); this.resetButton = document.getElementById("resetButton"); this.addNewWord = this.addNewWord.bind(this); this.handleKeyPress = this.handleKeyPress.bind(this); this.resetGame = this.resetGame.bind(this); this.update = this.update.bind(this); this.drawWord = this.drawWord.bind(this); this.handleWordMatch = this.handleWordMatch.bind(this); this.handleWordMiss = this.handleWordMiss.bind(this); this.init(); } /** * 初始化游戏 */ init() { // 随机生成一些单词 this.generateRandomWords(); // 绑定键盘输入事件 this.userInput.addEventListener("keypress", this.handleKeyPress); // 绑定重置游戏按钮点击事件 this.resetButton.addEventListener("click", this.resetGame); // 添加第一个单词 this.addNewWord(); // 开始游戏循环 this.update(); } /** * 随机生成一些单词 */ generateRandomWords() { for (let i = 0; i < 100; i++) { // 随机生成一个指定长度的单词 const word = this.getRandomString(Math.floor(Math.random() * 7) + 3); this.words.push(word); } } /** * 随机生成一个字母 */ getRandomLetter() { const letters = "abcdefghijklmnopqrstuvwxyz"; const index = Math.floor(Math.random() * letters.length); return letters[index]; } /** * 随机生成一个指定长度的单词 */ getRandomString(length) { let result = ""; for (let i = 0; i < length; i++) { result += this.getRandomLetter(); } return result; } /** * 添加新的单词 */ addNewWord() { // 获取单词的宽度 const wordWidth = this.context.measureText(this.getRandomWord()).width; const word = { word: this.getRandomWord(), x: Math.max(wordWidth, Math.random() * (this.canvas.width - wordWidth)), y: 0, angle: this.ANGLE, }; this.wordList.push(word); } /** * 随机获取一个单词 */ getRandomWord() { const index = Math.floor(Math.random() * this.words.length); return this.words[index]; } /** * 更新画面 */ update() { if (this.gameStatus !== "looping") return; // 清空画布 this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); this.wordList.forEach((word, i) => { word.y += this.SPEED; word.x += Math.sin(word.angle); word.angle += Math.random() * 0.1 - 0.05; const x = word.x - this.context.measureText(word.word).width / 2; // 画出单词 this.drawWord(word.word, x, word.y); if (word.x < 0 || word.x > this.canvas.width) { word.angle = -word.angle; } if (word.y > this.canvas.height) { // 处理未输入单词 this.handleWordMiss(word); this.wordList.splice(i, 1); // 添加新的单词 this.addNewWord(); } }); // 请求下一帧动画 requestAnimationFrame(this.update); } /** * 画出单词 */ drawWord(word, x, y) { this.context.font = "30px Arial"; this.context.fillText(word, x, y); } /** * 处理已输入单词 */ handleKeyPress(event) { if (event.keyCode === 13) { const userWord = this.userInput.value; this.userInput.value = ""; this.wordList.forEach((word, idx) => { if (word.word === userWord) { // 处理已输入单词 this.handleWordMatch(word, idx); } }); } } /** * 处理已输入单词 */ handleWordMatch(word, idx) { // 增加得分 this.score++; // 更新得分显示 document.getElementById("score").innerText = this.score; const x = word.x - this.context.measureText(word.word).width / 2; const y = word.y; let isWhite = true; let blinkCount = 0; // 单词闪烁 this.blinkInterval = setInterval(() => { if (isWhite) { this.context.fillStyle = "white"; } else { this.context.fillStyle = "black"; } this.context.fillText(word.word, x, y); isWhite = !isWhite; blinkCount++; if (blinkCount >= 10) { this.context.fillStyle = "black"; this.context.fillText(word.word, x, y); this.wordList.splice(idx, 1) // 添加新的单词 this.addNewWord() clearInterval(this.blinkInterval); } }, 100); } /** * 处理未输入单词 */ handleWordMiss(word) { if (word.y > this.canvas.height) { clearInterval(this.blinkInterval); this.gameStatus = "pause"; this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); this.context.font = "30px Arial"; let text =["你输了,你这个菜鸡,","恭喜你,虽败犹荣,","真棒,我的宝子厉害,"] let textSay=this.score>15?this.score>50?text[2]:text[1]:text[0]; this.context.fillText(`${textSay}分数${this.score}分`, this.canvas.width / 2 - 180, this.canvas.height / 2); } } /** * 重置游戏 */ resetGame() { this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); // 开始游戏循环 requestAnimationFrame(this.update); clearInterval(this.blinkInterval); this.gameStatus="looping"; this.score = 0; // 更新得分显示 document.getElementById("score").innerText = this.score; this.wordList = []; // 添加新的单词 this.addNewWord(); }}const typingGame = new TypingGame();
TypingGame
类是整个游戏的核心。在constructor
方法中,首先初始化了一些游戏状态和相关的变量,然后调用了init
方法,对游戏进行初始化。在init
方法中,定义了一些事件处理方法,如键盘输入事件处理方法、重置游戏按钮点击事件处理方法等等。在init
方法中,还调用了addNewWord
方法,添加了第一个单词,并且开始游戏循环。在update
方法中,主要是更新画面的逻辑,如清空画布、画出单词、处理已输入单词、处理未输入单词等等。在resetGame
方法中,主要是重置游戏的状态,如清空画布、得分归零、添加新的单词等等。
整个游戏的实现比较简单,主要是依赖于Canvas和JavaScript。游戏中使用了一些Canvas的API,如context.fillText()
方法、context.clearRect()
方法等等,同时还使用了一些JavaScript的语言特性,如类、箭头函数等等。如果你对游戏的实现过程感兴趣,可以参考代码中的注释,了解游戏中每个方法的具体实现细节。
四、写在最后
Canvas和JavaScript看似平凡无奇,却能够创造出令人惊叹的数字世界。在这个数字化时代,掌握这些工具已经成为了一种竞争优势。本篇文章将带领读者一起探索Canvas和JavaScript的世界,通过实现一个打字游戏,领略这些工具的神奇之处。
游戏的实现并不复杂,但却需要运用许多Canvas的API和JavaScript的语言特性。通过随机生成单词、让单词下落、根据用户输入判断单词是否匹配等等,我们成功实现了一个简单而有趣的游戏。在实现游戏的过程中,我们也学习了一些Canvas的API和JavaScript的语言特性,例如类、箭头函数等等。
本文转载于:
https://juejin.cn/post/7217704608034193468
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
环球快看点丨记录--Canvas实现打飞字游戏
微信小程序订阅消息开发指南(java)
环球动态:Midjourney? 文心一格? 一张思维导图带你了解图片生成AI
张同乐-从零开始,打造高效可靠的Locust性能测试
星城控股20亿元私募债券获上交所受理
张颂文败给了新海诚?同上映11天:两部新片口碑相仿 票房差距5亿
世界速递!成都一公寓按排量收停车费每月最低1200元 官方回应:可自行定价
北野武悼念坂本龙一:朋友们都不在了 只剩下我一个人
环球新动态:无任何定语!真我GT Neo5 SE预售销量破纪录:1999元真香
世界微头条丨《小美人鱼》新镜头截图:爱丽儿抚摸王子脸 王子尬笑
极氪001车主吐槽:语音助手突然出现故障,无法语音识别指令
Flask框架cbv的写法、请求与响应、请求扩展、session源码分析、闪现
HEU KMS Activator 30.2.0全能系统数字许可激活工具 (全新激活版)
DecisionTreeClassifier&DecisionTreeClassRegression
GPT-4 还没玩透,GPT-5已遭众人围剿
Python常见面试题015.请实现一个如下功能的函数
焦点快报!任天堂或将进军手游!宣布与DeNA合作创立新公司
世界通讯!终于不用忍受熊孩子了!复兴号智能动车上线“静音车厢”
世界微资讯!真不是电影特效!武汉大暴雨白天秒变黑夜:雷电大风齐上阵
当前动态:3月新势力销量排名:理想断崖领先 第二名只卖一款车
身残技坚 国外一《守望先锋2》眼睛残疾玩家达到大师段位
【焦点热闻】《秋叶原物语2导演剪辑版》Switch中文版开启预购 4月20日发售
全球即时:统一观测丨使用 Prometheus 监控 Nginx Ingress 网关最佳实践
世界观热点:第06章 索引的数据结构
阿里云EMAS移动测试最佳实践|马来西亚第一大电子钱包通过EMAS测试提效6倍
提供一个SpringCloud Gateway获取body参数的方法
每日机构分析:4月3日
当前热门:7个摄像头走天下!大疆千元级智驾方案炸场:马斯克看了都得服
【环球热闻】2022胡润品牌榜发布:贵州茅台第一 阿里巴巴赢麻了
1999元潮玩电竞旗舰!真我GT Neo5 SE图赏
vivo X Flip真机亮相:超大外屏、紫色菱格纹吸睛
环球消息!日本8336米深海发现怪鱼:上岸就融化成“果冻状”
天天要闻:张艺兴受邀参加2023「钟表与奇迹」日内瓦高级钟表展
介绍一下requestAnimationFrame和requestIdleCallback
以 100GB SSB 性能测试为例,通过 ByteHouse 云数仓开启你的数据分析之路
验证码案例|深圳人才网信息安全
智能云呼叫中心系统的功能
云南怒江:“四聚焦”推动招商引资工作再上新台阶
天天快资讯:很良心?RTX 4070非公版亮相零售商店 这价格买不买
【全球新视野】A股公司已有51位“90后”董事长 网友:这就叫年少有为?
全球热讯:特斯拉地库“起飞” 破墙连撞6车
锐龙 9 7945HX加持!华硕ROG魔霸7 Plus超能版图赏
当前快讯:形似小鹏P7 网传小米汽车曝光?实为大运旗下、曾“溜”出展台
今日快讯:Neovim,要尝一口不?
每日关注!利用高德地图 API 显示地图信息
呼和浩特:春雨贵如油!气象部门开展人工增雨作业 助力蓄水增墒
世界看点:一个时代结束!小灵通退出日本市场 中国运营商早已抛弃
世界新消息丨ChatGPT大封号、亚洲成重灾区!网友自救喊话:不要登录、不要登录
【报资讯】业主投诉邻居每天5点剁馅:万没想到结果是只啄木鸟
北京银行短贷宝多久时间到账?北京银行短贷宝怎么申请?
朱拉隆功大学相当于国内什么大学?朱拉隆功大学留学条件
泰版流星花园花泽类的扮演者是谁?泰版流星花园演员表
郑秀妍和郑秀晶的关系是什么?郑秀妍个人简介资料
多宁生物拟香港IPO上市,招股书显示2022年净利降86%
杨迪达人秀是哪一届?杨迪在达人秀里表演的是什么节目?
环球最新:从C#中的数组中删除指定元素的几种方法,超简单
【天天新要闻】经验不足口气不小!韩国企业自研首枚商用火箭:要追上SpaceX
今日快看!摩托车、电动自行车头盔新国标正式发布:三大特点
环球热讯:每天扫码60亿次!条形码迎来50岁生日:首用于口香糖
今日热门!服务业开始了?麦当劳暂时关闭美国办公室:将通知裁员事宜
国乒官宣世乒赛参赛名单!林高远压线入围男单,林诗栋蒯曼打混双
广汉鲜花礼品
当前短讯!使用篇丨链路追踪(Tracing)其实很简单:请求轨迹回溯与多维链路筛选
天天快看:mysql/mariadb配置详解
世界报道:“5步”做好研发效能度量,打造DevOps研发管理闭环
2022年全国因公牺牲民警308名 辅警179名
世界观热点:小牛自游家汽车真要“黄了”?官方APP已停止服务
独家!RTX 4070国行价格确定:比预期贵那么一点点
每日看点!《铃芽之旅》连续10天票房日冠:观影人次第一
世界微速讯:亏电油耗5.55升 新款魏牌摩卡DHT-PHEV官图曝光:改头又换面
速递!热气球空中起火:画面骇人!致墨西哥两游客身亡
【时快讯】南阳市西峡县:寻访老君印迹 畅游紫荆花海
当前速读:大众将停产燃油版高尔夫车型,但将保留该名称用于未来的电动车型
天天观天下!云原生(一):云原生是什么
世界滚动:React Native 开发环境搭建
今日最新!易基因-单细胞甲基化测序&单细胞转录组测序
环球速看:山东:聚焦这些重点领域做好恶劣天气防范应对
真我11系列配置出炉:首发联发科新平台 顶配16GB+1TB
大容量还防水!宏碁15.6寸电脑双肩包大促:券后69元(省130元)
环球即时看!贵州遵义遇暴雨冰雹 街上冰雹流成河:帐篷都被吹飞
全球播报:新能源汽车安全吗?中科院院士:2021年起火3千辆 起火率约为万分之一
B站上线综艺《原梦冒险团》:一加Ace 2抢镜 性能标杆
祝贺!白城医学高等专科学校运动员荣获这个项目金牌
比亚迪高端MPV腾势D9 3月销量10398辆:35万以上新能源豪华MPV第一
暴雨预警来了:逾10省区市将现大到暴雨!今年来范围最广最强雨雪上线
环球实时:降价威力巨大!特斯拉一季度交付量暴涨36%
世界新消息丨10-15万中美德日韩轿车大横评 论省油:比亚迪秦PLUS DM-i真大哥
花木小志
当前热点-读SQL进阶教程笔记06_外连接
全球今头条!简单实用出入库管理系统开源 实用进销存管理系统 快销品管理平台 电商进出库管理系统 开源下载
快报:求求你别乱脱敏了!MyBatis 插件 + 注解轻松实现数据脱敏,So easy~!
博客园添加打赏按钮
Pytorch 备忘清单_开发速查表分享
中金普洛斯REIT第一次扩募并新购入基础设施项目正式获批
吸收外资扩量更要提质
年内19只债基降低管理费 一级债基成主力
环球热点!当市场恐慌时,美联储会采取行动吗?
陕西省19个农产品区域公用品牌亮相第22届绿色食品博览会
环球微头条丨你为啥不升级Win11?数据:Win11份额历史新高 用过都说好?
每日热点:想薅羊毛?本轮汽车降价你需要知道事:10万以下车别想 理想蔚来等不跟定位豪华