LibGDX从TextureAtlas缩放和渲染精灵

时间:2014-04-02 23:27:11

标签: java opengl textures libgdx sprite

我在绘制和缩放精灵时遇到了问题。

我正在从纹理图集加载我的资产,我用LibGDX纹理打包器gui工具打包没问题。我的纹理图集图像目前看起来像这样。 pack iamge

这些图像应该是按钮,但正如您所看到的,图像非常小,因此当加载精灵时,它们会加载一个34x16像素的精灵。当我在1920x1080的画布上渲染这些按钮时,它们太小了。我使用sprite.scale(int scale)来缩放精灵,但是当我缩放它们时,它们看起来很模糊。我想要发生的是,当它们被缩放时,每个像素按比例缩放,保持按钮上的像素化​​效果,而不是来自非常小的纹理的模糊调整大小的图像。我目前使用sprite.render(SpriteBatch batch)渲染精灵。这是使用atlas.createSprite(String name)加载精灵后渲染精灵的正确方法吗?我是新手使用精灵,并从纹理图集加载纹理,所以我想知道这是否是正确的做事方式。

此外,当我初始化游戏时,我从TextureAtlas加载了许多不同的Sprite个对象。每个精灵都拥有一个代表游戏对象的纹理,但是我理解你使用sprite.render(SpriteBatch batch)渲染一个精灵,所以我只能使用一个精灵,从TextureAtlas加载一个游戏对象,因为我还必须设置精灵的比例和位置,因为它代表游戏对象。我习惯于加载Texture,然后在给定位置使用batch.render()渲染此纹理,但如果我使用精灵,我也不知道这是如何实现的。即使我使用batch.render(Sprite, x, y),我也无法正确缩放精灵,因为正如我之前提到的,我想在保持像素化效果的同时缩放精灵,即便如此,使用Sprite.scale()方法,这会将Sprite对象整体缩放,使得无法对多个游戏对象多次使用Sprite纹理。

任何建议都将不胜感激。

我目前用于渲染/加载精灵的代码如下:

从TextureAtlas加载:

public static TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("data/texture/pack/output/pack.pack"));

public static Sprite sprite = atlas.createSprite("buttonUp");
sprite.setScale(10);

渲染精灵:GdxGame.WIDTH / HEIGHT为1920x1080。虽然桌面窗口是从该大小缩小的。因此,所有内容都呈现为屏幕为1920x1080。

    batch = new SpriteBatch();
    camera = new OrthographicCamera(GdxGame.WIDTH, GdxGame.HEIGHT);
    camera.position.set(GdxGame.WIDTH/2, GdxGame.HEIGHT/2, 0);
    camera.setToOrtho(false, GdxGame.WIDTH, GdxGame.HEIGHT);

public void render(float delta){
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    batch.setProjectionMatrix(camera.combined);
    batch.begin();

    camera.update();
    sprite.draw(batch);

    batch.end();
}

经过进一步调查后,我发现我可以使用Sprite.set(Sprite sprite)制作Sprite x Sprite y的副本,因此会多次渲染每个精灵。但是,这并没有解决缩放精灵的问题。我必须进一步强调,在渲染缩放的精灵时,缩放不是由像素完成的,这意味着它是模糊的。但是,当渲染TextureRegion时,如果batch.draw(TextureRegion, x, y, width, height)如果宽度和高度大于原始纹理的宽度和高度,它将缩放每个像素,而不是模糊整个事物以使其看起来像更好。以下是我所说的模糊性的图像:

enter image description here

请注意,即使原始图像较小且像素化,此精灵也会缩放为模糊。

1 个答案:

答案 0 :(得分:2)

您在代码或纹理包中使用了哪些TextureFilter设置?尝试“最近”过滤器。如果你将它设置为“线性”或类似,它将始终采用4个纹理像素(纹素)并插值它们以获得要绘制的像素的颜色。

这可能有助于防止模糊,但我不确定它是否会产生你想要的8位外观......