【问题标题】:Seamless scrolling tilemaps无缝滚动瓷砖地图
【发布时间】:2010-10-31 05:23:35
【问题描述】:

我正在开发一个自上而下的 rpg,并希望实现无缝滚动地图。也就是说,当玩家探索世界时,地图之间没有加载屏幕,也没有通往下一个区域的“门”。

我有两种方法可以打破这个世界。在顶层,我有“区域”,它只是 9 个“地图”的集合(这些区域仅由目录表示)。在该区域内,9 张地图被组织成一个 3x3 的网格。我还没有想出表示这些地图的最佳方式,无论是通过索引还是通过与其父区域的相对坐标。这些地图实际上是渲染到用户屏幕上的。考虑到每张地图的大小和视口的大小,我知道用户在地图角落时最多只能看到四张地图。

我的问题是,当玩家探索世界时,如何在代码中跟踪地图及其各自的偏移量?我正在考虑有一个map<Point, Map*>,其中 0,0 是玩家当前所在的地图。如果玩家在地图的左下角,那么东边的地图将存储为 1,0 ,南面的地图为 0,1,东南方的地图为 1,1。我预见到的问题是,我不确定这些点是可变的,如果每次玩家移动到另一张地图或地图的不同部分时重建列表会导致问题。

【问题讨论】:

  • 整个世界会立刻进入记忆吗?或者你会在玩家行走时加载相邻区域?
  • 它们将在玩家行走时加载。我对这个问题思考得更多一些,也许它并没有我想象的那么难。我可以只保留加载地图的列表。当我遍历列表以呈现它们时,我只是执行一些检查以查看它们与玩家所在地图的关系。我可以保留指向“当前地图”的指针,以检查列表中的所有地图.如果玩家在地图范围之外,我可以卸载它。

标签: c++ c map


【解决方案1】:

这与我用 FreeBASIC 编写的游戏完全一样。我正在做的事情略有不同,但也许会有所帮助。

我有一张 1024^2 的世界地图(所以我可以分形生成它)。世界地图上的每个陆地方块都是一个区域地图(一个具有程序历史的微型王国),但我制作的区域地图非常容易生成。区域图是 128^2,我在 256^2 数组中有四个。当您靠近边缘时,它会移动地图并创建 2-3 个新区域(尽管它只会创建一个历史记录——玩家所在的区域)。

其中有 256^2 个 ZONE 地图,它们也在 512^2 数组中平铺 2x2。同样,当接近边缘时,它会移动并生成新的边缘。

我前段时间尝试过 3x3 网格,但因为效率低而不得不拒绝。

【讨论】:

    【解决方案2】:

    考虑一个双端队列。这样四面八方的插入和删除都很容易。

    【讨论】:

      【解决方案3】:

      如果你有一个 3x3 的地图指针数组,并且左上角有 0,0,如果你进入你北边的房间,你可以做什么,你可以做类似的事情 maps[1,1] = maps[1,0]; 将每张地图下移一位并重新加载第一行。

      祝你好运!希望您能找到有效的解决方案!

      【讨论】:

        【解决方案4】:

        一个建议:视口。

        我在一个 GPS 设备上工作,它定义了一个大的绘图区域,但屏幕只能定义整个区域的一部分或视口。滚动涉及移动视口(或更改显示器的内存位置)和重新加载屏幕(使用图形芯片)。

        这个概念就像一个 3x3 网格。视口从中心开始。向左移动,更改显示内存的地址。

        希望这会有所帮助。

        顺便说一句,这是一个嵌入式系统,应用程序可以 100% 控制所有硬件设备(并且不与其他应用程序共享)。

        【讨论】:

          猜你喜欢
          • 2019-05-10
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-18
          • 1970-01-01
          相关资源
          最近更新 更多