Командные Иконки

From Valve Developer Community
Jump to: navigation, search
English Deutsch

Этот урок расскажет о том, как выводить Изображение как HUD элемент в зависимости от вашей игровой команды. К примеру, если игрок играет за первую команду выводиться одно изображение, но если из другой команды, выводиться второе изображение. Вот что получиться в итоге:Hud icon example.png

Требования

Чтобы этот урок работал, у вас должны быть 2 vtf изображения с файлом - настройками vmt. Если вам нужно, то пример VMT ниже:

"UnlitGeneric"
{
	"$basetexture" "vgui/hud/teamicons/iraqiran"
        "$translucent" "1"
        "$ignorez" "1" 
}

HUD Элемент

Создайте два файла в client-части вашего проекта, назвать можете как хотите, но мы будем использовать Rteamicon.cpp и Rteamicon.h.

Теперь откройте Rteamicon.cpp и начнём с объявления заголовков

// ======= *********-|RECOIL|-********* =======//
// Программист: John Stuart                                                    
// ============================================//

#include "hud.h"
#include "cbase.h"
#include "Rteamicon.h"
#include "iclientmode.h"
#include "hud_macros.h"
#include "c_team.h"
#include "vgui_controls/controls.h"
#include "vgui/ISurface.h"
#include "hl2mp_gamerules.h"
#include "tier0/memdbgon.h"

using namespace vgui;

DECLARE_HUDELEMENT( CRTeamIcon );

Сейчас у нас есть заголовок файла, нам нужно написать конструктор. Прям под строчкой using namespace vgui; вставьте это:

//-----------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------
CRTeamIcon::CRTeamIcon( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "CRTeamIcon" )
{
   Panel *pParent = g_pClientMode->GetViewport();
   SetParent( pParent );   
   
   SetVisible( true );
   SetEnabled( true );

   // Эти дефайны m_nIraqIcon в "vgui/hud/teamicons/iraqiran" вызывают изображение vtf.
   m_nIraqIcon = vgui::surface()->CreateNewTextureID();
   vgui::surface()->DrawSetTextureFile( m_nIraqIcon, "vgui/hud/teamicons/iraqiran" , true, false);

   // Получаем соглашение
   m_nBritishIcon = vgui::surface()->CreateNewTextureID();
   vgui::surface()->DrawSetTextureFile( m_nBritishIcon, "vgui/hud/teamicons/ukusa" , true, false);

   SetHiddenBits( HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT );
}

Теперь у нас есть конструктор, мы можем пойти дальше и создать основную функцию для работы, для этого примера мы будем использовать "Paint Background" потому-что если вы будите использовать нормальный "Paint" вы будете иметь черный прозрачный фон.

//--------------------------------------------------------------
// Purpose: Если игрок за комбайнов, показываем Иракскую иконку
// Purpose+: но если я за Повстанцы показываем Британскую иконку
//--------------------------------------------------------------
void CRTeamIcon::PaintBackground()
{  
   SetBgColor(Color(0,0,0,0));
   
   CBasePlayer *pPlayer = UTIL_PlayerByIndex(engine->GetLocalPlayer());

      if(pPlayer->GetTeamNumber() == TEAM_COMBINE) // Если команда Комбайны
	  {
           vgui::surface()->DrawSetColor(GetFgColor());
	   vgui::surface()->DrawSetTexture( m_nIraqIcon );
	   vgui::surface()->DrawTexturedRect(0, 0, GetWide(), GetTall());
	   //DevMsg("Team Combine Icon Displayed\n"); // Spams console hehe :D
	  }
	  else if(pPlayer->GetTeamNumber() == TEAM_REBELS)// Если команда Повстанцы
	  {
           vgui::surface()->DrawSetColor(GetFgColor());
	   vgui::surface()->DrawSetTexture( m_nBritishIcon );
	   vgui::surface()->DrawTexturedRect(0, 0, GetWide(), GetTall());
	   //DevMsg("Team Rebels Icon Displayed\n"); 
	  }

      SetPaintBorderEnabled(false);

	  BaseClass::PaintBackground();
}

Теперь мы почти закончили фактический элемент HUD, чтобы всё заработало, нужно закончить файл заголовка. ОткройтеRteamicon.h и поместите туда это:

// ======= *********-|RECOIL|-********* =======//
// Программист: John Stuart                                    
// ============================================//

#include "hudelement.h"
#include <vgui_controls/Panel.h>

using namespace vgui;

//-----------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------
class CRTeamIcon : public CHudElement, public Panel
{
   DECLARE_CLASS_SIMPLE( CRTeamIcon, Panel );

   public:

       CRTeamIcon( const char *pElementName );

   protected:

       virtual void PaintBackground();

       int m_nIraqIcon;
       int m_nBritishIcon;

};

Материалы

Сейчас HUD работает, мы можем перейти к получению актуального изображения. оно уже есть, но его координаты не определены. И так, заходим в папку с модом и открываем файл "scripts/HudLayout.res" и помещаем это внутрь.

	CRTeamIcon
	{
		"fieldName" "CRTeamIcon"
	        "xpos" "r62"
		"ypos" "0"
		"wide" "64"
		"tall" "32"
		"visible" "1"
		"enabled" "1"
      
		"PaintBackgroundType"   "2"
	}

Конечно, вы можете разместить свое изображение в любом месте как вам нравится, и задать размер как вам нужно, отредактировав 'xpos,ypos,wide,tall в settings/needs.

Результат

Теперь вы должны получить элемент HUD, который отображает иконку на вашем экране, в зависимости от команды в которой вы находитесь.

Перевод: --Slam12f 00:25, 18 July 2013 (PDT)