LibGDX draw()API不一致

时间:2015-10-04 19:01:07

标签: java libgdx

font.draw(batch, "Test", 50, 50);

batch.draw(tex, 100, 100);
(instead of)
tex.draw(batch, 100, 100);//Not valid for LibGDX

对于绘制字体,您将批处理(SpriteBatch)作为参数传递,draw()是Font方法。对于绘制纹理(或TextureRegion),它是相反的。我知道Texture有一个draw()方法,用于在本身上绘制一个Pixmap ,但我认为将它重命名为drawSelf()或drawPixmap()会允许Texture.draw( )绘制自己,与Font.draw()一致。

我是否遗漏了一些显而易见的事情迫使它以这种方式完成?

2 个答案:

答案 0 :(得分:1)

纹理视为与 BitmapFont 相同类型的对象时,您错了。 BitmapFont是一个对象,其中包含有关文本的信息(所以文本值,字形纹理,包装等)。通过BitmapFont对象绘制文本意味着生成要渲染的纹理(通过从字形纹理设置),然后将其渲染到屏幕上。

你应该把BitmapFont当作一种管理器,当Texture更像是一组可以绘制的像素时 - 当然它有一些额外的信息,而不仅仅是像素图,但它已经准备好了渲染。

当然 draw 方法名称有相似之处,但我认为对象编程是相当正常的情况 - 只是不关心它。

答案 1 :(得分:1)

考虑它的一个简单方法是大多数类型的可绘制对象(如BitmapFonts和Sprites)都很复杂。它们处理自己数据的计算,因为它们包含多个精灵或大小/方向/颜色/位置数据,因此您将SpriteBatch传递给它们的draw方法,以便它们可以处理数据传输。 SpriteBatch知道如何获取许多不同类型的特定对象的数据是没有意义的(或者是非常面向对象的)。

但是,SpriteBatch确实知道如何处理两个最简单的对象,Textures和TextureRegions。这些简单对象不包含任何有关其大小或方向或颜色的信息,因此SpriteBatch可以处理它们并在必要时计算额外数据(这就是为什么SpriteBatch有如此多的重载draw方法)。&#39; < / p>

纹理知道如何使用SpriteBatch绘制自己没有意义,因为这是一个专门的用例。纹理(和TextureRegion)是一个通用对象,旨在用于各种目的(3D贴图,包装3D模型,自定义网格上的自定义实现等),因此知道它是不实际的可以绘制并实施它们的所有可能方式。

如果希望Texture能够拥有自己的draw(batch)方法,则应该将其子类化以添加它。 (但是已经有Sprite类已经完成了这个。)

一个&#34;陷阱&#34;要注意的是Sprite扩展了TextureRegion,因此你可能会不小心调用spriteBatch.draw(sprite)并想知道为什么你的精灵没有正确的大小或方向。