【问题标题】:Confused with image scaling and positioning in libgdx对 libgdx 中的图像缩放和定位感到困惑
【发布时间】:2015-07-05 01:15:36
【问题描述】:

我很难理解 libgdx 的实际显示方面。也就是说,为了将某些东西实际放到屏幕上,需要做什么似乎相当混乱。我想我的困惑可以分为两部分:

  1. 在创建图像方面究竟需要做什么?有 Texture、TextureRegion、TextureAtlas、Sprite、Batch,可能还有一个 我缺少的其他一些与艺术相关的资产。这些都是怎么做的 相互联系和联系?什么是“生产链” 我想这些将是一种表达方式。

  2. 在推杆方面 从上面的东西创建到监视器上的任何内容或 显示,不同的坐标和尺寸测量如何相关 并相互翻译?假设有一些图像 X 我想放在屏幕上。它有自己的一套维度和 坐标,但还有一个视口大小(是否有 视口位置?)和相机位置(有相机尺寸吗?)。 最重要的是,还有整体显示尺寸 来自 Gdx.graphics。我可能想做的一些事情的例子可以 如下:

    • X 是我的“全球地图”,比我的屏幕还大 尺寸。我希望能够滚动/平移它。什么是 显示时我应该使用的坐标/位置?
    • Y 更大 比我的屏幕尺寸。我想按比例缩小并一直保持 在屏幕/显示器的中心。我使用什么比例因子 在这里,哪些坐标/位置?
    • Z 比我的屏幕小 尺寸。我想把它贴在屏幕的左上角 让它“坚持”到我之前提到的全球地图上。哪个 我要使用定位系统吗?

对不起,如果那是一堆东西...我猜第二部分的 tl;dr 就是我应该按照哪一组位置/坐标、大小和比例来做所有事情?

我知道这一次可能要问很多,而且我也知道大部分这些东西都可以在网上找到,但是在一个又一个教程筛选之后,我似乎无法得到一个直接的答案这些事情都是相互关联的。任何帮助将不胜感激。

【问题讨论】:

    标签: java graphics libgdx textures game-engine


    【解决方案1】:
    • 纹理本质上是原始图像数据。
    • TextureRegion 允许您从较大的纹理中抓取较小的区域。例如,通常的做法是将您的游戏/应用程序的所有图像打包成一个大纹理(LibGDX“TexturePacker”是一个单独的程序),然后将较大纹理的区域用于您的单个图形。这样做是因为切换纹理是一项繁重且缓慢的操作,您希望尽量减少此过程。
    • 当您使用 TexturePacker 将图像打包成单个大图像时,它会创建一个“.atlas”文件,用于存储各个图像的名称和位置。 TextureAtlas 允许您加载 .atlas 文件,然后提取原始图像以在您的程序中使用。
    • Sprite 为纹理添加了位置和颜色功能。请注意,Texture API 没有设置/获取位置或颜色的方法。精灵将是您的角色和其他您可以在屏幕上实际移动和定位的对象。
    • Batch/SpriteBatch 是一种在屏幕上绘制多个精灵的有效方法。 Batch 不是一次对每个精灵进行绘图调用,而是一次调用多个绘图。

    希望我不会增加混乱,但我真正喜欢的另一个选项是在“Sprite”和“SpriteBatch”类上使用“Actor”和“Stage”类。 Actor 类似于 Sprite,但通过 act 方法添加了移动/动画的附加功能。舞台取代了 SpriteBatch,因为它使用自己的内部 SpriteBatch,因此您无需显式使用 SpriteBatch。

    还有一整套 UI 组件(表格、按钮、文本字段、滑块、进度条等),它们都基于 Actor 并与舞台一起使用。

    对于问题 2,我真的无能为力。我坚持使用基于 UI 的应用程序,所以我不知道处理大型游戏世界的最佳做法。但希望在这方面更有知识的人可以帮助您。

    【讨论】:

    • 那么总的来说,Actor + Stage 比 Sprite + SpriteBatch 更“强大”?因为Actors可以有自己的更新方法等等?所以假设我有一个原始的 .png 文件,我想在游戏中使用它。管道究竟会是什么样子? Atlas -> Region ->Texture -> Sprite/Actor?
    【解决方案2】:

    回复评论太长了,所以我以另一个答案的形式回复...

    我认为 Sprite/SpriteBatch 和 Actor/Stage 都同样强大,因为您仍然可以使用 Sprite/SpriteBatch 制作动画和移动,但 Actor/Stage 更易于使用。舞台有两种方法,称为“act”和“draw”,它允许舞台非常容易地更新和绘制它包含的每个演员。您覆盖每个演员的 act 方法,以指定您希望它执行的操作类型。使用示例代码查找几个不同的 Stage/Actor 教程,应该会清楚如何使用它。

    另外,我之前说的“Actor”相当于Sprite有点不正确,因为Sprite包含一个纹理,但Actor本身没有任何图形组件。 Actor 有一个扩展名为“Image”,其中包含一个 Drawable,因此 Image 类实际上等同于 Sprite。 Actor 是提供执行(或“更新”)方法的基类,但它不必是图形的。我已经将 Actor 用于其他目的,例如在特定时间触发音频声音。

    Atlas 创建包含所有 png 文件的大型纹理,然后允许您从中获取各个 png 的区域。因此,获取特定 png 图形的管道将是 Atlas > Region > Sprite/Image。 Image 和 Sprite 类都有带区域的构造函数。

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多