在libgdx中混淆了图像缩放和定位

时间:2015-07-05 01:15:37

标签: java graphics libgdx textures game-engine

我在用libgdx围绕事物的实际显示方面时遇到了一些困难。也就是说,为了实际将某些东西放到屏幕上,它在需要做什么方面似乎相当混乱。我想我的困惑可以分为两部分:

  1. 在创建图像方面究竟需要做些什么?有 纹理,TextureRegion,TextureAtlas,Sprite,Batch,也许是一个 我缺少的其他一些艺术相关资产。这些都是怎么做的 相互联系并相互联系?什么是“生产链”之中 这些我认为是一种放置它的方式。

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

    • X是我的“全球地图”,比我的屏幕大 尺寸。我希望能够滚动/平移它。什么是 我应该在显示它时使用的坐标/位置?
    • Y更大 比我的屏幕尺寸。我想缩小它并始终如一 在屏幕/显示屏的中央。我使用什么缩放因子 在这里,哪个坐标/位置?
    • Z小于我的屏幕 尺寸。我想把它贴在屏幕的左上角 让它“坚持”我前面提到的全球地图。哪一个 定位系统我用吗?
  3. 很抱歉,如果那是一堆东西...我猜第二部分的tl; dr是我应该做的所有事情的位置/坐标,大小和尺度的哪一组?

    我知道这可能会立刻问到很多,而且我也知道大部分这些东西都可以在网上找到,但经过教程后的教程筛选后,我似乎无法直截了当地回答如何这些都是彼此相关的。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

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

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

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

我无法真正帮助解决问题2.我坚持使用基于UI的应用程序,所以我不知道使用大型游戏世界的最佳实践。但希望在该领域更有知识的人可以帮助你。

答案 1 :(得分:2)

这很长时间以回复作为评论,所以我作为另一个答案作出回应......

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

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

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