【问题标题】:difference between Viewport and camera in Libgdx?Libgdx中视口和相机的区别?
【发布时间】:2020-04-24 03:43:47
【问题描述】:

我是 LibGdx 框架的新手,在使用视口和相机时遇到了麻烦。任何人都可以给出两者之间的简单区别吗?

【问题讨论】:

标签: libgdx


【解决方案1】:

相机定义了有利位置以及屏幕上可以看到的世界范围。游戏中的所有内容都可以通过定义世界视图的摄像机看到。对于 2D 游戏,您使用 OrthographicCamera 来定义当前可见的世界矩形。 OpenGL 使用矩阵来计算所看到的内容,因此要使用相机,您需要对其进行更新并将其combined 矩阵传递到 SpriteBatch。

Viewport 在 LibGDX 中具有三种不同的含义:

  1. OpenGL 视口,屏幕 OpenGL 的矩形区域当前设置为以像素尺寸绘制。无论 OrthographicCamera 的尺寸是多少,它定义的世界的可视矩形都会被拉伸以适应 OpenGL 视口,这意味着它看起来会变形/被压扁。

  2. OrthographicCamera 的viewportWidthviewportHeight。这些术语是 LibGDX 婴儿期的不幸遗物,当时假设您总是使用大小等于 OpenGL 视口大小的相机。这些术语实际上描述了您可以看到的世界矩形的大小,但是这个可见矩形可以有任意尺寸,并且最终图像会被拉伸以适应 OpenGL 视口。

  3. Viewport 类,这是一个同时管理 OrthographicCamera 和 OpenGL Viewport 的类,以实现某种策略来处理屏幕密度和纵横比的无限可能。

LibGDX 视口类通过提供世界宽度和世界高度来设置,它们定义了您希望在屏幕上可见的游戏世界的矩形。根据您使用的视口类型,此矩形将以某种方式用于定位多种尺寸的屏幕。

LibGDX 包含的视口的一些示例:

StretchViewport:它拉伸你的世界宽度/高度以适应屏幕,即使这会导致失真。这不应该用于已发布的游戏,因为玩家会讨厌它。仅适用于非常快速和肮脏的原型设计。

FitViewport:它会放大您的世界宽度/高度以适应屏幕,并在 OpenGL 视口中添加信箱以使图像不失真。这就像您在电视上看电影时看到的黑条。这是设计游戏的最快/最脏的方式,因为您知道您的世界的可视矩形在所有设备上都是完全相同的。但是您的玩家可能不喜欢浪费屏幕空间。如果你将它用于 iOS 游戏,Apple 会拒绝它。

ExtendViewport:它会放大你的世界宽度/高度以适应屏幕,然后放大你的世界宽度或高度以填充屏幕上的任何剩余空间,这样图像就不会失真。如果您不想要信箱,这是最好的选择,但这意味着您必须在设计游戏时牢记,您必须绘制足够的绘图以覆盖您计划的世界宽度/高度之外的可能额外区域,并尝试保持游戏玩法相当公平。

ScreenViewport:这是独一无二的,因为它没有世界宽度/高度的输入。它只是让世界的宽度和高度与屏幕大小(以像素为单位)相匹配。这不应该用于玩游戏,因为与小型 MD 设备相比,您在大型 XHD​​ 设备上看到的矩形可能是 5 倍或更多倍。它对 UI 有其用途。您可以针对不同的屏幕密度设计多个 UI 资源,并使用 ScreenViewport 使文本和按钮在所有设备上看起来都非常清晰。

我个人总是使用 ExtendViewport 来玩游戏,这样不会浪费屏幕空间,而且游戏可以在 iOS 上发布。

对于 UI,我将 ExtendViewport 用于游戏 HUD(将小部件推到屏幕边缘),如果有覆盖游戏的暂停屏幕,我使用 FitViewport。对于这种用途,FitViewport 很好,因为您实际上不会看到黑条。如果您知道它适合的矩形始终相同,则管理复杂的暂停屏幕 UI 会更容易。

为了以最小的努力保持 UI 看起来相当清晰,我以大约 200-250dpi 手机屏幕上的像素到像素的大小生成它,并对其进行三线性过滤。

【讨论】:

    【解决方案2】:

    相机

    简单来说,相机就像现实生活中的相机。在 LibGDX 中,Camera 用于显示我们的游戏区域。

    例如:拍电影的时候,导演会做很多准备,一切都会通过摄影机来捕捉。与我们的游戏玩法在 libgdx 中相同的方式,我们创建了许多精灵、纹理等。所有这些东西都被相机捕获并渲染到屏幕上。以一种简单的方式,我们可以知道相机显示了游戏区域。

    视口

    Viewport主要用于让我们的游戏在视觉上兼容多种设备。

    不同的设备有不同的纵横比。当游戏在不同设备上运行时,可能会出现一些图形问题(拉伸图像、字符超出屏幕等)。 LibGDX 提供了Viewport 来解决这个问题。

    Viewport 提供三种主要类型(不限于):

    1. StretchViewport
    2. FillViewport
    3. FitViewport

    更多详情,请查看以下链接:

    LibGDX - Viewports

    LibGDX - Projection, Viewport & Camera

    【讨论】:

      【解决方案3】:

      相机就像一只眼睛,它显示它所看到的。 视口只是决定相机观察到的事物将如何呈现。 例如,如果您的游戏使用非常小的精灵并决定将其放在大屏幕上,则图像会非常小。这就是视口的作用。它的任务只是适当地“加宽”图像,这样您就不必担心不同的屏幕分辨率。

      附言

      • 我知道我的答案有点晚了,而且可能过于简单了,但我希望它对初学者有所帮助。而且我想明确表示我自己不是专家。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2014-05-27
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多