游戏关卡的数据结构

2023-12-23

我正在使用 JavaScript 创建一个平台游戏canvas完全基于图块。在游戏中存储物品块(墙壁、地板、物品)的最佳方法是什么?问题是每块瓷砖都可以被摧毁或创建。

目前我有一个 2D 数组,因此我能够快速检查某个项目是否位于特定的 X 和 Y 位置。问题是当用户移动并且地图需要滚动时,我需要重新分配每个块。当该项目位于x = 0?我不能使用负索引。

我宁愿将滚动类比为一次一个图块。另外,我计划在用户移动时随机生成地图(如果之前尚未生成)。因此,一旦产生某种东西,它就应该永远保持这种状态。

我应该提到的另一点是它也将是多人游戏。因此,在缓存数据变脏并需要从数据库获取最新数据之前,对屏幕进行分块是一个好主意。啊,我对这一切都很陌生;似乎不可能,非常感谢任何帮助。


由于您有无限的关卡,我建议您使用与已有的结构类似的结构,并稍作调整。

不是将所有内容存储在一个大数组中,并且每次用户移动时都在该数组内移动内容(哎呀),而是存储 9 块地图(每个块的大小大约是屏幕大小的两倍),当用户接近当前块的边缘,处理屏幕外的块,向左移动所有块,并将新块加载到间隙中。

希望这很清楚,但为了以防万一,这里有一个图表:

带字母的方块是地图块,红色方块是视口(我把它画得稍微太大了,记住视口比黑色方块小)。当视口向右移动时,您卸载块 A B 和 C,将所有其他块向左移动,并将新数据加载到最右边的块中。由于块的宽度是屏幕宽度的两倍,因此用户需要花时间穿过屏幕来生成/加载关卡到这些块中。如果用户在世界各地快速移动,您可以使用一组 4x4 的块来提供额外的缓冲。

解决返回到先前的地图块的问题。有几种方法可以做到这一点:

  • 当不再使用这些块时,将它们写到硬盘上(或者 javascript 中的任何等效项)
  • 在内存中无限扩展您的块集。与块数组不同的是,关联数组采用块的 x/y 位置并返回块(或 null,这表明用户以前从未来过这里,您需要生成它)。
  • 按程序生成关卡,这很复杂,但这意味着一旦某个块离开屏幕,您就可以将其处理掉,并且确信稍后可以再次重新生成完全相同的块
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

游戏关卡的数据结构 的相关文章

随机推荐

  • 尝试解释 Node-Neo4j API

    我对编码还很陌生 所以如果我的代码不可读或者我的问题过于简单 请原谅我 我正在尝试创建一个小型服务器应用程序 除其他外 显示 neo4j 节点的属性 我正在使用 node js Express 和 Aseem Kishore 的 Node
  • 将字符串传递到 SQL WHERE IN

    我正在开发一个查询页面 用户在其中选择代表不同类型的值 每个类型都由 ID 标识 问题是使用 WHERE IN 方法从数据库中选择这些 ID 这是我的SQL语句 SELECT M REG NO T TYPE ID FROM MAIN AS
  • C++17:仍然使用枚举作为常量? [复制]

    这个问题在这里已经有答案了 我习惯使用enum作为常量 它们编写起来很快 可以放在 h 文件中 并且工作得很好 enum BOX LEFT 10 BOX TOP 50 BOX WIDTH 100 BOX HEIGHT 50 enum REA
  • 如何在 python sklearn 中正确地将数字和文本特征结合起来

    我尝试在 sklearn 管道中第一次使用 featureunion 来组合数字特征 2 列 和文本特征 1 列 以进行多类分类 from sklearn preprocessing import FunctionTransformer f
  • 无法在 WAMP 上运行 zend Framework MVC 应用程序

    我是 zend 框架应用程序的新手 我在网上找到了一本书 其中包含源代码示例 我正在尝试学习 zend Framework mvc 我在wamp中提取了www中的示例文件夹 当我尝试访问应用程序 localhost exampleMVC 时
  • Kotlin lambda 主体中的“it”是什么?

    例如在以下两个代码中 File file1 txt forEachLine println it and File somefile txt bufferedWriter use out gt history forEach out wri
  • Firebug 或任何工具可以检查元素并实际判断正在使用哪种字体吗? (而不是列表)

    通常在 Firebug 上 当检查一个元素时 我会得到一个字体列表 实际上需要进入系统的 Fonts 文件夹并逐一检查名称 看看是否是正在使用的字体 有没有办法直接使用Firebug显示正在使用的字体 或者 如果 Firebug 没有此功能
  • 在安装了 libv8 的 Windows 上安装 therubyracer --with-system-v8

    我终于在我的 Windows 上安装了 libv8 gem install libv8 with system v8 现在 当我尝试安装 therubyracer 时 我得到了 gem install therubyracer Tempor
  • 需要 Babel “7.0.0-0”,但已加载“6.26.3”

    当我关注其他类似的报告时 无论我尝试安装什么 babel 明智的 都会不断收到此错误 这是堆栈跟踪 error bundling failed Error Requires Babel 7 0 0 0 but was loaded with
  • 如何读取从 IdP 收到的 SAML 属性值?

    我正在使用 Spring Security SAML 1 0 1 我想知道名称为 eduPersonAffiliation 的 SAML 属性的值 我编写了一个类来实现org springframework security saml us
  • SkiaSharp SKbitmap.GetPixel 和 SKbitmap.SetPixel - 提高性能

    我正在尝试使用C 和SkiaSharp来实现图像处理 下面的代码试图实现边缘检测 下面代码的结果相当不错 需要改进 但这不是我的观点 用于测试代码的图像 https i stack imgur com EZgi4 jpg canvas Cl
  • data.table 中的“.N”是什么意思?

    我有一个数据表dt library data table dt data table a LETTERS c 1 1 3 b 4 7 a b 1 A 4 2 A 5 3 B 6 4 C 7 的结果dt N by a is a N 1 A 2
  • Facebook 和 Google 登录不适用于上传到 Firebase App Distribution 的 Android AAB 版本

    Solved The 页面已更新 当您将 AAB 上传到 App Distribution 时 Google Play 会自动 使用测试应用程序签名密钥证书对生成的 APK 进行签名 出现提示时 您必须向 API 提供商注册您的应用程序 如
  • 使用 destroy() 命令时 Perl/Tk 内存泄漏

    我遇到了在 Unix 上运行的 Perl Tk 存在大量泄漏的问题 由于某些限制 我无法发布大部分代码 但我已经能够确定导致内存泄漏的原因并创建一个具有相同症状的小程序 基本上我正在运行一个 GUI 其中的框架被定期销毁和重新填充 这似乎会
  • 无法解析模块...急速模块图中不存在

    我是 ReactNative 的初学者 我正在创建一个 Twitter 克隆来练习 我已经开发了第一个应用程序 没有任何问题 但自从我开始新项目以来 在项目中添加自定义模块后 我收到此错误消息 在本例中 我想将样式表导入到我的自定义推文组件
  • 作为 Web 服务的 C++ OpenGL 应用程序

    我们用 C 创建了一个 OpenGL 应用程序 可以可视化一些物理模拟 基本应用程序包含在一个 DLL 中 由简单的 GUI 使用 它目前运行在台式电脑上 但我们有将其转变为网络服务的想法 由于模拟需要专用硬件 因此用户可以通过他 她的浏览
  • Ruby on Rails 301 重定向

    我向某些模型添加了 slugs 但由于 SEO 我需要从旧链接进行 301 重定向 老的 http host com foo 1 new http host com foo foo slug 问题 这种情况下如何实现301重定向呢 是否可以
  • 使用axios发送请求时如何设置代理?

    我正在使用一个名为 并发 的包在本地主机上同时运行我的客户端和服务器 客户端在端口 3000 上运行 而服务器在端口 5000 上运行 我已按以下方式在服务器的 package json 中设置代理 proxy https localhos
  • 将全局样式表移至 中的样式组件上方

    我目前import在我的一个组件中使用 CSS 文件 这些样式表添加为link标签在 并将在全球范围内推出 import src styles normalize module css 我也在使用样式组件 目前 link全局CSS生成的标签
  • 游戏关卡的数据结构

    我正在使用 JavaScript 创建一个平台游戏canvas完全基于图块 在游戏中存储物品块 墙壁 地板 物品 的最佳方法是什么 问题是每块瓷砖都可以被摧毁或创建 目前我有一个 2D 数组 因此我能够快速检查某个项目是否位于特定的 X 和