(C++) HealthBarSceneNode ( health bar above player)
(C++) HealthBarSceneNode ( health bar above player)
/*******************************************************************
* Copyright (C) 2006 Brett R. Jones issued to public domain
*********************************************************************/
#ifndef VX_HEALTH_SCENE_NODE_H
#define VX_HEALTH_SCENE_NODE_H
#include "ISceneNode.h"
#include "ISceneCollisionManager.h"
namespace irr
{
namespace scene
{
class VxHealthSceneNode : public ISceneNode
{
public:
//! constructor
VxHealthSceneNode( ISceneNode* parent,
ISceneManager* mgr,
s32 id,
scene::ISceneCollisionManager* coll,
s32 width = 100,
s32 height = 10,
const core::vector3df& position = core::vector3df(0,0,0),
video::SColor BarColor=video::SColor(150,0,200,0),
video::SColor BkgColor=video::SColor(150,200,0,0),
video::SColor BoarderColor=video::SColor(200,220,220,220) );
//! destructor
virtual ~VxHealthSceneNode();
virtual void OnPreRender();
//! renders the node.
virtual void render();
//! returns the axis aligned bounding box of this node
virtual const core::aabbox3d<f32>& getBoundingBox() const;
//! returns amount of materials used by this scene node.
virtual s32 getMaterialCount();
//! sets progress percentage ( or health )
virtual void setProgress( s32 s32Percent );
//! sets the color of the progress bar
virtual void setProgressColor(video::SColor color);
//! sets the color of the progress bar background
virtual void setBackgroundColor(video::SColor color);
//! sets the color of the progress bar border
virtual void setBorderColor(video::SColor color);
private:
core::aabbox3d< f32 > Box;
video::SColor BarColor;
video::SColor BorderColor;
video::SColor BkgColor;
scene::ISceneCollisionManager* Coll;
core::dimension2d<s32> m_gDim; //dimension width, height
s32 m_bBorder;
s32 MaxNum;
s32 isVisible;
s32 m_s32Percent;
};
} // end namespace scene
} // end namespace irr
#endif // VX_HEALTH_SCENE_NODE_H
/*******************************************************************
* Copyright (C) 2006 Brett R. Jones issued to public domain
*********************************************************************/
#include "irrlicht.h"
#include "VxHealthSceneNode.h"
#include "ISceneManager.h"
#include "IVideoDriver.h"
namespace irr
{
namespace scene
{
//! constructor
VxHealthSceneNode::VxHealthSceneNode( ISceneNode* parent,
ISceneManager* mgr,
s32 id,
scene::ISceneCollisionManager* coll,
s32 width,
s32 height,
const core::vector3df& position,
video::SColor BarColorIn,
video::SColor BkgColorIn,
video::SColor BorderColorIn )
: ISceneNode(parent, mgr, id, position),
Coll(coll),
BarColor(BarColorIn),
BkgColor(BkgColorIn),
BorderColor(BorderColorIn),
m_gDim( width, height ),
m_bBorder(1),
isVisible(1),
m_s32Percent(100)
{
#ifdef _DEBUG
setDebugName("VxHealthSceneNode");
#endif
setAutomaticCulling(false);
//////////////////////////////////////////////////////////
//Set Bounding box
f32 halfWidth = (f32)m_gDim.Width/2;
f32 halfHeight = (f32)m_gDim.Height/2;
Box.MinEdge.set(-halfWidth,-halfHeight,-1.0);
Box.MaxEdge.set(halfWidth,halfHeight,1.0);
}
//! destructor
VxHealthSceneNode::~VxHealthSceneNode()
{
}
void VxHealthSceneNode::OnPreRender()
{
if (IsVisible)
SceneManager->registerNodeForRendering(this, ESNRP_SHADOW);
ISceneNode::OnPreRender();
}
//! renders the node.
void VxHealthSceneNode::render()
{
if( !Coll )
return;
if(!isVisible)
{
return;
}
/////////////////////////////////////////////////////////////////////
video::IVideoDriver* driver = SceneManager->getVideoDriver();
ICameraSceneNode* camera = SceneManager->getActiveCamera();
if (!camera || !driver)
return;
if (DebugDataVisible)
{
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
video::SMaterial m;
m.Lighting = false;
driver->setMaterial(m);
driver->draw3DBox(Box, video::SColor(0,208,195,152));
}
//////////////////////////////////////////////////////////////////////
core::position2d<s32> pos = Coll->getScreenCoordinatesFrom3DPosition(getAbsolutePosition(),
SceneManager->getActiveCamera());
// calculate health bar rectangle
f32 halfWidth = (f32)m_gDim.Width/2;
core::rect<s32> AbsoluteRect( pos, m_gDim );
// center the bar
AbsoluteRect.UpperLeftCorner.X -= halfWidth;
AbsoluteRect.LowerRightCorner.X -= halfWidth;
core::rect<s32> BarRect = AbsoluteRect;
// draw boarder if needed
if( m_bBorder )
{
driver->draw2DRectangle( BorderColor, AbsoluteRect, &AbsoluteRect);
// shrink by one for bar
BarRect.UpperLeftCorner.X += 1;
BarRect.UpperLeftCorner.Y += 1;
BarRect.LowerRightCorner.X -= 1;
BarRect.LowerRightCorner.Y -= 1;
}
// calculate progress bar
MaxNum = (BarRect.LowerRightCorner.X - BarRect.UpperLeftCorner.X) - 1;
s32 PercentNum = (s32)((m_s32Percent * MaxNum) / 100);
// draw progress part
core::rect<s32> LoadRect = BarRect;
LoadRect.LowerRightCorner.X = BarRect.UpperLeftCorner.X + PercentNum;
driver->draw2DRectangle( BarColor, LoadRect, &LoadRect );
// draw empty part
LoadRect.UpperLeftCorner.X = BarRect.UpperLeftCorner.X + PercentNum;
LoadRect.LowerRightCorner.X = BarRect.LowerRightCorner.X;
driver->draw2DRectangle( BkgColor, LoadRect, &LoadRect );
}
//! returns the axis aligned bounding box of this node
const core::aabbox3d<f32>& VxHealthSceneNode::getBoundingBox() const
{
return Box;
}
//! returns amount of materials used by this scene node.
s32 VxHealthSceneNode::getMaterialCount()
{
return 0;
}
//! sets the progress percentage ( or health )
void VxHealthSceneNode::setProgress( s32 s32Percent )
{
m_s32Percent = s32Percent;
if( m_s32Percent < 0 )
{
m_s32Percent = 0;
}
if( m_s32Percent > 100 )
{
m_s32Percent = 100;
}
}
//! sets the color of the progress
void VxHealthSceneNode::setProgressColor(video::SColor color)
{
BarColor = color;
}
//! sets the color of the progress bar background
void VxHealthSceneNode::setBackgroundColor(video::SColor color)
{
BkgColor = color;
}
//! sets the color of the progress bar border
void VxHealthSceneNode::setBorderColor(video::SColor color)
{
BorderColor = color;
}
} // end namespace scene
} // end namespace irr
//------------------------------------------------------------------------
/// use somthing like this
pgMgr->m_pgAlphaPlayer->m_pgHealthBar = new scene::VxHealthSceneNode(
pgMgr->m_pgAlphaPlayer->m_pgNode, // parent node
pgMgr->m_pgSceneMgr, // scene manager
-1, // id
pgMgr->m_pgSceneMgr->getSceneCollisionManager(), // collision manager
50, // width
6, // height
core::vector3df(0,40,0), // position
video::SColor(150,0,200,0), // bar color
video::SColor(150,220,0,0), // background color
video::SColor(255,255,255,255) ); // boarder color
//set percent of health
pgMgr->m_pgAlphaPlayer->m_pgHealthBar->setProgress( 60 );
* Copyright (C) 2006 Brett R. Jones issued to public domain
*********************************************************************/
#ifndef VX_HEALTH_SCENE_NODE_H
#define VX_HEALTH_SCENE_NODE_H
#include "ISceneNode.h"
#include "ISceneCollisionManager.h"
namespace irr
{
namespace scene
{
class VxHealthSceneNode : public ISceneNode
{
public:
//! constructor
VxHealthSceneNode( ISceneNode* parent,
ISceneManager* mgr,
s32 id,
scene::ISceneCollisionManager* coll,
s32 width = 100,
s32 height = 10,
const core::vector3df& position = core::vector3df(0,0,0),
video::SColor BarColor=video::SColor(150,0,200,0),
video::SColor BkgColor=video::SColor(150,200,0,0),
video::SColor BoarderColor=video::SColor(200,220,220,220) );
//! destructor
virtual ~VxHealthSceneNode();
virtual void OnPreRender();
//! renders the node.
virtual void render();
//! returns the axis aligned bounding box of this node
virtual const core::aabbox3d<f32>& getBoundingBox() const;
//! returns amount of materials used by this scene node.
virtual s32 getMaterialCount();
//! sets progress percentage ( or health )
virtual void setProgress( s32 s32Percent );
//! sets the color of the progress bar
virtual void setProgressColor(video::SColor color);
//! sets the color of the progress bar background
virtual void setBackgroundColor(video::SColor color);
//! sets the color of the progress bar border
virtual void setBorderColor(video::SColor color);
private:
core::aabbox3d< f32 > Box;
video::SColor BarColor;
video::SColor BorderColor;
video::SColor BkgColor;
scene::ISceneCollisionManager* Coll;
core::dimension2d<s32> m_gDim; //dimension width, height
s32 m_bBorder;
s32 MaxNum;
s32 isVisible;
s32 m_s32Percent;
};
} // end namespace scene
} // end namespace irr
#endif // VX_HEALTH_SCENE_NODE_H
/*******************************************************************
* Copyright (C) 2006 Brett R. Jones issued to public domain
*********************************************************************/
#include "irrlicht.h"
#include "VxHealthSceneNode.h"
#include "ISceneManager.h"
#include "IVideoDriver.h"
namespace irr
{
namespace scene
{
//! constructor
VxHealthSceneNode::VxHealthSceneNode( ISceneNode* parent,
ISceneManager* mgr,
s32 id,
scene::ISceneCollisionManager* coll,
s32 width,
s32 height,
const core::vector3df& position,
video::SColor BarColorIn,
video::SColor BkgColorIn,
video::SColor BorderColorIn )
: ISceneNode(parent, mgr, id, position),
Coll(coll),
BarColor(BarColorIn),
BkgColor(BkgColorIn),
BorderColor(BorderColorIn),
m_gDim( width, height ),
m_bBorder(1),
isVisible(1),
m_s32Percent(100)
{
#ifdef _DEBUG
setDebugName("VxHealthSceneNode");
#endif
setAutomaticCulling(false);
//////////////////////////////////////////////////////////
//Set Bounding box
f32 halfWidth = (f32)m_gDim.Width/2;
f32 halfHeight = (f32)m_gDim.Height/2;
Box.MinEdge.set(-halfWidth,-halfHeight,-1.0);
Box.MaxEdge.set(halfWidth,halfHeight,1.0);
}
//! destructor
VxHealthSceneNode::~VxHealthSceneNode()
{
}
void VxHealthSceneNode::OnPreRender()
{
if (IsVisible)
SceneManager->registerNodeForRendering(this, ESNRP_SHADOW);
ISceneNode::OnPreRender();
}
//! renders the node.
void VxHealthSceneNode::render()
{
if( !Coll )
return;
if(!isVisible)
{
return;
}
/////////////////////////////////////////////////////////////////////
video::IVideoDriver* driver = SceneManager->getVideoDriver();
ICameraSceneNode* camera = SceneManager->getActiveCamera();
if (!camera || !driver)
return;
if (DebugDataVisible)
{
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
video::SMaterial m;
m.Lighting = false;
driver->setMaterial(m);
driver->draw3DBox(Box, video::SColor(0,208,195,152));
}
//////////////////////////////////////////////////////////////////////
core::position2d<s32> pos = Coll->getScreenCoordinatesFrom3DPosition(getAbsolutePosition(),
SceneManager->getActiveCamera());
// calculate health bar rectangle
f32 halfWidth = (f32)m_gDim.Width/2;
core::rect<s32> AbsoluteRect( pos, m_gDim );
// center the bar
AbsoluteRect.UpperLeftCorner.X -= halfWidth;
AbsoluteRect.LowerRightCorner.X -= halfWidth;
core::rect<s32> BarRect = AbsoluteRect;
// draw boarder if needed
if( m_bBorder )
{
driver->draw2DRectangle( BorderColor, AbsoluteRect, &AbsoluteRect);
// shrink by one for bar
BarRect.UpperLeftCorner.X += 1;
BarRect.UpperLeftCorner.Y += 1;
BarRect.LowerRightCorner.X -= 1;
BarRect.LowerRightCorner.Y -= 1;
}
// calculate progress bar
MaxNum = (BarRect.LowerRightCorner.X - BarRect.UpperLeftCorner.X) - 1;
s32 PercentNum = (s32)((m_s32Percent * MaxNum) / 100);
// draw progress part
core::rect<s32> LoadRect = BarRect;
LoadRect.LowerRightCorner.X = BarRect.UpperLeftCorner.X + PercentNum;
driver->draw2DRectangle( BarColor, LoadRect, &LoadRect );
// draw empty part
LoadRect.UpperLeftCorner.X = BarRect.UpperLeftCorner.X + PercentNum;
LoadRect.LowerRightCorner.X = BarRect.LowerRightCorner.X;
driver->draw2DRectangle( BkgColor, LoadRect, &LoadRect );
}
//! returns the axis aligned bounding box of this node
const core::aabbox3d<f32>& VxHealthSceneNode::getBoundingBox() const
{
return Box;
}
//! returns amount of materials used by this scene node.
s32 VxHealthSceneNode::getMaterialCount()
{
return 0;
}
//! sets the progress percentage ( or health )
void VxHealthSceneNode::setProgress( s32 s32Percent )
{
m_s32Percent = s32Percent;
if( m_s32Percent < 0 )
{
m_s32Percent = 0;
}
if( m_s32Percent > 100 )
{
m_s32Percent = 100;
}
}
//! sets the color of the progress
void VxHealthSceneNode::setProgressColor(video::SColor color)
{
BarColor = color;
}
//! sets the color of the progress bar background
void VxHealthSceneNode::setBackgroundColor(video::SColor color)
{
BkgColor = color;
}
//! sets the color of the progress bar border
void VxHealthSceneNode::setBorderColor(video::SColor color)
{
BorderColor = color;
}
} // end namespace scene
} // end namespace irr
//------------------------------------------------------------------------
/// use somthing like this
pgMgr->m_pgAlphaPlayer->m_pgHealthBar = new scene::VxHealthSceneNode(
pgMgr->m_pgAlphaPlayer->m_pgNode, // parent node
pgMgr->m_pgSceneMgr, // scene manager
-1, // id
pgMgr->m_pgSceneMgr->getSceneCollisionManager(), // collision manager
50, // width
6, // height
core::vector3df(0,40,0), // position
video::SColor(150,0,200,0), // bar color
video::SColor(150,220,0,0), // background color
video::SColor(255,255,255,255) ); // boarder color
//set percent of health
pgMgr->m_pgAlphaPlayer->m_pgHealthBar->setProgress( 60 );
Last edited by drac_gd on Fri Jun 30, 2006 2:18 am, edited 1 time in total.
Code: Select all
#include "appall.h"
Otherwise a neat code snippet
system-independent, adj.:
Works equally poorly on all systems.
-- unknown
Works equally poorly on all systems.
-- unknown
-
- Posts: 1029
- Joined: Thu Apr 06, 2006 12:45 am
- Location: Tennesee, USA
- Contact:
-
- Posts: 78
- Joined: Sat May 27, 2006 9:24 pm
- Location: Logan, UT
Code: Select all
AbsoluteRect.UpperLeftCorner.X -= (s32) halfWidth;
AbsoluteRect.LowerRightCorner.X -= (s32) halfWidth;
Stout Beer
-
- Posts: 1029
- Joined: Thu Apr 06, 2006 12:45 am
- Location: Tennesee, USA
- Contact:
Yet another problem for me,
pgMgr undefined and I've got no clue where to find it.
Code: Select all
pgMgr->m_pgAlphaPlayer->m_pgHealthBar = new scene::VxHealthSceneNode(
pgMgr->m_pgAlphaPlayer->m_pgNode, // parent node
pgMgr->m_pgSceneMgr, // scene manager
-1, // id
pgMgr->m_pgSceneMgr->getSceneCollisionManager(), // collision manager
50, // width
6, // height
core::vector3df(0,40,0), // position
video::SColor(150,0,200,0), // bar color
video::SColor(150,220,0,0), // background color
video::SColor(255,255,255,255) ); // boarder color
//set percent of health
pgMgr->m_pgAlphaPlayer->m_pgHealthBar->setProgress( 60 );
-
- Admin
- Posts: 14143
- Joined: Wed Apr 19, 2006 9:20 pm
- Location: Oldenburg(Oldb), Germany
- Contact:
Do you know what alphaplayer and sceneMgr are? Where could those be located? Maybe in a game. so we probably have a game manager here.
Try to understand the code instead of just copying. You should also avoid to copy the code fragment somewhere into our app as the necessary objects have to exist.
Oh, and remove your crosspost before someone posts and you cannot remove it anymore.
Try to understand the code instead of just copying. You should also avoid to copy the code fragment somewhere into our app as the necessary objects have to exist.
Oh, and remove your crosspost before someone posts and you cannot remove it anymore.
-
- Posts: 1029
- Joined: Thu Apr 06, 2006 12:45 am
- Location: Tennesee, USA
- Contact:
Post removedhybrid wrote:Do you know what alphaplayer and sceneMgr are? Where could those be located? Maybe in a game. so we probably have a game manager here.
Try to understand the code instead of just copying. You should also avoid to copy the code fragment somewhere into our app as the necessary objects have to exist.
Oh, and remove your crosspost before someone posts and you cannot remove it anymore.
I tried looking over it to understand what pgMgr could be but I'm not grasping anything, could be the tiredness but if you could give me some more help that'd be great.
-
- Posts: 70
- Joined: Sat Dec 17, 2005 4:43 pm
- Location: licata (AG) italy
- Contact:
i have a prob with this code. if the bar is set to 100%, there is a small red rectangle, the bar is not all green (I use default colours)
Bye all,
Mancuso Raffaele (Ares FPS game)
Mancuso Raffaele (Ares FPS game)
I'm not a lawyer but I know you cannot release something into the public domain and retain copyright. They are contradictory terms. For something to be in the public domain means it has no copyrights. Do you mean it was copyright 2006, now it's public domain? It's hard to tell.Copyright (C) 2006 Brett R. Jones issued to public domain
-------------------------------------
IrrLua - a Lua binding for Irrlicht
http://irrlua.sourceforge.net/
IrrLua - a Lua binding for Irrlicht
http://irrlua.sourceforge.net/
-
- Posts: 78
- Joined: Sat May 27, 2006 9:24 pm
- Location: Logan, UT
Your right.. basically the copywrite should be removed because public domain means you can do whatever you want with it. I am no lawyer I just wanted to make sure that everone knows it is public domain. having the copywrite notice on the code does however document when it was issued in case someone tries to do a patent later then the code can be shown as prior works and the patent is invalid. I issue to public domain because I am not interested in recognition.. just helping to advance the project and if I did come up with something good then there would be no question about whether it could be modified and added to Irrlicht.