我的编程空间,编程开发者的网络收藏夹
学习永远不晚

HTML5怎么实现3D迷宫

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

HTML5怎么实现3D迷宫

这篇文章主要讲解了“HTML5怎么实现3D迷宫”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5怎么实现3D迷宫”吧!

功能描述:

左右方向键控制玩家的方向,上下方向键控制玩家的前进和后退。

效果预览:

HTML5怎么实现3D迷宫

实现原理:

在上面的效果预览中,可以看到右边是2D的平面地图,而左边的则是***人称的3D视图,这两幅图的关系是非常密切的,实质上,实现3D视觉的过程,就是依据2D地图把地图转换成***人称视觉的过程。

在之前的一篇文章:《javascript实现3D房间》中,3D效果的实现只局限于平面(意思是从侧面看没有立体效果),在这种有局限性的3D效果中,我们以一个个物体为单位,通过不同物体平面之间的视觉差实现3D。而在这次的效果中,为了使物体从不同角度看都能具有立体效果,我们把单位从平面改成线。

首先,我们创建一个叫视觉平面的东西,它像一面镜子,把实物投影到一个平面上,首先初始化该平面的尺寸:

screenSize:[320,240],//视觉屏幕尺寸

之后,我们可以以1像素为单位,只要知道物体每个像素在该视觉平面上显示出来的高度,就可以绘制出物体在***人称视觉上的效果。

以视觉平面上的***个像素线段为例,根据比例可得知:玩家到视觉平面的距离/玩家到物体的实际距离=物体在视觉平面上的高度/物体的实际高度。由于玩家到视觉平面的距离和物体的实际高度我们可以自己定义,因此我们只要知道玩家到物体的距离,就可以知道物体该像素在视觉平面的高度。

怎样知道玩家到物体的实际距离呢?这时我们就需要借助和3D视觉图密切相关的2D地图了。首先,我们定义玩家的***视觉角度为60度(意思是玩家的视觉范围角度),由于我们现在处理的是平面的***条像素线,因此该像素线相对于玩家的角度就为-30度。在地图上,我们可以知道玩家的X,Y位置和玩家的方向,因此我们就可以知道***条像素线在地图上的方向。

在2D地图上怎么表示3D视觉平面上的一条像素线呢?其实仔细想想就可以发现,3D视觉平面中的一条像素线,相当于2D地图上特定方向上发出的一条射线,射线与物体的交点就是3D视觉平面中的那条像素线的内容。因此,只要我们计算出该射线的长度(起点:玩家位置 终点:射线和物体相交的位置),就可以知道玩家与物体的距离,从而求得改像素的物体在视觉平面上的高度。

***只要循环遍历视觉平面上的每一条1px宽的像素线,并根据2D地图上对应射线的长度,就可以求得视觉平面上所有视觉范围内的物体每一像素的高度,形成3D视觉效果。

代码分析:

主要看实现的核心代码,循环遍历视觉平面上每条像素线,绘制出该像素线上的物体内容:

var context=this.screenContext;       context.clearRect(0,0,this.screenSize[0],this.screenSize[1]);      context.fillStyle="rgb(203,242,238)";      context.fillRect(0,0,this.screenSize[0],this.screenSize[1]/2);      context.fillStyle="rgb(77,88,87)";      context.fillRect(0,this.screenSize[1]/2,this.screenSize[0],this.screenSize[1]/2);

由于该效果需要两个canvas(一个显示地图,一个显示3D视觉图),因此我们首先获取3D视觉图上的canvas,并绘制地面和天空。

//cnGame.context.beginPath();      for(var index=0,colCount=this.screenSize[0]/this.viewColWidth;index<colCount;index++){          screenX=-this.screenSize[0]/2+index*this.viewColWidth;//该竖线在屏幕的x坐标              colAngle=Math.atan(screenX/this.screenDistant);//玩家的视线到屏幕上的竖线所成的角度          colAngle%=2*Math.PI;          var angle=this.player.angle/180*(Math.PI)-colAngle;//射线在地图内所成的角度          angle%=2*Math.PI;          if(angle<0){              angle+=2*Math.PI;          }          distant=0;          x=0;          y=0;          centerX=this.player.x+(this.player.width)/2;//玩家中点X坐标          centerY=this.player.y+(this.player.height)/2;//玩家中Y坐标          while(this.map.getPosValue(centerX+x,centerY-y)==0){              distant+=1;              x=distant*Math.cos(angle);              y=distant*Math.sin(angle);          }          //如果射线在地图遇到墙壁,则画线                              distant*=Math.cos(colAngle);//防止鱼眼效果                heightInScreen=this.screenDistant/(distant)*this.wallSize[2];//根据玩家到墙壁的距离计算墙壁在视觉平面的高度          var img=cnGame.loader.loadedImgs[class="lazy" data-srcObj.stone2];          context.drawImage(img,0,0,2,240,this.viewColWidth*index,(this.screenSize[1]-heightInScreen)/2, this.viewColWidth,heightInScreen)          }

之后,就可以开始循环遍历每条像素线,绘制出物体内容。在处理每条像素线的过程中,我们让射线每次增加1像素的长度,当射线遇到非空地的时候(getPosValue(x,y)>0),就停止增长,并记录下此时射线的长度,该长度就是玩家到该像素线内容的实际距离。

上面代码中,注释掉的部分其实就是用于绘制出发射的射线,如果大家有需要,可以恢复该部分的代码,就可以看到玩家的视觉范围。

需要注意的是,由于视觉平面有区别人的眼球(是一个平面而非球体),因此我们还需要使距离乘上玩家视觉角度的余弦值,从而避免了鱼眼效果。

***,我们还可以在3D视觉图上绘制出玩家(拿枪的手),达到更好的效果。

感谢各位的阅读,以上就是“HTML5怎么实现3D迷宫”的内容了,经过本文的学习后,相信大家对HTML5怎么实现3D迷宫这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

HTML5怎么实现3D迷宫

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Unity怎么实现3D迷宫小游戏

这篇文章主要介绍了Unity怎么实现3D迷宫小游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Unity怎么实现3D迷宫小游戏文章都会有所收获,下面我们一起来看看吧。一、前言闲来无事,从零开始整个《3D迷宫》
2023-06-29

Java怎么实现迷宫游戏

这篇文章给大家分享的是有关Java怎么实现迷宫游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序,可重
2023-06-14

C++基于easyx怎么实现迷宫游戏

本篇内容介绍了“C++基于easyx怎么实现迷宫游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果:#define _CR
2023-06-30

Java递归怎样实现迷宫游戏

本篇文章为大家展示了Java递归怎样实现迷宫游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.问题由来迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设
2023-06-22

Python如何实现迷宫生成器

这篇文章主要介绍了Python如何实现迷宫生成器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何实现迷宫生成器文章都会有所收获,下面我们一起来看看吧。首先展示一下效果图:我们先分析一下所需的库:既
2023-07-02

Python如何实现过迷宫小游戏

小编给大家分享一下Python如何实现过迷宫小游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发工具Python版本: 3.6.4相关模块:pygame模块;以及一些Python自带的模块。环境搭建安装Python并添
2023-06-22

如何实现一个canvas迷宫游戏

小编给大家分享一下如何实现一个canvas迷宫游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!正文实现这个小游戏也不难,让我们想想,一个迷宫游戏有哪些基本要素。
2023-06-09

编程热搜

目录