我是一名 android 开发人员,使用 LibGDX 构建我的第一个游戏。读了很多之后,还有一件事我不明白。
我意识到我应该有一组图像,最高分辨率为 2560x1440(为了防止丑陋的放大而不是矢量图像)。
我正在使用 TexturePacker 来打包我的图像,甚至使用线性线性来获得最高质量:
TexturePacker.Settings settings = new TexturePacker.Settings();
settings.filterMin = Texture.TextureFilter.Linear;
settings.filterMag = Texture.TextureFilter.Linear;
settings.maxWidth = 4096;
settings.maxHeight = 2048;
TexturePacker.process(settings, inputDir, outputDir, packFileName);
我已经按照几个 SO 的建议将我的相机设置为固定仪表并避免所有 PPM 的东西。来自 Screen 的 C'TOR:
mCamera = new OrthographicCamera();
mCamera.viewportWidth = 25.6f; ; // 2560 / 100
mCamera.viewportHeight = 14.4f ; // 1440 / 100
mCamera.position.set(mCamera.viewportWidth / 2, mCamera.viewportHeight / 2, 0f);
mCamera.update();
如您所见,我选择使用 1 米 = 100 像素。
现在,这意味着我应该用 1/100 大小绘制我的 Sprite ,我在这里做的是:
TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("images/pack.atlas"));
mImage = atlas.createSprite("image"));
mImage.setSize(mImage.getWidth() / 100 , mImage.getHeight() / 100);
这有效并且图像按预期显示。但是,它们被扭曲得像 hell 一样!完美的圆形图像在边缘看起来像素化而不是圆形。
所以,我的问题是:
谢谢!
编辑
我将改编@Tenfour04 对(1)和(2)的回答。
关于 (3),问题在于 Genymotion :(,它使游戏像素化。我已经在具有多种分辨率的真实设备上对其进行了测试,看起来很完美。
最佳答案
mCamera.viewportHeight = 25.6f; //game screen always 25.6 meters tall
mCamera.viewportWidth = 25.6f / (float)Gdx.graphics.getHeight() *
(float)Gdx.graphics.getWidth();
出于这个原因,我也将避免硬编码
100
在您的代码中无处不在。制作 pixelsPerMeter
游戏开始时设置一次的变量。现在它只能是 100,但如果您决定稍后制作一些分辨率较小的艺术作品,您可以相应地调整它,而无需在代码中找到所有出现的 100。 MipMapLinearLinear
或 MipMapLinearNearest
.否则,当 Sprite 绘制得小于其原始分辨率时,性能会受到影响,并且可能会像您描述的那样看起来失真。您可以查找 mip 映射以了解为什么会出现这种情况。 关于libgdx - 将 Libgdx 和 TexturePacker 与 xxxdpi 图像一起使用会失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36690067/