Java LibGdx拉伸/变形像素(例如在像素艺术中)

Java LibGdx拉伸/变形像素(例如在像素艺术中),java,android,libgdx,desktop,Java,Android,Libgdx,Desktop,我是Libgdx的新手。我试图制作像素艺术游戏,但我有一个问题。当我使用纹理渲染精灵时,像素会变形拉伸(我在第二幅图像中添加了红色箭头)。 我制作了400x400窗口和缩放的精灵,以1:1的比例适应屏幕宽度(精灵宽度=屏幕宽度,精灵高度=屏幕宽度) 图像: 这是主游戏类的代码: public class Pixel implements ApplicationListener { SpriteBatch batch; Texture testTexture; S

我是Libgdx的新手。我试图制作像素艺术游戏,但我有一个问题。当我使用纹理渲染精灵时,像素会变形拉伸(我在第二幅图像中添加了红色箭头)。 我制作了400x400窗口和缩放的精灵,以1:1的比例适应屏幕宽度(精灵宽度=屏幕宽度,精灵高度=屏幕宽度)

图像:

这是主游戏类的代码:

public class Pixel implements ApplicationListener {

    SpriteBatch batch;
    Texture testTexture;
    Sprite testSprite;
    int w;
    int h;

    @Override
    public void create() {
        batch = new SpriteBatch();
        testTexture = new Texture(Gdx.files.internal("test.png"));
        testSprite = new Sprite(testTexture);
        testSprite.setSize(w, w);
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        testSprite.draw(batch);
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
        w = width;
        h = height;
        create();
    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub
    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub
    }
}
这是桌面入门课程:

public class DesktopLauncher {
    public static void main(String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        config.width = 400;
        config.height = 400;
        new LwjglApplication(new Pixel(), config);
    }
}

首先,在每次调整游戏大小时调用create并不是一个好主意,因为您创建了一个spritebatch和一个sprite。 创建其他将更改精灵大小的函数

您的创建方法:

 @Override
public void create() {
    batch = new SpriteBatch();
    testTexture = new Texture(Gdx.files.internal("test.png"));
    testSprite = new Sprite(testTexture);
    testSprite.setSize(w, w);
}
如您所见,将精灵大小设置为w和w,您可能希望将其设置为w和h。 让其他函数只做这个,或者甚至不用麻烦让其他函数在你的调整大小方法中改变你的精灵大小

public void resize(int width, int height) {
    w = width;
    h = height;
    testSprite.setSize(w, h);
}

拉伸瑕疵是由于未按整数倍缩放精灵造成的。400不是纹理尺寸的整数倍(64)。使用最近过滤,您可以在各个方向上进行取整。这是无法避免的。您的窗口比纹理大6.25倍,因此其中一些像素必须比其他像素缩放得更大才能填充整个窗口。如果您想解决这个问题,请考虑使用FITVIEW端口。< /P>
正如Paul所说,
testSprite.setSize
应该在
resize
方法中。您不应该从
resize
方法调用
create
。除了浪费时间重新创建所有内容外,您还泄漏了原始sprite批处理中的着色器程序等内容

谢谢你的快速回复!我使用w和w只是因为我想保持精灵的高宽比为1:1。我是java i libgdx新手,所以你帮了我很多忙。:-)