Четверг, 21.09.2017, 10:00
Приветствую Вас Guest | RSS
Главная страница | Статьи | Регистрация | Вход
Меню сайта

Случайный рисунок

Категории каталога
Туториалы по маппингу (HL2) [68]
Туториалы по маппингу для Half-Life
Туториалы по текстурированию (HL2) [10]
Туторы по текстурированию для Half-Life
Туториалы по моделированию (HL2) [9]
Туторы по моделированию для Half-Life
Туториалы по программированию (HL2) [53]
Туторы по прагроммированию для Half-life
Другие туториалы (HL1 и HL2) [4]
Туторы которые не вошли в другие категории
Half-Life 2 Beta [1]
Статьи о npc и weapon в бете Half-Life 2, а так же мануалы и FAQ.
Туториалы по маппингу (HL1) [14]
Туторы по маппингу для Half-Life 1
Туториалы по текстурированию (HL1) [1]
Туторы по текстурированию для Half-Life 1
Туториалы по моделированию (HL1) [1]
Туторы по моделированию для Half-Life 1
Туториалы по программированию (HL1) [30]
Туторы по программированию для Half-Life 1

Наш опрос
Приводить ли сайт в чувство?
Всего ответов: 700

Начало » Статьи » Туториалы по программированию (HL2)

Кровь на экране аля 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) | Автор: Рымкевич Владимир Сергеевич
Просмотров: 1932 | Комментарии: 17 | Рейтинг: 5.0 |

Всего комментариев: 17
17  
Мда, код ужасен) Ни case, ни массивов. Он мог бы занимат раза в 3 меньше места

16  
...

15  
PekpyT, сделай ребилд

14  
Еще и до того дохрена ошибок показало с LIBCMT но я основное показал

13  
А у меня какая-то ошибка выскакивает при компиляции (главный прикол в том, что 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 ==========

Как это исправить?


6  
Да глюки есть к примеру когда здоровья 1-9 - Opacity оверлэя 80% а не 100%

9  
Сейчас скину код исправленный. У тебя жёсткая ошибка в плане логики проверки.

4  
С elsom(хотел сначало написать "В"еслом) я писал оно глючило. При 30 выдавало или оверлай<30 или больше>50 как-то так это было

5  
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 можно было тупо прокрутить. Т.к. значения которые мы будем ловить будут интересны. Кста, если подумать. То интервалами можно было брать, а не так как ты. wink Просто судя по коду, возможны нлюки небольшие. smile


7  
А if (newHull => *) использовать нельзя (чёто на php тянет...)

10  
С ошибкой пишешь братец. Больше или ровно - >= и Меньше или равно - <= (во всех языках программирования поддерживается)

11  
балин, забыл основы...

12  
Так же тут надо было использовать:
1) || - или;
2) && - и;
3) != - не равно.

3  
Прикольно, попробуем. За туториал +1 с меня. smile

P.S. Кстати, if'ы можно было вложенные сделать или хотя бы 1 else для стёба. smile


2  
скринь материалы плииз!

1  
Еще могу скинуть материалы к нему

8  
Давай!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Кто в Онлайн

Друзья сайта

Баннеры

  Сайт CrazyArts   Black   Сообщество сайтов о Half-Life   Самый   Только   Все   hl2 top 100     Rambler's Top100  

игры
игры

  Каталог сайтов Планета Топ 100 - Planet Top 100       ТОП ЛУЧШИХ ИГРОВЫХ САЙТОВ           Detroit Team Site :: Моды от Detroit Team, видео, новости.   Naruto-kun[Звезда Наруто]  


The idea of dising: Homie7