如何在Libgdx中创建健康栏?

时间:2014-06-22 23:19:24

标签: java android libgdx nine-patch scene2d

我一直想知道如何在libgdx / java中创建一个健康栏。我正在研究一个Shape Renderer,我认为我可以使用填充形状来创建一个健康栏,但我不确定如何在这个方向上进行操作。另一方面,我一直在研究使用scene2D和NinePatches为游戏创建健康栏。我试图通过在谷歌上查找网站来使用NinePatch / Scene2D,虽然看起来当我添加代码时,我总是遇到问题,当我尝试将其渲染到我的屏幕时。所以,如果有人可以帮助我使用任何方法在libgdx中创建一个功能健康栏,我将非常感激。谢谢。

我还不能发布图片,因为我没有发布10个帖子。所以这是链接http://gyazo.com/6650f3d820f31c99c3f8061ebed0bdec。遗憾

2 个答案:

答案 0 :(得分:1)

我对Scene2D和阶段没有任何经验,但这是我如何做一个简单的健康栏:

  • 创建一个矩形并用颜色或纹理填充它。
  • 当玩家失去HP时,缩短该矩形的百分比与HP丢失的百分比相同。
  • 使用屏幕的高度/宽度创建基本的正交相机。我通常称之为viewportCam。
  • 在所有其他绘制逻辑之下,您也可以更改SpriteBatch spriteBatch(viewportCam.Combined)
  • 在此spritebatch中绘制健康栏。
public void Draw()
{
    spriteBatch(normalCam.combined);
    spriteBatch.begin();
    //Normal draw logic.
    spriteBatch.end();

    spriteBatch(viewportCam.combined);
    spriteBatch.begin();
    //Draw UI elements last so the will be drawn on top of the rest.
    spriteBatch.end();
}
  • 如果您在健康栏后面画一个略大的矩形,那么您就拥有了一个边框。
  • 您可以根据剩余的健康百分比来更改颜色。

修改

刚刚遇到这个并且目前正在使用其他方法。我是一个1像素宽的红色渐变的九点。 health = new NinePatch(gradient, 0, 0, 0, 0)这可确保在拉伸时不会出现伪影。从这里我只计算它需要多长时间并绘制它。

width = currentHealth / totalHealth * totalBarWidth;

现在你可以在任何你想要的地方画画了。

health.draw(batch, 10, 10, width, gradient.getHeight);

如果你想要一些容器,你可以为它设置一个9patch并在后台的动态健康状态之前绘制它。因此,假设容器在顶部/底部较大,在左侧/右侧较大。

container = new NinePatch(containerRegion, 5, 5, 2, 2);
//Offset it by the dynamic bar, let's say the gradient is 4 high.
container.draw(batch, 5, 8, totalBarWidth + 10, 8);
health.draw(batch, 10, 10, width, 4);

我将容器5“硬编码”到左侧,使其长10,使其水平放置。我垂直地将它降低了2并使其高8以完全适合该杆。

答案 1 :(得分:1)

这就是你如何做到这一点,实现你自己的逻辑

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;


public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
     int i=0;
    Texture texture,texture2;
    @Override
    public void create () {
        batch = new SpriteBatch();

        initTestObjects() ;
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0, 0, 0, 0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();


        batch.draw(texture2,100,100,300,20);
    batch.draw(texture,100,100,i,20);
    if(i>300)
    {
        i=0;
    }
    i++;

        batch.end();
    }
    private void initTestObjects() {

        int width =1 ;
        int height = 1;
        Pixmap pixmap = createProceduralPixmap(width, height,0,1,0);
        Pixmap pixmap2 = createProceduralPixmap(width, height,1,0,0);

    texture = new Texture(pixmap);
    texture2 = new Texture(pixmap2);



        }



    private Pixmap createProceduralPixmap (int width, int height,int r,int g,int b) {
        Pixmap pixmap = new Pixmap(width, height, Format.RGBA8888);

        pixmap.setColor(r, g, b, 1);
        pixmap.fill();

        return pixmap;
        }
}