【问题标题】:How do I make a ProgressBar work in LibGDX?如何使 ProgressBar 在 LibGDX 中工作?
【发布时间】:2014-08-17 13:05:15
【问题描述】:

我正在尝试了解如何在 LibGDX 中使用 ProgressBar。

我已经创建了栏,但我不知道如何使它工作。我想复制旋钮以在 60 秒内填充条(背景线)。我知道如何管理时间,但是 ProgressBar 的类中没有方法可以用旋钮填充条。至少,我还没有看到它(或者我不明白如何,可能)。这是我的代码:

ProgressBar 的代码:

skin = new Skin();
Pixmap pixmap = new Pixmap(10, 10, Format.RGBA8888);
pixmap.setColor(Color.WHITE);
pixmap.fill();
skin.add("white", new Texture(pixmap));

textureBar = new TextureRegionDrawable(new TextureRegion(new Texture(Gdx.files.internal("barGreen_horizontalMid.png"))));
barStyle = new ProgressBarStyle(skin.newDrawable("white", Color.DARK_GRAY), textureBar);
bar = new ProgressBar(0, 10, 0.5f, false, barStyle);
bar.setPosition(10, 10);
bar.setSize(290, bar.getPrefHeight());
bar.setAnimateDuration(2);
stage.addActor(bar);

我知道我可以使用setValue(float) 方法移动旋钮。但我想要的是用旋钮的纹理填充条。这是一个栏的屏幕截图和旋钮。

谁能帮助我理解这一点?提前致谢。

【问题讨论】:

    标签: java libgdx progress-bar scene2d


    【解决方案1】:

    我遇到了同样的问题,终于发现了。

    你必须为 knobBefore 属性设置一个样式来实现你想要的。 试试这个:

    barStyle = new ProgressBarStyle(skin.newDrawable("white", Color.DARK_GRAY), textureBar);
    barStyle.knobBefore = barStyle.knob;
    bar = new ProgressBar(0, 10, 0.5f, false, barStyle);
    

    希望这会有所帮助!

    【讨论】:

    • 哇,这拯救了我的一天!谢谢!
    【解决方案2】:

    尝试使用 setValue(float value) 函数。在此之前还要设置步长和最小/最大值。

    【讨论】:

    • 感谢您的回答。我知道我必须在render() 中用setValue(float) 移动旋钮的位置。我想要的是复制旋钮以填充ProgressBar。你能帮帮我吗?
    • 好吧,假设你的 minValue 为 0,maxValue 为 100,stepsize 为 1。你使用了这个:setValue(10)。当您更新进度条时,它应该是 %10。我个人认为没有足够的关于 ProgressBar 类的信息。因此,如果您想创建自己的进度条类,请查看以下示例:github.com/Matsemann/libgdx-loading-screen
    • 是的,我了解你,但我想使用 Scene2D 包中的 ProgressBar 类。我已经用屏幕截图和代码更新了我的问题。
    • 我不认为 ProgressBar 类有这个功能。但是,您可以通过将 TextureRegion( Texture ) 更改为 TextureRegion( Texture texture, float width, float height) 并按时间更改宽度值来做到这一点。您还需要将“barGreen_horizo​​​​ntalMid.png”更改为完全加载的栏。
    【解决方案3】:

    当您使用屏幕时,您没有可用的内置 ProgressBar,因此您可以使用 ShapeRenderer 来绘制您的 ProgressBar,如下所示:

    import com.badlogic.gdx.Game;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Screen;
    import com.badlogic.gdx.graphics.Color;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.OrthographicCamera;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.g2d.BitmapFont;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
    import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
    import com.badlogic.gdx.math.Rectangle;
    import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar;
    import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar.ProgressBarStyle;
    import com.badlogic.gdx.scenes.scene2d.ui.Skin;
    import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
    import com.badlogic.gdx.utils.TimeUtils;
    
    public class LoadingScreen implements Screen {
        private MyGame mGame;
        private BitmapFont bf_loadProgress;
        private long progress = 0;
        private long startTime = 0;
        private ShapeRenderer mShapeRenderer;
        private OrthographicCamera camera;
        private final int screenWidth = 800, screenHeight = 480;
    
        public LoadingScreen(Game game) {
            mGame = (MyGame) game;
            bf_loadProgress = new BitmapFont();
            bf_loadProgress.setScale(2, 1);
            mShapeRenderer = new ShapeRenderer();
            startTime = TimeUtils.nanoTime();
            initCamera();
        }
    
        private void initCamera() {
            camera = new OrthographicCamera();
            camera.setToOrtho(false, screenWidth, screenHeight);
            camera.update();
    
        }
    
        @Override
        public void show() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void render(float delta) {
            Gdx.gl.glClearColor(0, 0, 0.2f, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            showLoadProgress();
        }
    
        /**
         * Show progress that updates after every half second "0.5 sec"
         */
        private void showLoadProgress() {
    
            long currentTimeStamp = TimeUtils.nanoTime();
            if (currentTimeStamp - startTime > TimeUtils.millisToNanos(500)) {
                startTime = currentTimeStamp;
                progress = progress + 10;
            }
            // Width of progress bar on screen relevant to Screen width
            float progressBarWidth = (screenWidth / 100) * progress;
    
            mGame.getBatch().setProjectionMatrix(camera.combined);
            mGame.getBatch().begin();
            bf_loadProgress.draw(mGame.getBatch(), "Loading " + progress + " / " + 100, 10, 40);
            mGame.getBatch().end();
    
            mShapeRenderer.setProjectionMatrix(camera.combined);
            mShapeRenderer.begin(ShapeType.Filled);
            mShapeRenderer.setColor(Color.YELLOW);
            mShapeRenderer.rect(0, 10, progressBarWidth, 10);
            mShapeRenderer.end();
            if (progress == 100)
                moveToMenuScreen();
    
        }
    
        /**
         * Move to menu screen after progress reaches 100%
         */
        private void moveToMenuScreen() {
            mGame.setScreen(new MenuScreen(mGame));
            dispose();
        }
    
        @Override
        public void resize(int width, int height) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void pause() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void resume() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void hide() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void dispose() {
            bf_loadProgress.dispose();
            mShapeRenderer.dispose();
        }
    
    }
    

    这会在屏幕底部绘制一个进度条,并以文本形式显示进度。

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多