【问题标题】:2D Moving Camera (LWJGL)2D 移动相机 (LWJGL)
【发布时间】:2013-09-24 02:03:28
【问题描述】:

我目前正在使用 LWJGL 开发 2D RPG,并且仍处于引擎开发阶段。我有很多我想要创建的技术,但我最大的问题之一是将相机固定在播放器上。我见过的所有解决方案都涉及移动世界并保持玩家静止,这可以工作,但很明显,如果不密切监控,这可能会导致一些计算问题。通常情况下,我会编写一个我不必担心的系统,但我拒绝了,因为我最终打算添加多人游戏功能,其中移动的世界将无法播放。

有没有办法将相机固定到可以移动的对象或点上,而无需使用 translate 来移动世界?另外,如果可能的话,我想避免使用 Slick。这将需要我重新设计我目前的大部分游戏引擎。

【问题讨论】:

    标签: java opengl 2d lwjgl


    【解决方案1】:

    当您要将 3d 视口投影到 2d 屏幕上时,您需要根据观察者的视点(所谓的相机或视图)移动所有内容。

    我猜你是逃不掉的。您通常做的是拥有一个Camera 对象,该对象保存用于构建视图矩阵的位置和旋转,该视图矩阵通过uniform 传递到场景的顶点到着色器。将变换矩阵传递给着色器是常态,因此您不应该为此感到负担。您始终可以将其与透视矩阵进行预乘。

    您必须移动整个世界以匹配相机的位置,因为您需要转换场景中从那个角度看到的所有内容,否则您如何将其投影到屏幕上?没有“移动相机,保持世界静止”的概念。

    【讨论】:

    • 两个顾虑:一,这是一个2d项目,所以我不知道你的3d知识有多少适用。第二,如果世界在移动,那么如果每个玩家都移动周围的世界而不是移动自己,那么多人游戏到底如何运作?
    【解决方案2】:

    以视觉方式移动世界,这是所有其他 RPG 的做法。但不要移动实际世界的位置。

    正常绘制除了 ui 之外的所有内容,而不是根据玩家的位置(即glTranslate2f(-player.x,-player.y))翻译所有内容。这一切都在 render 方法中完成。在联网多人游戏中,视口是针对特定玩家完成的(即 Bob 的屏幕根据 Bob 的位置进行平移,Jane 的屏幕根据 Jane 的位置进行平移)。如果您想要单屏多人游戏,您可能必须使用多个帧缓冲区(每个玩家一个),并将它们用作视口。

    【讨论】:

    • 我在Display.update(); 之前将glTranslatef(-game.player.getX(),-game.player.getY(),0); 添加到我的主要渲染方法中,但我没有得到任何结果。玩家的位置在这些方法中保持。
    • glTranslatef 应该在渲染播放器之前调用,而不是之后。您应该推送一个转换矩阵 glTranslatef(...),绘制​​世界、敌人和角色,弹出转换矩阵,绘制 UI,然后按确切顺序调用 Display.update()。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多