Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LibGDX缩放和渲染来自TextureAtlas的精灵_Java_Opengl_Textures_Libgdx_Sprite - Fatal编程技术网

Java LibGDX缩放和渲染来自TextureAtlas的精灵

Java LibGDX缩放和渲染来自TextureAtlas的精灵,java,opengl,textures,libgdx,sprite,Java,Opengl,Textures,Libgdx,Sprite,我当前在绘制和缩放精灵时遇到问题 我正在从一个纹理图集加载我的资产,我用LibGDX纹理打包器gui工具打包了这个图集。我的纹理图集图像当前看起来像这样。 这些图像应该是按钮,但正如您所看到的,图像非常小,因此当加载精灵时,它们会加载一个34x16像素的精灵。当我在1920x1080的画布上渲染这些按钮时,它们太小了。我使用sprite.scale(int scale)来缩放精灵,但是当我缩放它们时,它们看起来很模糊。我希望发生的是,当它们被缩放时,每个像素都按比例缩放,保持按钮上的像素效果,

我当前在绘制和缩放精灵时遇到问题

我正在从一个纹理图集加载我的资产,我用LibGDX纹理打包器gui工具打包了这个图集。我的纹理图集图像当前看起来像这样。

这些图像应该是按钮,但正如您所看到的,图像非常小,因此当加载精灵时,它们会加载一个34x16像素的精灵。当我在1920x1080的画布上渲染这些按钮时,它们太小了。我使用
sprite.scale(int scale)
来缩放精灵,但是当我缩放它们时,它们看起来很模糊。我希望发生的是,当它们被缩放时,每个像素都按比例缩放,保持按钮上的像素效果,而不是从一个非常小的纹理模糊调整大小的图像。我目前使用
sprite.render(SpriteBatch批处理)
渲染精灵。使用
atlas.createSprite(字符串名称)
加载精灵后,这是渲染精灵的正确方法吗?我对使用精灵和从纹理图集加载纹理很陌生,所以我想知道这是否是正确的方法

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

如有任何建议,将不胜感激

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

从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
副本,从而多次渲染每个Sprite。但是,这并不能解决缩放精灵的问题。我必须进一步强调,当渲染缩放的精灵时,缩放不是由像素完成的,这意味着它是模糊的。但是,在渲染
TextureRegion
时,例如:
batch.draw(TextureRegion,x,y,width,height)
如果宽度和高度大于原始纹理的宽度和高度,它将缩放每个像素,而不是模糊整个对象以使其看起来更好。下面是我所说的模糊的图像:


请注意,即使原始图像很小并且是像素化的,但该精灵是如何缩放为模糊的。

您在代码或texturepacker中使用的TextureFilter设置是什么?尝试“最近的”过滤器。如果已将其设置为“线性”或类似,则始终需要4个纹理像素(texel)并对其进行插值,以获得要绘制的像素的颜色


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

尝试在
TextureAtlas
文件中设置
过滤器。它是一个文本文件,描述
纹理特拉斯
。读这个。此外,我建议对按钮等使用
NinePatch
图像。Ninebatch可以“缩放”图像的一部分,而其他部分(例如角落)保持不变。