【问题标题】:How to create a healthbar in Libgdx?如何在 Libgdx 中创建一个健康栏?
【发布时间】:2014-08-12 22:43:55
【问题描述】:

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

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

【问题讨论】:

  • 你的问题写得不是很好。您告诉我们您尝试过的方法,但您没有向我们展示代码。我建议使用 Scene2d。向我们展示您在代码中的尝试。

标签: java android libgdx nine-patch scene2d


【解决方案1】:

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

  • 创建一个矩形并用颜色或纹理填充它。
  • 当玩家失去生命值时,将矩形缩小与损失生命值相同的百分比。
  • 创建具有屏幕高度/宽度的基本正交相机。我通常称之为 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);

如果你想要它的某种容器,你可以为它设置一个 Ninepatch 并在后台的动态健康之前绘制它。因此,假设容器在顶部/底部大 2,在左/右大 5。

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 倍,以完美贴合横杆。

【讨论】:

  • 所以您制作了 2 个正交相机,其中一个将用于创建生命值条?我将如何通过在损坏后缩短矩形尺寸,使用 for 循环检查它是否受到攻击并且简单地 - 从一个健康点开始?谢谢你的帮助,它真的会帮助我很多。
  • 到目前为止我已经尝试过了,我知道我肯定缺少代码中的一部分。我也有关于我应该把方法扔到哪里的问题,即在我的主文件中渲染/创建。 gyazo.com/fde6d8f36a027097576b848a491625d8
  • 它还说我的构造函数出现错误。 Java Null Pointer,我认为它与构造函数中的 Vector2 ^ 有关,尽管我认为您需要一个来创建一个矩形并设置其位置。
  • 是的,当您尝试使用它时,您的位置向量为空。我也不熟悉形状渲染器,但是从外观上看,您的游戏是静态的(因为您没有移动的相机。那么您不必为“固定”的 hud/ui 制作另一个相机。只需绘制矩形某处,一旦失去生命就减小它的宽度。基本的HP条应该很容易,也许你应该再做一两个教程。
  • 只要做 position = new Vector2(int, int);填补它。不,你不需要一个矩形,一个矩形只需要几个 int 值。也许你应该专注于在屏幕上绘制、移动和缩放某些东西。如果你掌握了这些基础知识,健康栏就很简单了。
【解决方案2】:

这是你可以做到的,你自己实现逻辑

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;
        }
}

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多