Меню сайта
Случайный рисунок
Категории каталога
Наш опрос
Кровь на экране аля 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
Ну вот и все. Компилим и наслаждаемся. Код на сайте был подчищен от ненужных функций. Ссыль на материалы.
Категория: Туториалы по программированию (HL2) | Добавил: HellMapper (21.06.2010)
| Автор: Рымкевич Владимир Сергеевич
Просмотров: 2721 | Комментарии: 17
| Рейтинг: 5.0 |
- Оценить -
Отлично
Хорошо
Неплохо
Плохо
Ужасно
Всего комментариев: 17
Порядок вывода комментариев:
По умолчанию
Сначала новые
Сначала старые
0
Мда, код ужасен) Ни case, ни массивов. Он мог бы занимат раза в 3 меньше места
15
Zim
(09.02.2011 23:16)
0
PekpyT, сделай ребилд
14
PekpyT
(05.12.2010 09:49)
0
Еще и до того дохрена ошибок показало с LIBCMT но я основное показал
13
PekpyT
(05.12.2010 09:48)
0
А у меня какая-то ошибка выскакивает при компиляции (главный прикол в том, что Hud_hull скомпилился нормально):
2> Создается библиотека Debug HL2\server.lib и объект Debug HL2\server.exp 2>LINK : warning LNK4098: библиотека по умолчанию "LIBCMT" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library 2>choreoobjects.lib(choreoevent.obj) : error LNK2019: ссылка на неразрешенный внешний символ "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) в функции "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@ Z) 2>choreoobjects.lib(choreoevent.obj) : error LNK2019: ссылка на неразрешенный внешний символ "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) в функции "protected: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" (?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NI_N@Z) 2>Debug HL2\server.dll : fatal error LNK1120: 2 неразрешенных внешних элементов 2> 2>СБОЙ построения. 2> 2>Затраченное время: 00:02:57.52 ========== Построение: успешно: 0, с ошибками: 2, без изменений: 0, пропущено: 0 ==========
Как это исправить?
1
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 );
}
Это у тебя своеобразная "выборка". Такую и через case можно было тупо прокрутить. Т.к. значения которые мы будем ловить будут интересны. Кста, если подумать. То интервалами можно было брать, а не так как ты. Просто судя по коду, возможны нлюки небольшие.
0
Так же тут надо было использовать:
1) || - или;
2) && - и;
3) != - не равно.
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация |
Вход ]
Форма входа
Кто в Онлайн
Друзья сайта