Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无缝滚动tilemaps_C++_C_Map - Fatal编程技术网

C++ 无缝滚动tilemaps

C++ 无缝滚动tilemaps,c++,c,map,C++,C,Map,我正在开发一个自上而下的rpg,并希望实现无缝滚动地图。也就是说,当玩家探索世界时,地图之间没有加载屏幕,也没有通往下一个区域的“门” 我有两种方法来打破这个世界。在顶层,我有“区域”,它只是9个“地图”的集合(这些区域仅由目录表示)。在区域内,9张地图被组织成一个3x3的网格。我还没有找到最好的方法来表示这些地图,无论是通过索引还是通过相对于父区域的相对坐标。这些贴图实际上是渲染到用户屏幕上的贴图。考虑到每张地图的大小和视口的大小,我知道用户最多只能看到四张地图,当它们位于地图的一角时 我的问

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

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


我的问题是,当玩家探索世界时,如何在代码中跟踪地图及其各自的偏移量?我在考虑一个
地图
,其中0,0是玩家当前所在的地图。如果玩家位于地图的左下角,则东部地图将存储为1,0,南部地图将为0,1,东南部地图将为1,1。我预见到的问题是,我不确定点数是否是可变的,如果每次玩家移动到另一张地图或地图的不同部分时重建列表都会导致问题。

考虑一个deque的deque。这样,在所有四个面上的插入和删除都很容易。

如果你有一个3x3指针数组,并且你的左上角有0,0,那么如果你进入你以北的房间,你可以做如下的事情
maps[1,1]=maps[1,0]
将每个贴图向下移动一个,然后重新加载顶行


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

这与我用FreeBASIC编写的游戏完全一样。我现在做的有点不同,但可能会有所帮助

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

其中有256^2的分区地图,也可以在512^2的阵列中平铺2x2。同样,当接近边缘时,它会移动并生成新的边缘


不久前我尝试了3x3网格,但由于效率低下而不得不拒绝使用。

建议:视口

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

该概念类似于3x3网格。视口从中心开始。向左移动,更改显示存储器的地址

希望这有帮助


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

整个世界会同时在内存中吗?或者你会在玩家行走时加载相邻区域吗?它们会在玩家行走时加载。我对这个问题想得多了一点,也许它没有我想象的那么难。我可以保留一份已加载地图的列表。当我在列表中循环渲染它们时,我只是执行一些检查,看看它们与玩家所在的地图有什么关系。我可以保留一个指向“当前地图”的指针,用于检查列表中的所有地图。如果玩家在地图范围之外,我可以卸载它。