有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java LibGDX BitmapFont不会停止抖动

我有一个位图字体,当玩家以恒定的速度在屏幕上移动时,它会显示玩家的分数。因为播放器总是在移动,所以我必须重新计算每帧在哪个位置绘制字体。我使用这个代码

    scoreFont.setScale(4f, 4f);
    scoreFont.draw(batch, "" + scoreToShow, playerGhost.pos.x + 100f, 600f);
    playerGhost.render(batch);
  • 问题出在哪里?字体不停地抖动。它只需要几个像素的振动,但它有点明显。当我在平板电脑上运行它时,它会更加明显

  • 这是已知的bug吗

  • 我怎样才能让它停止颤抖

共 (3) 个答案

  1. # 1 楼答案

    调用scorefont.setUseIntegerPositions(false);,这样它就不会将字体的位置四舍五入到最接近的整数。您可能还希望将字体的最小过滤设置为Linear或MipmapLinearNet,最大过滤设置为Linear

    默认行为的原因是默认配置适用于像素完美的文本,适用于单位等于像素大小的视口集。如果视口的尺寸与屏幕的像素尺寸完全相同,此配置将有助于防止文本看起来稍微模糊

  2. # 2 楼答案

    实际上,这可能是因为您正在缩放字体

    我遇到了这个问题,它很难理解(也很难修复)

    基本上,在缩放字体时,BitmapFont会通过除法/乘法更改BitmapFontData中的值。如果使用许多不同的值(或不吉利的值组合)进行大量缩放,可能会引入舍入错误,从而导致字体边缘闪烁

    我最终实现的解决方案是编写一个Fontholder,它存储所有原始BitmapFontData值。然后,我将字体数据重置为每帧开头的原始值(即render()方法的开始)

    这是密码

    package com.bigcustard.blurp.core;
    
    import com.badlogic.gdx.graphics.g2d.*;
    
    public class FontHolder {
    
    
        private BitmapFont font;
        private final float lineHeight;
        private final float spaceWidth;
        private final float xHeight;
        private final float capHeight;
        private final float ascent;
        private final float descent;
        private final float down;
        private final float scaleX;
        private final float scaleY;
    
        public FontHolder(BitmapFont font) {
    
            this.font = font;
    
            BitmapFont.BitmapFontData data = font.getData();
            this.lineHeight = data.lineHeight;
            this.spaceWidth = data.spaceWidth;
            this.xHeight = data.xHeight;
            this.capHeight = data.capHeight;
            this.ascent = data.ascent;
            this.descent = data.descent;
            this.down = data.down;
            this.scaleX = data.scaleX;
            this.scaleY = data.scaleY;
        }
    
        // Call this at start of each frame.
        public void reset() {
    
            BitmapFont.BitmapFontData data = font.getData();
            data.lineHeight = this.lineHeight;
            data.spaceWidth = this.spaceWidth;
            data.xHeight = this.xHeight;
            data.capHeight = this.capHeight;
            data.ascent = this.ascent;
            data.descent = this.descent;
            data.down = this.down;
            data.scaleX = this.scaleX;
            data.scaleY = this.scaleY;
        }
    
        public BitmapFont getFont() {
    
            return font;
        }
    }
    

    我对此并不狂野,因为它有点骇人,但这是一种必要的邪恶,它将完全正确地解决这个问题

  3. # 3 楼答案

    正确的处理方法是使用两个不同的摄像头和两个不同的SpriteBatch,一个用于游戏本身,另一个用于UI。 在两个摄影机上调用update()方法,并在每个批处理上使用spriteBatch.setProjectionMatrix(camera.combined);在每个帧的同时渲染它们