HTML小游戏25 —— HTML5拉杆子过关小游戏(附完整源码)

2023-11-22 09:40

本文主要是介绍HTML小游戏25 —— HTML5拉杆子过关小游戏(附完整源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节教程我会带大家使用 HTML 、CSS和 JS 来制作一个HTML5拉杆子过关小游戏

✨ 前言


🕹️ 本文已收录于🎖️100个HTML小游戏专栏:100个H5游戏专栏https://blog.csdn.net/qq_53544522/category_12064846.html
🎮 目前已有100+小游戏,源码在持续更新中,前100位订阅限时优惠,先到先得。
🐬 订阅专栏后可阅读100个HTML小游戏文章;还可私聊进前端/游戏制作学习交流群;领取一百个小游戏源码。

在线演示地址:https://code.haiyong.site/964/
源码也可在文末进行获取


✨ 项目基本结构


大致目录结构如下(共3个子文件):

├── js
│   └──script.js 13KB
├── css
│   └── style.css 1KB
└── index.html 2KB

场景展示

HTML源码

<div class="container"><div id="score"></div><canvas id="game" width="375" height="375"></canvas><div id="introduction">按住鼠标伸出一根棍子</div><div id="perfect">双倍积分</div><button id="restart">重新开始</button>
</div>

CSS 源码

html,body

html,
body {height: 100%;margin: 0;
}body {font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;cursor: pointer;
}

container

.container {display: flex;justify-content: center;align-items: center;height: 100%;
}

score

#score {position: absolute;top: 30px;right: 30px;font-size: 2em;font-weight: 900;
}

introduction

#introduction {width: 200px;height: 150px;position: absolute;font-weight: 600;font-size: 0.8em;font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;text-align: center;transition: opacity 2s;
}

restart

#restart {width: 120px;height: 120px;position: absolute;border-radius: 50%;color: white;background-color: red;border: none;font-weight: 700;font-size: 1.2em;font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;display: none;cursor: pointer;
}

perfect

#perfect {position: absolute;opacity: 0;transition: opacity 2s;
}

JS 源码

js 代码较多,这里提供部分,完整源码可以在文末下载

配置

const canvasWidth = 375;
const canvasHeight = 375;
const platformHeight = 100;
const heroDistanceFromEdge = 10; // 等待时
const paddingX = 100; // 从原始画布尺寸开始,英雄的等待位置
const perfectAreaSize = 10;

重置游戏变量和布局,但不启动游戏(游戏在按键时开始)

function resetGame() {// 重置游戏进度phase = "waiting";lastTimestamp = undefined;sceneOffset = 0;score = 0;introductionElement.style.opacity = 1;perfectElement.style.opacity = 0;restartButton.style.display = "none";scoreElement.innerText = score;// 第一个平台总是相同的x+w必须匹配paddingXplatforms = [{ x: 50, w: 50 }];generatePlatform();generatePlatform();generatePlatform();generatePlatform();sticks = [{ x: platforms[0].x + platforms[0].w, length: 0, rotation: 0 }];trees = [];generateTree();generateTree();generateTree();generateTree();generateTree();generateTree();generateTree();generateTree();generateTree();generateTree();heroX = platforms[0].x + platforms[0].w - heroDistanceFromEdge;heroY = 0;draw();
}

最远树右边缘的X坐标

  const lastTree = trees[trees.length - 1];let furthestX = lastTree ? lastTree.x : 0;

如果按下空格键,则重新启动游戏

window.addEventListener("keydown", function (event) {if (event.key == " ") {event.preventDefault();resetGame();return;}
});

返回棍子击中的平台(如果没有击中任何棍子,则返回未定义)

function thePlatformTheStickHits() {if (sticks.last().rotation != 90)throw Error(`Stick is ${sticks.last().rotation}°`);const stickFarX = sticks.last().x + sticks.last().length;const platformTheStickHits = platforms.find((platform) => platform.x < stickFarX && stickFarX < platform.x + platform.w);// 如果棍子击中完美区域if (platformTheStickHits &&platformTheStickHits.x + platformTheStickHits.w / 2 - perfectAreaSize / 2 <stickFarX &&stickFarX <platformTheStickHits.x + platformTheStickHits.w / 2 + perfectAreaSize / 2)return [platformTheStickHits, true];return [platformTheStickHits, false];
}

将主画布区域居中到屏幕中间

  ctx.translate((window.innerWidth - canvasWidth) / 2 - sceneOffset,(window.innerHeight - canvasHeight) / 2);

绘制场景

  drawPlatforms();drawHero();drawSticks();

山丘是伸展的正弦波下的形状

function drawHill(baseHeight, amplitude, stretch, color) {ctx.beginPath();ctx.moveTo(0, window.innerHeight);ctx.lineTo(0, getHillY(0, baseHeight, amplitude, stretch));for (let i = 0; i < window.innerWidth; i++) {ctx.lineTo(i, getHillY(i, baseHeight, amplitude, stretch));}ctx.lineTo(window.innerWidth, window.innerHeight);ctx.fillStyle = color;ctx.fill();
}

 ⭐️ 好书推荐

电脑入门基础教程(Windows 11+Office 2021)

内容介绍

全书共 15 章,系统并全面地讲解了电脑基础知识、电脑入门操作、Windows 11 系统的操作与应用、电脑打字的方法、电脑文件的管理、电脑软件的安装与管理、电脑连网和上网操作、网络通信与聊天交流、网上日常生活与娱乐、电脑系统维护与安全防范,以及使用Word 2021、Excel 2021 和PowerPoint 2021 高效办公等知识技能。

源码下载

1.CSDN资源下载:https://download.csdn.net/download/qq_44273429/87778335


2.也可通过下方卡片添加好友回复拉杆子获取

这篇关于HTML小游戏25 —— HTML5拉杆子过关小游戏(附完整源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409233

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭