java - 如何实现等距图 block 的逻辑渲染顺序?

标签 java libgdx rendering collision isometric

情况:我正在使用 libGDX 编写 2D 等距风格的 Java 游戏。 现在我有一个可移动的播放器,它可以与固体物体的图 block 正确碰撞。

问题: 现在涉及图 block 的渲染顺序。默认情况下,库代码从底部映射器渲染到顶层。 (地面是第 0 层,物体层是第 1 层)这是有道理的。我在上面画了玩家。这意味着玩家始终掌控一切,但在某些情况下这是没有意义的。

目标:由于等距外观意味着具有某种 3D 视角,因此玩家可以位于物体的后面或前面。所以我必须想出一些代码来决定玩家是在其后面还是前面渲染。我以这台冰箱为例:

Example

我希望大家能够理解我所说的“逻辑冲突”的意思。我对如何实现这一目标有一些想法,但这会使代码变得一团糟。所以我想问是否有人有这方面的经验或者可以给我一些可以帮助我的好资源。

感谢您的阅读!

最佳答案

专业的等距风格游戏实际上是基于正交相机的 3D 游戏。这样,您就不会遇到等距上下文中 2D Sprite 排序的复杂问题,并且可以依赖基于硬件像素的 z 缓冲。
然而,如果您想在没有舒适的 3D 游戏引擎的情况下实现等距游戏(如 Java 2D 中那样),则不同排序层的方法不起作用。与画家算法相同,因为两者实际上都是用于纯 2D 自上而下 View 的游戏。
那么如何应对这个困境呢?
一种方法是模仿 Z-Buffering 更高粒度的技术,即您不考虑场景中每个对象的每个像素,而是将图 block 视为排序基础。 与 z 缓冲一样,像素/图 block 按照其与相机的距离的顺序进行渲染:
坐标为 (x, y, z) 的基于图 block 的对象的距离公式与以下内容成正比:

d=y-x-z

允许负值,因此 d(A)=-1,因为对象 A 距离相机更近,因此将在距离 d(B) = 1 更远的对象 B 之后渲染...

因此,每个渲染周期的渲染步骤为:

  1. 确定所有可见的对象(如果我们只看到其中的一小部分,我们不想渲染一个巨大世界中的所有对象)
  2. 使用给定公式计算场景中每个基于图 block 的对象的单独距离
  3. 按距离对所有可见对象进行排序
  4. 按降序渲染所有可见对象

我自己在 JavaFX 2D 中测试了这个策略,结果如下所示,即这是一种基于图 block 的等距渲染的简单工作技术:

simplified z-Buffering technique

关于java - 如何实现等距图 block 的逻辑渲染顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26664417/

相关文章:

java - 在 Java 中创建 Calendar 对象的临时副本

java - 我无法理解这段代码

java - 我无法使用 JSP 文件从 MySQL 数据库检索数据并收到 java.math.BigInteger cannot be cast to java.lang.Long 错误

java - 如何在libGDX中以相反的方式射击子弹

python - 像我一样向我解释 5 : OpenGL 4. x 渲染管道

c++ - Vulkan 中多个具有透明度的绘制调用之间是否需要同步?

java - 无法显示变量

java - Libgdx 桌面启动器空白

java - LibGDX "GwtApplication: exception: Couldn' t 加载图像 'a.jpg'

javascript - 如何在 React 类渲染方法中为元素提供动态类名