java - 将 2d 游戏世界坐标转换为屏幕位置

标签 java

我有一个生成 2d 游戏 map 图 block block 的系统。 block 是 16x16 block , block 是 25x25。

block 有自己的坐标,比如 0,0,0,1 等。瓦片根据它们所在的 block 确定它们在世界中的坐标。我已经验证了 block /瓦片都是显示正确的 x/y 坐标。

我的问题是将它们转换为屏幕坐标。在上一个问题中,有人建议使用:

(worldX * tileWidth) % viewport_width

每个图 block 的 x/y 都经过此计算并返回屏幕 x/y 坐标。

这适用于适合视口(viewport)的图 block ,但它会重置屏幕外任何内容的屏幕 x/y 位置计算。

在我的 map 中,我在玩家周围的半径范围内加载了大块的图 block ,因此一些内部图 block 将离开屏幕(直到它们四处移动,屏幕上的图 block 位置才会移动)。

我尝试了一个不在屏幕上的磁贴测试:

Tile's x coord: 41
41 * 25 = 1025
Game window: 1024
1025 % 1024 = 1

这意味着图 block x(如果屏幕 0,0 位于 map 0,0,应该位于 x:1025,刚好在屏幕的右侧)实际上位于 x:1,出现在左上角。

我想不出如何正确处理这个 - 在我看来我需要使用 tileX * tileWidth 来确定它的“初始屏幕位置”,然后以某种方式使用偏移量来确定如何让它出现在屏幕上。但是什么抵消?

更新:我已经在玩家移动时存储了一个 x/y 偏移值,所以我知道如何移动 map 。我可以将这些值用作当前偏移量,如果有人保存了游戏,我可以简单地存储这些值并重新使用它们。不需要等式,我只需要存储累积偏移量即可。

最佳答案

模数 (worldX*tileWidth % screenWidth) 是导致它重置的原因。 Modulo (%) 给出整数除法运算的余数;因此,如果 worldX * tileWidth 大于 screenWidth,它将为您提供 (worldX * tileWidth)/screenWidth 的余数;如果 worldX * tileWidth 为 screenWidth+1,则余数为 1:它从行的开头重新开始。

如果您消除模数,它将继续绘制超过屏幕边缘的图 block 。如果您的绘图缓冲区与屏幕大小相同,您需要在屏幕边缘添加对图 block 的检查,以确保您只绘制可见的图 block 部分。

如果您试图让玩家在屏幕上居中,则需要将每个图 block 偏移玩家与图 block 0,0(以像素为单位)的偏移量,减去屏幕宽度的一半:

offsetX = (playerWorldX * tileWidth) - (screenWidth / 2);
screenX = (worldX * tileWidth) - offsetX;

关于java - 将 2d 游戏世界坐标转换为屏幕位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16884992/

相关文章:

java - 本地域和子域映射(Web开发)

java - (Intellij) 编译时为 "unclosed character literal"和 "illegal character '\u00a 7'"

java - 这个静态方法使用哪个类,StringBuffer 还是 StringBuilder?

java - 为 enum.ordinal 生成编译器警告

java - 如何使我的 TextView 宽度为其父级的一半?

java - 如何检查时间是否重叠?

java - 将树形图迭代固定次数

java - Solaris Dependency Walker?

java - Java中的多线程垃圾收集: Sharing object outside prevents GC?

java - java入门问题