基于 JavaScript 技术的 Raycast 引擎开发





5.00/5 (1投票)
这项工作提出了基于 JavaScript 技术开发 Raycast 引擎,以促进 3D 游戏开发。
1. 引言
受巴西和世界范围内玩家社区快速增长的激励,对生产力更高的游戏开发工具和低成本引擎的追求,在当前游戏开发中开辟了广泛的选择。
基于此场景,本文是一系列文章(Silva, Silva 和 Macario, 2022)的一部分,旨在促进技术和实践的验证,作为电子游戏开发的辅助机制。所有项目都具有实践性质,始终保持教学、实验的特点,并始终努力为计算机科学和游戏制作社区做出贡献。
2. 背景
光线投射是一种用于模拟与虚拟对象物理交互的简单技术,当我们看到环境中的某个物体并想知道它是如何移动或旋转时,我们会检查它是否与周围的其他物体发生碰撞,如果发生碰撞,我们会通过计算它与周围所有物体表面之间的交点来将其移开,然后我们可以相应地更新其位置,使其再次回到视野中,而不会破坏它仍在场景中的错觉。
如今,游戏创作常常会遇到一些障碍,例如可访问性,例如,一台机器无法满足引擎的最低要求,导致用户对游戏创作失去兴趣。
3. 目标和方法
这项工作的目的是开发一个足够轻便的 Raycast 引擎,可以在任何浏览器中运行,为浏览器提供一个新工具,您可以使用现有的 Raycaster 创建自己的游戏。为了创建游戏,我们通常使用 Unity 或 Unreal 等引擎,但我们并非总是拥有必要的处理能力来使其正常工作。
为了创建此应用程序,将使用 JavaScript、HTML5 (HyperText Markup Language)、CSS3 (Cascading Style Sheets) 以及 P5.JS 库
1.4.2 版和 P5.Play.JS
3 版进行图像实时渲染。
4. 使用代码
所提出的引擎允许您使用 HTML、CSS 和 JavaScript 元素轻松地向场景中添加和删除对象。为了方便播放过程,该脚本不需要后端服务器,这意味着它可以在您的桌面计算机或手机上离线使用,并且无论可用网络连接如何,都将按预期工作。为了验证引擎,创建了一个简单的原型级第一人称游戏。
为了模拟真实用例,使用该引擎创建了一个原型级游戏,其中包含一个实体作为用户,可以执行射击动画。在用户的计算机上运行 Windows 10 操作系统。
引擎开发和游戏创建中使用了以下工具
- Visual Studio Code:简化的代码编辑器,支持调试、任务执行和版本控制等开发操作。
- P5.JS 库:用于创意编码的 JavaScript 库,旨在让编码对艺术家、设计师、教育工作者、初学者和所有人来说都易于访问和包容!
P5.JS
是免费和开源的,因为我们相信软件和学习工具应该对所有人开放。 - P5.Play.JS 库:JavaScript 库,它使用
P5.JS
库的图形渲染。 - GitHub Pages:静态网站托管服务,直接从 GitHub 上的存储库获取 HTML、CSS 和 JavaScript 文件,选择性地通过构建过程运行文件,并发布网站。
- GitHub:基于 Git 版本控制系统的源代码托管平台。
最初,选择与可用于创建引擎的编程语言有关。经过选择后,得出结论,理想的语言将是 JavaScript,因为它轻巧且是解释型语言,非常适合项目构想。
然而,由于语言的一些困难,需要一些库的帮助,P5.JS
,它使其他库同时工作,以及 P5.Play.JS
,它添加了一些现成的函数以方便 2D 游戏的开发过程。从而使项目的实施成为可能,因为这些库以简单和优化的方式实现了开发。
图 1 显示了引擎的一些功能,例如更改屏幕分辨率和绘制场景的地面和天花板以及组成它的文件。
下一步是了解《德军总部 3D》游戏引擎的工作原理及其创建方式。与当前引擎不同,光线投射专注于为屏幕上可见的每个像素列投射光束,因此存在一个数学公式(如下)。
高度 = 缩放因子/距离
h = x/d
因此,该引擎是根据《游戏引擎黑皮书:德军总部 3D》(Fabien Sanglard,2017,第 136 页)一书提供的信息,利用 Raycaster 本身来创建游戏的。
一旦确定了开发引擎所需的元素,下一步就是建立创建引擎的环境。通过这种方式,创建了创建引擎所需的文件,主文件是 sckecth.js,该文件负责渲染 Raycaster 的所有功能。
代码 1. 用于部署测试模拟的 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="css/style.css">
<meta charset="utf-8">
</head>
<body>
<main>
</main>
<script src="sketch.js"></script>
<script src="P5 JS/p5.js"></script>
<script src="P5 JS/p5.play.js"></script>
<script src="P5 JS/p5.sound.min.js"></script>
</body>
</html>
4.1. 验证与测试
为了演示引擎的工作,它被上传到一个 GitHub 存储库的文件夹中,不久之后,在 GitHub Pages 上创建了一个页面,这是一个静态网站托管服务,它直接使用 GitHub 存储库中的 HTML、CSS 和 JavaScript 文件。
为了测试构建的引擎,创建了一个原型级游戏。创建的原型是引擎中的 FPS 游戏(第一人称射击),包含一些元素,其中一些是墙壁、带动画的武器和一个简单的敌人,所有这些都渲染在 Canvas
中。Canvas
是一个 HTML5 元素,旨在限定 HTML 页面中图形动态渲染的区域。在此图像(图 2)中,演示了原型的结果,可以看到一个敌人在两堵墙之间,墙壁上带有光线折射的错觉。
在此执行示例(图 2)中,可以可视化构建的场景,其中包含到位墙、敌人(目标)和导航机制,导航机制由一个循环算法组成,该算法从固定点(玩家的视角)扫描整个环境。
一旦用户启动引擎,就能看到他的游戏是如何形成的,已经添加了墙壁和动画,如图 3 所示。在此图像(图 3)中,表示了摄像机的移动以及单击键盘按钮时武器的切换,这两种机制都被制作成函数。
如图(图 3)所示,我们可以识别出游戏的更多特征,这些特征超出了场景和敌人的呈现以及与世界的交互。在这种情况下,可以看到玩家通过控制组件(键盘)的攻击命令与世界进行的交互。
- 在第一次打印中,玩家执行射击攻击;
- 在第二次打印中,玩家准备用刀攻击
- 在最后一次序列中,玩家手持武器处于待机状态(攻击位置)
所有呈现的序列都经过映射,以便可以从各种角度测试构建的引擎。
运行引擎时,用户将能够直接修改代码,上传自己的图像,还可以添加声音,Raycaster 已集成到引擎代码中,从而方便添加墙壁等。
在测试过程中,引擎运行良好,问题得到了解决,并且可以简单地添加墙壁和带图像的动画,从而使引擎轻巧且易于访问。两个主要优点是内容添加的简便性和可访问性,由于使用的编程语言,为引擎创建内容很简单,例如,要添加墙壁,创建了一个函数,其中需要创建一个任意大小的数组,类型为 1 表示添加墙壁,0 表示留空,原型展示了一些描述的例子,在图 3 中演示了墙壁的功能。
4.2. 缺点与问题
引擎开发中最大的问题是寻找在 JavaScript 中开发并保持过程简单的方法。当找到 P5.JS 库
时,这个问题得到了解决,该库使得渲染屏幕中的大多数对象成为可能。这使得所有部分的开发更清晰、更快、更轻。
在用这个库实现引擎后,代码行数显著减少,使其更容易理解。另一个问题是寻找一种为简单形状添加动画的方法。当添加 P5.Play.JS
库时,这个困难也得到了解决,该库允许将顺序图像添加到列表中,从而以循环形式创建动画。
5. 结论
通过为本项目开发所获得的学习和信息,我们能够理解引擎的运作方式以及深化 JavaScript 在开发中的应用。所获得的知识,例如 Web 开发和良好的编程实践,对于这项工作的开发是不可或缺的。
所使用的库对项目也至关重要,它们简化了大部分流程,主要用于在画布上渲染墙壁,后来添加了一个名为 _p5.collide2d.js_ 的库,简化了碰撞的创建。
除了所获得的所有知识之外,本项目的目的是为游戏开发者社区做出贡献,特别是对于那些对游戏创作充满热情和好奇的人。因为这个引擎与其他引擎相比轻巧而简单。作为未来的工作,这些结果有助于开发一个测试,用于在更完整的场景或游戏中验证引擎,从而允许探索该库的其他可能资源。
源代码库
- 从 https://github.com/vic-3PO/Raycast-Engine-JavaScript/ 下载源代码
- 原型发布于 https://github.com/vic-3PO/Raycast-Engine-JavaScript/
- 在线测试部署于https://github.com/vic-3PO/Raycast-Engine-JavaScript/releases/tag/Test/
参考文献
- Raycaster (2022). “一个基本的光线投射器 - Web API | MDN。” [在线]。可访问: https://mdn.org.cn/pt-BR/docs/Web/API/Canvas_API/A_basic_ray-caster. 。2022 年访问。
- McCarthy, L. L. (2022). “"P5.play".” [在线]。可访问: http://molleindustria.github.io/p5.play/docs/index.html. 。2022 年访问。
- McCarthy, L. L. (不带日期). (2022). “"P5.JS, 参考 | P5.js".” [在线]。可访问: https://p5js.org/reference/. 。2022 年访问。
- Psaikko, (2022). “"Raycast. 官方 GitHub 存储库".” [在线]。可访问: https://github.com/psaikko/raycast. 。2022 年访问。
- Raycaster. (不带日期)., (2022). “"Raycast. 官方 GitHub 存储库".” [在线]。可访问: https://threejs.org/docs/#api/en/core/Raycaster. 。2022 年访问。
- Sanglard, F. ., (2017). “游戏引擎黑皮书:德军总部 3D。” Ed CreateSpace Independent Publishing Platform, ISBN-10 1070515841, 第 1 版, 2017。
- Trekhleb, (2022). “javascript-algorithms。” [在线]。可访问: https://github.com/trekhleb/javascript-algorithms. 。2022 年访问。
- Vandevenne, (2022). “光线投射。” [在线]。可访问: https://lodev.org/cgtutor/raycasting.html. 。2022 年访问。
- Vic3PO (2022). “GitHub 上提供的项目源代码” [在线]。可访问:https://github.com/vic-3PO/Raycast-Engine-JavaScript。2022 年访问。
- Silva, J. C., Silva, A. M. 和 Macario, V., (2022). “探索由 Unity 引擎支持的 2D 电子游戏开发。” Codeproject,献给程序员!技术报告发布平台 [在线]。可访问:https://codeproject.org.cn/Articles/5346981/Exploring-electronic-game-development-2D-supported。。2022 年访问。
历史
- 2022 年 11 月 10 日 - 文档创建
- 2022 年 11 月 13 日 - 文本修订
- 2022 年 11 月 16 日 - 修订和验证
- 2022 年 11 月 17 日 - 文档提交