VGUI Health bar: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (Moved setup stuff from Init() to Reset() and then made Init() call Reset(). Without this, if HUD messages were added, they would be recieved multiple times by the client.)
(Rewrite Template:Lang to Template:LanguageBar. This action was performed by a bot.)
 
(18 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{{LanguageBar}}
[[File:Health Bar.png|thumb]]
==Overview==
==Overview==
This tutorial will show you how to make a VGUI Health Bar implementation. This is a simple copy and paste tutorial and works on both EP1 and OB engines.
This tutorial will show you how to make a [[VGUI]] [[Health]] Bar implementation. This is a simple copy and paste tutorial that works out of the box for the 2013 SDK


==Code==
==Code==
First create '''hud_hull.cpp''' and '''hud_hull.h''' in your CLIENT project then paste these files into them:
First create '''hud_healthbar.cpp''' and '''hud_healthbar.h''' in your CLIENT project then paste this stuff into them:


==hud_hull.cpp==
==hudhealthbar.cpp==
<pre>
<source lang="cpp">
#include "cbase.h"  
#include "cbase.h"  
#include "hud.h"  
#include "hud.h"  
#include "hud_hull.h"
#include "hud_macros.h"  
#include "hud_macros.h"  
#include "c_sdk_player.h"  
#include "c_baseplayer.h"
#include "hudhealthbar.h"  
#include "iclientmode.h"  
#include "iclientmode.h"  
#include "vgui/ISurface.h"


using namespace vgui;
using namespace vgui;
Line 18: Line 22:
#include "tier0/memdbgon.h"  
#include "tier0/memdbgon.h"  


DECLARE_HUDELEMENT (CHudHull);
DECLARE_HUDELEMENT (CHudHealthbar);


# define HULL_INIT 80  
# define HULL_INIT 80  
Line 26: Line 30:
//------------------------------------------------------------------------
//------------------------------------------------------------------------


CHudHull:: CHudHull (const char * pElementName) :  
CHudHealthbar:: CHudHealthbar (const char * pElementName) :  
CHudElement (pElementName), BaseClass (NULL, "HudHull")
CHudElement (pElementName), BaseClass (NULL, "HudHealthbar")
{
{
vgui:: Panel * pParent = g_pClientMode-> GetViewport ();
vgui:: Panel * pParent = g_pClientMode-> GetViewport ();
Line 39: Line 43:
//------------------------------------------------------------------------
//------------------------------------------------------------------------


void CHudHull:: Init()
void CHudHealthbar:: Init()
{
{
Reset();
Reset();
Line 48: Line 52:
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------


void CHudHull:: Reset (void)
void CHudHealthbar:: Reset (void)
{
{
m_flHull = HULL_INIT;
m_flHull = HULL_INIT;
Line 60: Line 64:
//------------------------------------------------------------------------
//------------------------------------------------------------------------


void CHudHull:: OnThink (void)
void CHudHealthbar:: OnThink (void)
{
{
float newHull = 0;
float newHull = 0;
Line 84: Line 88:
//------------------------------------------------------------------------
//------------------------------------------------------------------------


void CHudHull::Paint()
void CHudHealthbar::Paint()
{
{
// Get bar chunks
// Get bar chunks
Line 121: Line 125:
surface()->DrawPrintText(L"HULL", wcslen(L"HULL"));
surface()->DrawPrintText(L"HULL", wcslen(L"HULL"));
}
}
</pre>
</source>


 
==hudhealthbar.h==
==hud_hull.h==
<source lang="cpp">
<pre>
#if !defined HUD_HULL_H
#if !defined HUD_HULL_H
#define HUD_HULL_H  
#define HUD_HULL_H  
Line 140: Line 143:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------


class CHudHull : public CHudElement, public vgui::Panel
class CHudHealthbar : public CHudElement, public vgui::Panel
{
{


DECLARE_CLASS_SIMPLE(CHudHull, vgui::Panel);
DECLARE_CLASS_SIMPLE(CHudHealthbar, vgui::Panel);


public:
public:
CHudHull(const char * pElementName);
CHudHealthbar(const char * pElementName);


virtual void Init (void);
virtual void Init(void);
virtual void Reset (void);
virtual void Reset(void);
virtual void OnThink (void);
virtual void OnThink(void);


protected:
protected:
Line 176: Line 179:


#endif // HUD_SUITPOWER_H
#endif // HUD_SUITPOWER_H
</pre>
</source>
 


==HudLayout.res==
==HudLayout.res==
Now add this to your '''HudLayout.res''' file in the scripts folder, located in your mod directory:
Now add this to your '''HudLayout.res''' file in the '''scripts''' folder, located in your mod directory, at the bottom of all the other entries:
<pre>
<pre>
HudHull
    HudHealthbar
{
    {
 
"fieldName" "HudHull"
"visible" "1"
"enabled" "1"
"xpos" "12"
"ypos" "420"
"wide" "120"
"tall" "10"
"text_xpos" "5"
"text_ypos" "2"
"TextColor" "0 255 0 80"
"PaintBackgroundType" "2"


}
    "fieldName" "CHudHealthBar"
</pre>
    "visible" "1"
    "enabled" "1"
    "xpos" "12"
    "ypos" "420"
    "wide" "120"
    "tall" "10"
    "text_xpos" "5"
    "text_ypos" "2"
    "TextColor" "0 255 0 80"
    "PaintBackgroundType" "2"


==Non-Scratch Build Fix==
    }
Simply change the includes in hud_hull.cpp from:
<pre>
#include "cbase.h"
#include "hud.h"
#include "hud_hull.h"
#include "hud_macros.h"
#include "c_sdk_player.h"
#include "iclientmode.h"
</pre>
to:
<pre>
#include "cbase.h"
#include "hud.h"
#include "hud_macros.h"
#include "c_baseplayer.h"
#include "hud_hull.h"
#include "iclientmode.h"
#include "vgui/ISurface.h"
</pre>
</pre>
The Health bar should now work in a Single Player Non-Scratch Build mod.
[[Category:Programming]] [[Category:VGUI]]

Latest revision as of 17:42, 18 July 2025

English (en)Español (es)Русский (ru)Українська (uk)Translate (Translate)
Health Bar.png

Overview

This tutorial will show you how to make a VGUI Health Bar implementation. This is a simple copy and paste tutorial that works out of the box for the 2013 SDK

Code

First create hud_healthbar.cpp and hud_healthbar.h in your CLIENT project then paste this stuff into them:

hudhealthbar.cpp

#include "cbase.h" 
#include "hud.h" 
#include "hud_macros.h" 
#include "c_baseplayer.h" 
#include "hudhealthbar.h" 
#include "iclientmode.h" 
#include "vgui/ISurface.h"

using namespace vgui;

#include "tier0/memdbgon.h" 

DECLARE_HUDELEMENT (CHudHealthbar);

# define HULL_INIT 80 

//------------------------------------------------------------------------
// Purpose: Constructor
//------------------------------------------------------------------------

CHudHealthbar:: CHudHealthbar (const char * pElementName) : 
	CHudElement (pElementName), BaseClass (NULL, "HudHealthbar")
{
	vgui:: Panel * pParent = g_pClientMode-> GetViewport ();
	SetParent (pParent);

	SetHiddenBits (HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT);
}

//------------------------------------------------------------------------
// Purpose:
//------------------------------------------------------------------------

void CHudHealthbar:: Init()
{
	Reset();
}

//------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------

void CHudHealthbar:: Reset (void)
{
	m_flHull = HULL_INIT;
	m_nHullLow = -1;
	SetBgColor (Color (0,0,0,128));
}


//------------------------------------------------------------------------
// Purpose:
//------------------------------------------------------------------------

void CHudHealthbar:: OnThink (void)
{
	float newHull = 0;
	C_BasePlayer * local = C_BasePlayer:: GetLocalPlayer ();

	if (!local)
		return;

	// Never below zero 
	newHull = max(local->GetHealth(), 0);

	// DevMsg("Sheild at is at: %f\n",newShield);
	// Only update the fade if we've changed health
	if (newHull == m_flHull)
		return;

	m_flHull = newHull;
}


//------------------------------------------------------------------------
// Purpose: draws the power bar
//------------------------------------------------------------------------

void CHudHealthbar::Paint()
{
	// Get bar chunks

	int chunkCount = m_flBarWidth / (m_flBarChunkWidth + m_flBarChunkGap);
	int enabledChunks = (int)((float)chunkCount * (m_flHull / 100.0f) + 0.5f );

	// Draw the suit power bar
	surface()->DrawSetColor (m_HullColor);

	int xpos = m_flBarInsetX, ypos = m_flBarInsetY;

	for (int i = 0; i < enabledChunks; i++)
	{
		surface()->DrawFilledRect(xpos, ypos, xpos + m_flBarChunkWidth, ypos + m_flBarHeight);
		xpos += (m_flBarChunkWidth + m_flBarChunkGap);
	}

	// Draw the exhausted portion of the bar.
	surface()->DrawSetColor(Color(m_HullColor [0], m_HullColor [1], m_HullColor [2], m_iHullDisabledAlpha));

	for (int i = enabledChunks; i < chunkCount; i++)
	{
		surface()->DrawFilledRect(xpos, ypos, xpos + m_flBarChunkWidth, ypos + m_flBarHeight);
		xpos += (m_flBarChunkWidth + m_flBarChunkGap);
	}

	// Draw our name

	surface()->DrawSetTextFont(m_hTextFont);
	surface()->DrawSetTextColor(m_HullColor);
	surface()->DrawSetTextPos(text_xpos, text_ypos);

	//wchar_t *tempString = vgui::localize()->Find("#Valve_Hud_AUX_POWER");

	surface()->DrawPrintText(L"HULL", wcslen(L"HULL"));
}

hudhealthbar.h

#if !defined HUD_HULL_H
#define HUD_HULL_H 

#ifdef _WIN32
#pragma once
#endif

#include "hudelement.h"
#include "hud_numericdisplay.h"

//-----------------------------------------------------------------------------
// Purpose: Shows the hull bar
//-----------------------------------------------------------------------------

class CHudHealthbar : public CHudElement, public vgui::Panel
{

	DECLARE_CLASS_SIMPLE(CHudHealthbar, vgui::Panel);

public:
	CHudHealthbar(const char * pElementName);

	virtual void Init(void);
	virtual void Reset(void);
	virtual void OnThink(void);

protected:
	virtual void Paint();

private:
	CPanelAnimationVar(Color, m_HullColor, "HullColor", "255 0 0 255");
	CPanelAnimationVar(int, m_iHullDisabledAlpha, "HullDisabledAlpha", "50");
	CPanelAnimationVarAliasType(float, m_flBarInsetX, "BarInsetX", "26", "proportional_float");
	CPanelAnimationVarAliasType(float, m_flBarInsetY, "BarInsetY", "3", "proportional_float");
	CPanelAnimationVarAliasType(float, m_flBarWidth, "BarWidth", "84", "proportional_float");
	CPanelAnimationVarAliasType(float, m_flBarHeight, "BarHeight", "4", "proportional_float");
	CPanelAnimationVarAliasType(float, m_flBarChunkWidth, "BarChunkWidth", "2", "proportional_float");
	CPanelAnimationVarAliasType(float, m_flBarChunkGap, "BarChunkGap", "1", "proportional_float");
	CPanelAnimationVar(vgui::HFont, m_hTextFont, "TextFont", "HUDBarText");
	CPanelAnimationVarAliasType(float, text_xpos, "text_xpos", "2", "proportional_float");
	CPanelAnimationVarAliasType(float, text_ypos, "text_ypos", "2", "proportional_float");
	CPanelAnimationVarAliasType(float, text2_xpos, "text2_xpos", "8", "proportional_float");
	CPanelAnimationVarAliasType(float, text2_ypos, "text2_ypos", "40", "proportional_float");
	CPanelAnimationVarAliasType(float, text2_gap, "text2_gap", "10", "proportional_float");
	float m_flHull;
	int m_nHullLow;

};

#endif // HUD_SUITPOWER_H

HudLayout.res

Now add this to your HudLayout.res file in the scripts folder, located in your mod directory, at the bottom of all the other entries:

    HudHealthbar
    {

    "fieldName" "CHudHealthBar"
    "visible" "1"
    "enabled" "1"
    "xpos" "12"
    "ypos" "420"
    "wide" "120"
    "tall" "10"
    "text_xpos" "5"
    "text_ypos" "2"
    "TextColor" "0 255 0 80"
    "PaintBackgroundType" "2"

    }