gpt4 book ai didi

c++ - Tilemaps 的负坐标

转载 作者:太空宇宙 更新时间:2023-11-04 16:28:51 27 4
gpt4 key购买 nike

如何在基于 2D 图 block 的游戏中映射负 map 坐标?前任。 (-180,100)或 (10, -8)

我需要用 O(1) 来访问它们。我不想创建一个巨大的二维 vector 并将 (500,500) 视为 (0,0) 只是为了调用负坐标。

有点愚蠢的问题,但我真的不知道。

谢谢。

最佳答案

我假设你有一个无限的、程序生成的世界,因为如果世界不是无限的,那么只需将 X 和 Y 坐标的下限设置为零,然后包装一个函数即可如果有人要求超出范围的图 block ,您的图 block map 数组会自动返回零。

在无限世界的情况下,您将无法在 O(1) 时间内访问您的图 block ——您要做的最好是 O(log n)。以下是我的处理方式:

  • 将您的瓦片 map 分成您认为合理的任何大小的正方形 block (我们称此大小为 S)
  • 创建一个 vector 的 HashMap ,每个 vector 都是映射的一个 block 。
  • 当玩家靠近一个新 block 时,在后台线程中生成它并将其扔到哈希中。散列应基于 block 的 x, y 坐标 (x/S, y/S)。
  • 如果您想访问特定位置的 map 图 block ,请获取相应 block 的 vector ,然后访问该 vector 中的图 block (x%S, y%S)。
  • 如果将其包装在一个类中,则可以向其添加功能,例如将 block 加载和保存到磁盘,这样您就不必将整个 map 保存在内存中。您还可以编写一个 getTile 函数,它可以采用任意坐标,并负责为您选择正确的 block u 和该 block 内的位置。

您的 vector 始终可以在 O(1) 时间内访问,并且散列应该可以在 O(log n) 时间内访问。此外,只要您选择合理的 block 大小,哈希的大小就不会失控,因此对性能的影响基本上为零。

关于c++ - Tilemaps 的负坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com