TextureRegions setRegion方法libgdx java

时间:2015-10-20 08:51:22

标签: java libgdx

我很困惑TextureRegions的setRegion(int x,int y,int width,int height)方法,因为API中没有文档,有人可以详细解释这些参数的作用。这是我第一次使用TextureRegions,我不是想把它用于动画,这是我在网上找到的与他们有关的唯一一件事,请和谢谢。

3 个答案:

答案 0 :(得分:3)

看看this wiki page。纹理是图形卡(VRAM)存储器中的2D图像,可用于渲染到屏幕。因为在VRAM中切换纹理是相对昂贵的操作,所以多个图像通常是packed in one texture。例如thisenter image description here

这称为“纹理图集”,允许在一个batch中渲染多个图像,而无需在VRAM之间切换纹理。

要识别纹理内的每个单独图像,您需要指定该图像的区域。这可以使用TextureRegion类来完成。您可以通过在texels中指定图像的左上角位置以及以图片为单位指定图像的宽度和高度来执行此操作。因此,例如,在上图中,树从位置x:0,y:0开始,宽度为140,高度为160个纹素。

您通常不必自己使用setRegion方法指定区域。相反,您可以从TextureAtlas获取该区域,而该区域又会从TexturePacker生成的.atlas文件中读取大小。

答案 1 :(得分:1)

我通常使用TextureRegion从纹理图像中获取区域,例如

region = new TextureRegion(texture, 50, 30, 60, 40);

enter image description here

我也将它用作分割Spritesheet以绘制动画的结果

region = TextureRegion.split(texture, 32, 32);

enter image description here

希望这有用!

答案 2 :(得分:1)

对于LibGdx,签出方法的第一步是检查API

setRegion()

setRegion
public void setRegion(int x,
                  int y,
                  int width,
                  int height)
Parameters:
width - The width of the texture region. May be negative to flip the sprite when drawn.
height - The height of the texture region. May be negative to flip the sprite when drawn.

如果您需要更多信息,我发现找出方法完全的最简单方法是查看源代码which is freely available on GitHub

/** @param width The width of the texture region. May be negative to flip the sprite when drawn.
 * @param height The height of the texture region. May be negative to flip the sprite when drawn. */
public void setRegion (int x, int y, int width, int height) {
    float invTexWidth = 1f / texture.getWidth();
    float invTexHeight = 1f / texture.getHeight();
    setRegion(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight);
    regionWidth = Math.abs(width);
    regionHeight = Math.abs(height);
}

如果您想知道这与整体关系如何broad usage information can be found here

  

TextureRegion类(source)描述纹理内部的矩形,仅用于绘制纹理的一部分。

private TextureRegion region;
...
texture = new Texture(Gdx.files.internal("image.png"));
region = new TextureRegion(texture, 20, 20, 50, 50);
...
batch.begin();
batch.draw(region, 10, 10);
batch.end();
  

这里20,20,50,50描述了纹理的一部分,然后在10,10处绘制。通过将Texture和其他参数传递给SpriteBatch可以实现相同的目的,但TextureRegion可以方便地拥有一个描述两者的对象。

     

SpriteBatch有很多绘制纹理区域的方法:

//Draws the region using the width and height of the region.
draw(TextureRegion region, float x, float y)
//Draws the region, stretched to the width and height.
draw(TextureRegion region, float x, float y, float width, float height) 
//Draws the region, stretched to the width and height, and scaled and rotated around an origin.
draw(TextureRegion region, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation)   

对于为什么这很有用 - 让一个Texture上的所有图像保存在内存中,并帮助优化渲染速度 - 因为不需要加载,绑定不同的纹理,经常交换。这实际上对移动平台有很大帮助。