Java 健康+;屏蔽条

Java 健康+;屏蔽条,java,Java,所以我想在我的游戏中做一个健康+防护栏。如果你曾经玩过传奇联盟或风暴英雄,我会尝试创建一个类似的健康和防护栏。如果没有,我有一些图片给你: (stackoverflow不允许我发布超过2个链接,所以请想象一个完整的健康栏:)) 第一个例子就是显示健康状况的正常健康栏。通过乘以健康百分比(health/maxHealth)并将该数字乘以健康条的长度(51),我可以很好地实现这一点 第二个例子显示了当玩家处于完全健康状态时,生命值和盾牌的外观。这也很好用 我的问题来了,当球员还没有完全恢复健康的

所以我想在我的游戏中做一个健康+防护栏。如果你曾经玩过传奇联盟或风暴英雄,我会尝试创建一个类似的健康和防护栏。如果没有,我有一些图片给你:

(stackoverflow不允许我发布超过2个链接,所以请想象一个完整的健康栏:))

第一个例子就是显示健康状况的正常健康栏。通过乘以健康百分比(health/maxHealth)并将该数字乘以健康条的长度(51),我可以很好地实现这一点

第二个例子显示了当玩家处于完全健康状态时,生命值和盾牌的外观。这也很好用

我的问题来了,当球员还没有完全恢复健康的时候。正如你所看到的,在第一张图片中,加里斯塔拥有大约550条生命。当她获得盾牌时,她的健康栏达到850左右,而300个健康盾牌是灰色的。一旦她受到了大约300点生命值的伤害,300点生命盾不再像850点生命值时那样被压缩。我的HUD健康栏一直工作到这一点。即使当健康栏还没有满负荷运行时,它也会试图将盾牌和健康压缩成健康栏的样子

以下是我当前的代码:

package net.masterzach32.sidescroller.assets.gfx;

import java.awt.*;
import java.awt.image.BufferedImage;

import net.masterzach32.sidescroller.assets.Assets;
import net.masterzach32.sidescroller.entity.EntityPlayer;
import net.masterzach32.sidescroller.util.LogHelper;

public class HUD {

private EntityPlayer player;

private BufferedImage image;
private Font font;

double b0 = 31, b1 = 20, hx = 31, mx = 20;

public HUD(EntityPlayer p) {
    player = p;
    try {
        image = Assets.getImageAsset("hud");

        font = new Font("Arial", Font.PLAIN, 14);
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

public void render(Graphics2D g) {
    g.drawImage(image, 0, 15, null);

    double h0 = player.getHealth() / player.getMaxHealth();
    double h1 = h0 * hx;
    double m0 = player.getShield() / player.getMaxShield();
    double m1 = m0 * mx;

    if((int) (h1 + m1) <= hx + mx) {
        int f = (int) (mx - m1);
        h1 += f;
    }

    LogHelper.logInfo("" + (int) (h1 + m1));
    if(h1 >= b0) b0 = h1;
    if(h1 < b0) b0 -= .7;
    if(m1 >= b1) b1 = m1;
    if(m1 < b1) b1 -= .7;

    // health bar
    g.setColor(new Color(200, 0, 0));
    g.fillRect(17, 18, (int) b0, 13);
    g.setColor(new Color(0, 170, 0));
    g.fillRect(17, 18, (int) h1, 13);
    // mana bar
    g.setColor(new Color(200, 0, 0));
    g.fillRect((int) (17 + b0), 18, (int) b1, 13);
    g.setColor(Color.BLUE);
    g.fillRect((int) (17 + h1), 18, (int) m1, 13);

    g.setFont(font);
    g.setColor(Color.WHITE);
    if(player.getOrbCurrentCd() > 0) g.drawString("" + (player.getOrbCurrentCd() / 60 + 1), 0, 12);
    else g.drawString("" + (player.getOrbCurrentCd() / 60), 0, 12);
    g.drawString(player.getLevel() + " - " + (int) player.getExp() + "/" + (int) player.getMaxExp(), 1, 70);
    g.setFont(font);
    g.drawString((int) (player.getHealth()) + "/" + (int) (player.getMaxHealth()), 16, 29);
}
}    
package net.masterzach32.sidescroller.assets.gfx;
导入java.awt.*;
导入java.awt.image.buffereImage;
导入net.masterzach32.sidescroller.assets.assets;
导入net.masterzach32.sidescroller.entity.EntityPlayer;
导入net.masterzach32.sidescroller.util.LogHelper;
公共级平显{
私人球员;
私有缓冲图像;
专用字体;
双b0=31,b1=20,hx=31,mx=20;
公共HUD(全层p){
玩家=p;
试一试{
image=Assets.getImageAsset(“hud”);
font=新字体(“Arial”,font.PLAIN,14);
}
捕获(例外e){
e、 printStackTrace();
}
}
公共无效渲染(图形2D g){
g、 drawImage(图像,0,15,空);
double h0=player.getHealth()/player.getMaxHealth();
双h1=h0*hx;
double m0=player.getShield()/player.getMaxShield();
双m1=m0*mx;
如果((int)(h1+m1)=b0)b0=h1;
如果(h1=b1)b1=m1;
如果(m10)g.drawString(“+(player.getOrbCurrentCd()/60+1),则为0,12);
else g.drawString(“+(player.getOrbCurrentCd()/60),0,12);
g、 抽绳(player.getLevel()+“-”+(int)player.getExp()+“/”+(int)player.getMaxExp(),1,70);
g、 setFont(字体);
g、 抽绳((int)(player.getHealth())+“/”+(int)(player.getMaxHealth()),16,29);
}
}    

作为提示,使用游戏库或引擎。您能详细说明一下您遇到的问题吗?也许还可以添加一些您实际看到的屏幕截图。我也没有看到一个
main
,所以我假设它不是什么东西,这通常是这里的一个要求。你看,扎克,根本的问题是我们不能自己运行它来发现问题。因此,您应该非常清楚地解释如何计算生命值和盾牌值。最好是一个独立的小程序来演示您遇到的问题:你还应该编辑你的问题标题。大多数人看到这样的标题后都不想看问题。