[JavaScript游戏开发] 绘制Q版地图、键盘上下左右地图场景切换

系列文章目录

第一章 2D二维地图绘制、人物移动、障碍检测
第二章 跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示)
第三章 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测
第四章 绘制Q版地图、键盘上下左右地图场景切换


文章目录

  • 系列文章目录
  • 前言
  • 一、本章节效果图
  • 二、任务拆解
    • 2.1、准备【地图层图片】
    • 2.2、准备【游戏窗口层】
      • 2.2.1、CSS position属性
      • 2.2.2、CSS overflow属性
      • 2.2.3、CSS background-color属性
    • 2.3、准备【游戏地图层】
      • 2.3.1、CSS z-index属性
    • 2.4、实现【键盘上下左右操作】
  • 总结


前言

本章内容在第一章的基础上进行了升级,因此带大家回顾下第一章的内容。

第一章:

  • 使用JavaScript绘制简单的二维地图
    采用二维数组存储地图信息,使用表格绘制地图,每个td单元格存储数据
  • 键盘上下左右控制
    使用JavaScript keyPress键盘事件监听WASD键,按键触发时人物做出相应操作
  • 障碍物碰撞检测(采用格子碰撞检测)
    人物下一步碰撞到石头时,提示遇到障碍,终止人物运动

本章节采用第一章节的键盘上下左右事件控制,同时把地图层与数据层(二维网格、人物)分离,作为单独的模块。


一、本章节效果图

在这里插入图片描述

二、任务拆解

1、准备【地图层图片】,找一张酷炫的地图
2、准备【游戏窗口层】,设置为浏览器可视区域高、宽
3、准备【游戏地图层】,设置为地图图片自身高、宽
4、实现【键盘上下左右操作】,让【游戏地图层】在【游戏窗口层】可视区域内上下作用移动,并实现边界功能
5、看看最终效果
在这里插入图片描述

2.1、准备【地图层图片】

找到一张足够大的Q版地图(PS:传奇、问道的大地图宽度可达2万+px)
在这里插入图片描述

2.2、准备【游戏窗口层】

设置游戏窗口层为浏览器可视区域高、宽,其余内容将不可见
1、指定div的ID=parentDiv(id=“parentDiv”);
2、指定块高、块宽为浏览器窗口的95%(width: 95%; height: 95%; );
3、指定parentDiv,相对于body元件定位,初始状态下margin-left、margin-top都为0(默认值) ( position: absolute; );
4、设置背景色为红色(便于调试时避免图层超出游戏窗口层)(background-color: red; );
5、设置游戏窗口层溢出被剪切,其余内容将不可见(展示固定窗口的地图,其余内容不可见)(overflow: hidden; )

<body><div style="width: 95%; height: 95%; position: absolute; 
		background-color: red; overflow: hidden; " id="parentDiv"></div></body>

涉及知识点:CSS position属性、CSS overflow属性、CSS background-color属性
在这里插入图片描述

2.2.1、CSS position属性

position属性指定用于元素的定位方法的类型(static, relative, absolute, fixed, sticky)

  • CSS语法
    position: static|absolute|fixed|relative|sticky|initial|inherit;
  • 属性值
    性值描述
    tatic默认值。 按它们出现在文档流中元素顺序呈现
    bsolute元件相对于其第一定位(非静态)祖先元件定位
    ixed元素相对于浏览器窗口定位
    elative元素相对于其正常位置定位,因此“left:20px”将20个像素添加到元素的左边位置
    ticky元素根据用户的滚动位置定位,粘性元素在相对和固定之间切换,具体取决于滚动位置。 它被相对定位,直到在视口中满足给定的偏移位置 - 然后它“粘住”到位(如position:fixed)
    nherit从其父元素继承此属性

2.2.2、CSS overflow属性

overflow属性指定内容溢出元素框时应发生的情况。此属性指定当元素的内容太大而无法放入指定区域时是剪辑内容还是添加滚动条。
注意:overflow属性仅适用于具有指定高度的块元素。

  • CSS语法
    overflow: visible|hidden|scroll|auto|initial|inherit;
  • 属性值
    性值描述
    isible溢出没有被剪裁。 它呈现在元素框之外。 这是默认的
    idden溢出被剪切,其余内容将不可见
    croll剪辑溢出,但添加滚动条以查看其余内容
    uto如果剪切了溢出,则应添加滚动条以查看其余内容
    nherit从其父元素继承此属性

2.2.3、CSS background-color属性

background-color属性设置元素的背景颜色。元素的背景是元素的总大小,包括填充和边框(但不是边距)。
提示:使用背景颜色和文本颜色使文本易于阅读,此处便于调试时便于调整画布的边界

  • CSS语法
    background-color: color|transparent|inherit;
  • 属性值
    性值描述
    olor指定背景颜色。 查看CSS颜色值以获取可能颜色值的完整列表。
    ransparent指定背景颜色应该是透明的。 这是默认的
    nherit从其父元素继承此属性。

2.3、准备【游戏地图层】

1、在id="parentDiv"的div容器里,放置【游戏地图层】;
2、设置【游戏地图层】的id=“mapDiv”;
3、设置【游戏地图层】的高度、宽度,1比1比例还原原图尺寸;
4、设置【游戏地图层】的z-index,使得能显示出来的地图,放置在parentDiv容器之上;

<div style="width: 95%; height: 95%; position: absolute;
	background-color: red; overflow: hidden; " id="parentDiv"><div style="z-index: 1; height: 2480px; width: 3280px" id="mapDiv"></div>
</div>

在这里插入图片描述
**涉及知识点:CSS z-index属性

2.3.1、CSS z-index属性

z-index属性指定元素的堆栈顺序。堆栈顺序较大的元素始终位于堆栈顺序较低的元素前面。
注意: z-index仅适用于定位元素(position:absolute, position:relative, 或 position:fixed)

  • CSS语法
    z-index: auto|number|inherit;
  • 属性值
    性值描述
    uto将堆栈顺序设置为等于其父项。 这是默认的
    umber设置元素的堆栈顺序。 允许使用负数
    nherit从其父元素继承此属性。

2.4、实现【键盘上下左右操作】

让【游戏地图层】在【游戏窗口层】可视区域内上下作用移动,并实现边界功能
在这里插入图片描述

<script>//文档准备好之后开始执行window.onload = function () {init();}var mapDivEle;var parentDivEle;var stepDistance = 20;/*** 定义游戏窗口层、游戏地图层,并渲染页面*/function init() {// 定义游戏窗口层parentDivEle = document.getElementById("parentDiv");// 定义游戏地图层mapDivEle = document.getElementById('mapDiv');//渲染地图loadData();}/***  渲染地图* @param mapData*/function loadData() {// 加载地图mapDivEle.style.background= 'url("../img/item/bg/os.jpg")';}/*** 定义 键盘上下左右事件* 并判断边界* @param e*/var keydown = function (e) {if (e.keyCode == 37) {console.log("向左")if( Number(mapDivEle.style.marginLeft.replaceAll("px", "")) < 0 ) {mapDivEle.style.marginLeft = Number(mapDivEle.style.marginLeft.replaceAll("px", "")) + stepDistance + "px";} else {console.log("超出边界")}} else if (e.keyCode == 38) {console.log("向上")if( Number(mapDivEle.style.marginTop.replaceAll("px", "")) < 0 ) {mapDivEle.style.marginTop = Number(mapDivEle.style.marginTop.replaceAll("px", "")) + stepDistance + "px";} else {console.log("超出边界")}} else if (e.keyCode == 39) {console.log("向右")if ( (parentDivEle.clientWidth) - mapDivEle.clientWidth + stepDistance <= Number(mapDivEle.style.marginLeft.replaceAll("px", ""))) {mapDivEle.style.marginLeft = Number(mapDivEle.style.marginLeft.replaceAll("px", "")) - stepDistance + "px";} else {console.log("超出边界")}} else if (e.keyCode == 40) {console.log("向下")if( (parentDivEle.clientHeight) - mapDivEle.clientHeight + stepDistance <= Number(mapDivEle.style.marginTop.replaceAll("px", "")) ) {mapDivEle.style.marginTop = Number(mapDivEle.style.marginTop.replaceAll("px", "")) - stepDistance + "px";} else {console.log("超出边界")}}}
</script><body onkeydown="keydown(event)">......
</body>

总结

以上就是今天要讲的内容,本文仅仅简单介绍地图的移动,后续以此为基本,实现地图跟随英雄人物动态移动功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/90825.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业直播MR虚拟直播(MR混合现实直播技术)视频介绍

到底什么是企业直播MR虚拟直播&#xff08;MR混合现实直播技术&#xff09;&#xff1f; 企业直播MR虚拟直播新玩法&#xff08;MR混合现实直播技术&#xff09; 我的文章推荐&#xff1a; [视频图文] 线上研讨会是什么&#xff0c;企业对内对外培训可以用线上研讨会吗&#x…

Nginx网站服务(安装nginx、平滑升级nginx、nginx各种访问配置)

一、Nginx概述 1、什么是nginx&#xff1f; 稳定性高、系统资源消耗低、对HTTP并发连接的处理能力高&#xff08;单台物理器可支持30000-50000个并发请求&#xff09; NG并发连接能力有2个因素的影响 ①CPU的个数 ②本地吴立琪系统的最大文件打开数2、Nginx应用场景 静态服…

pwm接喇叭搞整点报时[keyestudio的8002模块]

虽然现在查看时间很方便&#xff0c;但是其实好像我的时间观念却越来越差。于是决定搞一个整点报时&#xff0c;时常提醒自己时光飞逝&#xff0c;不要老是瞎墨迹。 这篇主要讲一下拼装方式和配置&#xff0c;就差不多了。不涉及什么代码。3针的元器件&#xff0c;去掉正负接线…

html css实现爱心

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…

机器学习算法之-逻辑回归(1)

什么是回归 回归树&#xff0c;随机森林的回归&#xff0c;无一例外他们都是区别于分类算法们&#xff0c;用来处理和预测连续型标签的算法。然而逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问…

在P4(Perforce)中使用TortoiseMerge来比较合并

一直习惯于svn的比较合并工具&#xff0c;会觉得p4自带的反人性。还好p4可以在设置里替换成外部的比较合并工具。方法见下图&#xff1a; 1. 比较 2. 合并 注意&#xff0c;如果合并设置有问题&#xff08;某些P4版本&#xff09;&#xff0c;则需要通过一个bat文件来做中转&a…

python 多个字符替换为一个字符(简洁代码)

在windows系统当中的文件命名&#xff0c;有些特殊字符是不能存在&#xff0c;下面我们来看一下哪些字符不能存在。 文件名称中不能包含\ / : * ? " < > |一共9个特殊字符 一开始想用replace()替换&#xff0c;但是要处理多个字符&#xff0c;写起来代码不整洁 每次…

SpringBoot3集成Redis

标签&#xff1a;Redis.Mybatis.Lock&#xff1b; 一、简介 缓存在项目开发中&#xff0c;基本上是必选组件之一&#xff0c;Redis作为一个key-value存储系统&#xff0c;具备极高的数据读写效率&#xff0c;并且支持的数据类型比较丰富&#xff0c;在业务场景中的应用非常广泛…

web基础入门和php语言基础入门 二

web基础入门和php语言基础入门 二 MySQL入门-续MySQL之数据查询操作MySQL其他知识点 php语言基础入门认识PHPPHP的工作流程安装PHP环境认识一个PHP程序PHP基础知识点进入正题 PHP与WEB交互PHP与MySQL交互总结 MySQL入门-续 MySQL之数据查询操作 WHERE 子句&#xff0c;条件限…

基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

极狐GitLab 企业级 CI/CD 规模化落地实践指南(一)

目录 template 引用&#xff0c;减少代码冗余&#xff0c;增强 CI/CD 构建扩展性 问题 1&#xff1a;代码冗余&#xff0c;低效实践 问题 2&#xff1a;维护性难&#xff0c;工作量大 ➤ local ➤ file ➤ remote ➤ template 收益 1&#xff1a;一处修改&#xff0c;多…

CSS变形与动画(二):perspctive透视效果 与 preserve-3d 3d效果(奥运五环例子)

文章目录 perspective 3d透视效果preserve-3d 3d嵌套效果例子 奥运五环 backface-visibility 背面效果 perspective 3d透视效果 perspective 指定了观察者与 z0 平面的距离&#xff0c;使具有三维位置变换的元素产生透视效果。z>0 的三维元素比正常大&#xff0c;而 z<0 …

【C快学-C语言程序设计(基础篇)】从VSCode中使用C编写我的第一个Hello world

简介&#xff1a;本专栏是一个C语言基础入门知识学习的一个专栏 面向&#xff1a;广大C友 工具&#xff1a;VSCODE 博主&#xff1a;一个友好且宠粉的博主&#xff0c;送书活动小专栏&#xff0c;不定期抽奖送图书给粉丝 社区&#xff1a;&#x1f988;山鱼社区 1.如何配置C语言…

深入探索Spring框架:解密核心原理、IOC和AOP的奥秘

深入探索Spring框架&#xff1a;解密核心原理、IOC和AOP的奥秘 1. 理解 Spring 的核心原理1.1 控制反转&#xff08;IOC&#xff09;1.2 面向切面编程&#xff08;AOP&#xff09; 2. 深入 IOC 容器的实现机制2.1 容器的创建2.2 Bean 的生命周期2.3 依赖注入 3. 深入 AOP 的实现…

代理模式【Proxy Pattern】

什么是代理模式呢&#xff1f;我很忙&#xff0c;忙的没空理你&#xff0c;那你要找我呢就先找我的代理人吧&#xff0c;那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧&#xff0c;那就是两个人具备同一个接口&#xff0c;代理人虽然不能干活&#xff0c;但是被 代…

最新AI创作系统ChatGPT程序源码+详细搭建部署教程+微信公众号版+H5源码/支持GPT4.0+GPT联网提问/支持ai绘画+MJ以图生图+思维导图生成!

使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到系统&#xff01; 新增 MJ 官方图片重新生成指令功能同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle)同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x新增GPT联网提问功能、手机号注…

“new出对象“原理的深层解密

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

欧拉函数和最大公约数

分析&#xff1a;如果两个数的最大公约数是一个质数p&#xff0c;那么这两个数都除以p&#xff0c;得到的两个数的最大公约数一定是1. 反证法&#xff1a;如果得到的两个数的最大公约数不是1&#xff0c;那么把此时的最大公约数乘以上边的最大公约数&#xff0c;得到的一定比上…

Go语言工程实践之测试与Gin项目实践

Go 语言并发编程 及 进阶与依赖管理_软工菜鸡的博客-CSDN博客 03 测试 回归测试一般是QA(质量保证)同学手动通过终端回归一些固定的主流程场景 集成测试是对系统功能维度做测试验证,通过服务暴露的某个接口,进行自动化测试 而单元测试开发阶段&#xff0c;开发者对单独的函数…

C# int和uint类型学习

在C#中&#xff0c;使用int表示整数类型&#xff0c;对应于.NET的System.Int32结构&#xff1b; C#中的int类型占4字节(4*832位)内存空间&#xff0c;其范围从-2,147,483,648 到 2,147,483,647&#xff1b; int类型是默认的整数类型&#xff0c;并且默认值是0&#xff1b; u…