Кровь на экране аля Wolfenstein.
Сегодня я научу вас делать кровавый экран, когда у вас становиться мало жизни при том кровь становиться более четкой с каждым уменьшением на 10HP здоровья . Но этот код требует доработки т.к если перекрывать дисплей другим оверлаем то кровь исчезает. Ладно меньше слов, больше дела. Создаем файл hud_hull.cpp в Client->Source Files->HL2 DLL. В нем пишем следующее: Code
#include "cbase.h"
#include "hud.h"
#include "hud_hull.h"
#include "hud_macros.h"
#include "iclientmode.h"
#include <vgui_controls/AnimationController.h>
#include <vgui/ISurface.h>
#include <vgui/ILocalize.h> #include "materialsystem/IMaterialSystem.h" #include "materialsystem/IMaterialVar.h" #include "materialsystem/imaterialsystemhardwareconfig.h" #include "rendertexture.h" #include "view_scene.h" #include "viewrender.h"
using namespace vgui;
#include "tier0/memdbgon.h"
DECLARE_HUDELEMENT( CHudHull );
#define HULL_INIT 80
//------------------------------------------------------------------------
// Purpose: Constructor
//------------------------------------------------------------------------
CHudHull::CHudHull( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudHull" )
{
vgui::Panel *pParent = g_pClientMode->GetViewport();
SetParent( pParent );
SetHiddenBits( HIDEHUD_HEALTH );
}
//------------------------------------------------------------------------
// Purpose:
//------------------------------------------------------------------------
void CHudHull::Init( void )
{
m_flHull = HULL_INIT;
m_nHullLow = -1;
SetBgColor(Color(0,0,0,128));
}
//------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------
void CHudHull::Reset( void )
{
Init();
}
//------------------------------------------------------------------------
// Purpose:
//------------------------------------------------------------------------
void CHudHull::OnThink( void )
{
float newHull = 0;
C_BasePlayer *local = C_BasePlayer::GetLocalPlayer();
if ( !local)
return;
newHull = local->GetHealth();
if ( newHull == m_flHull )
{
return;
} //Присваиваем pMaterial* свои текстурки
{
IMaterial *pMaterial = materials->FindMaterial( "HUDoverlays/blood_display", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial1 = materials->FindMaterial( "HUDoverlays/blood_display_20", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial2 = materials->FindMaterial( "HUDoverlays/blood_display_30", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial3 = materials->FindMaterial( "HUDoverlays/blood_display_40", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial4 = materials->FindMaterial( "HUDoverlays/blood_display_50", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial5 = materials->FindMaterial( "HUDoverlays/blood_display_60", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial6 = materials->FindMaterial( "HUDoverlays/blood_display_70", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial7 = materials->FindMaterial( "HUDoverlays/blood_display_80", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial8 = materials->FindMaterial( "HUDoverlays/blood_display_90", TEXTURE_GROUP_OTHER, true ); IMaterial *pMaterial9 = materials->FindMaterial( "HUDoverlays/blood_display_95", TEXTURE_GROUP_OTHER, true ); //////////////////Присваиваем к каждым значениям свои материи/////////////////////////////// /////////////////IF 10 HP////////////// if (newHull == 10) { view->SetScreenOverlayMaterial( pMaterial ); } if (newHull > 10) { view->SetScreenOverlayMaterial( pMaterial1 ); } ///////////////////////////////////// if (newHull == 20) { view->SetScreenOverlayMaterial( pMaterial1 ); } if (newHull > 20) { view->SetScreenOverlayMaterial( pMaterial2 ); } ///////////////////////////////////// if (newHull == 30) { view->SetScreenOverlayMaterial( pMaterial2 ); } if (newHull > 30) { view->SetScreenOverlayMaterial( pMaterial3 ); } ///////////////////////////////////////////// if (newHull == 40) { view->SetScreenOverlayMaterial( pMaterial3 ); } if (newHull > 40) { view->SetScreenOverlayMaterial( pMaterial4 ); } ///////////////////////////////////////////// if (newHull == 50) { view->SetScreenOverlayMaterial( pMaterial4 ); } if (newHull > 50) { view->SetScreenOverlayMaterial( pMaterial5 ); } ///////////////////////////////////////////// if (newHull == 60) { view->SetScreenOverlayMaterial( pMaterial5 ); } if (newHull > 60) { view->SetScreenOverlayMaterial( pMaterial6 ); } ///////////////////////////////////////////// if (newHull == 70) { view->SetScreenOverlayMaterial( pMaterial6 ); } if (newHull > 70) { view->SetScreenOverlayMaterial( pMaterial7 ); } ///////////////////////////////////////////// if (newHull == 80) { view->SetScreenOverlayMaterial( pMaterial7 ); } if (newHull > 80) { view->SetScreenOverlayMaterial( pMaterial8 ); } ///////////////////////////////////////////// if (newHull == 90) { view->SetScreenOverlayMaterial( pMaterial8 ); } if (newHull > 90) { view->SetScreenOverlayMaterial( pMaterial9 ); } ///////////////////////////////////////////// if (newHull == 95) { view->SetScreenOverlayMaterial( pMaterial9 ); } if (newHull > 95) { view->SetScreenOverlayMaterial( NULL ); } ///////////////////////////////////////////// if (newHull == 100) { view->SetScreenOverlayMaterial( NULL ); } m_flHull = newHull;
} } //------------------------------------------------------------------------
// Purpose: draws the power bar
//------------------------------------------------------------------------
void CHudHull::Paint()
{ ///Нужно чтоб все рисовалось } Теперь там же создаем h файл. В нем пишем: Code
#if !defined( HUD_HULL_H )
#define HUD_HULL_H
#ifdef _WIN32
#pragma once
#endif
#include "hudelement.h"
#include "hud_numericdisplay.h"
//#include
//-----------------------------------------------------------------------------
// Purpose: Shows the hull bar
//-----------------------------------------------------------------------------
class CHudHull : public CHudElement, public vgui::Panel
{
DECLARE_CLASS_SIMPLE( CHudHull, vgui::Panel );
public:
CHudHull( const char *pElementName );
virtual void Init( void );
virtual void Reset( void );
virtual void OnThink( void );
protected:
virtual void Paint();
private:
float m_flHull;
int m_nHullLow;
};
#endif // HUD_SUITPOWER_H Ну вот и все. Компилим и наслаждаемся. Код на сайте был подчищен от ненужных функций. Ссыль на материалы.
Источник: http://hell494.ucoz.ru |