Team Icons

From Valve Developer Community
< De
Jump to navigation Jump to search
English (en)Deutsch (de)Polski (pl)Português do Brasil (pt-br)Русский (ru)Translate (Translate)

Dieses Tutorial beschreibt, wie man HUD-Elemente dazu bekommt, ein Bild abhängig von der Teamzugehörigkeit anzuzeigen. Wenn der spieler zum Beispiel in dem einen Team ist, wird 'dieses Bild' angezeigt, wenn der spieler aber im anderen Team ist, wird 'jenes Bild' angezeigt. Hier ist, was man damit erreicht: Hud icon example.png

Voraussetzungen

Damit dieses Tutorial funktioniert, benötigst du 2 VTF-Bilder mit eingestellten VMT-Einstellungen. Sofern benötigt ist unten ein Beispiel für VMT:

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

Das HUD-Element

Erstelle 2 Dateien im clientseitigen Projekt mit beliebigem Namen. In diesem Tutorial wird Rteamicon.cpp und Rteamicon.h verwendet.

Öffne nun Rteamicon.cpp und beginne mit dem einfügen des folgenden Kopfes:

// ======= *********-|RECOIL|-********* =======//
// Programmer: 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 );

Nun, wo der Kopf der Datei vorhanden ist, wird der Konstruktor benötigt. Füge unter dem using namespace vgui; folgendes ein:

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

   // Dies definiert m_nIraqIcon als "vgui/hud/teamicons/iraqiran" welches die vtf aufruft.
   m_nIraqIcon = vgui::surface()->CreateNewTextureID();
   vgui::surface()->DrawSetTextureFile( m_nIraqIcon, "vgui/hud/teamicons/iraqiran" , true, false);

   // Du verstehst nun...
   m_nBritishIcon = vgui::surface()->CreateNewTextureID();
   vgui::surface()->DrawSetTextureFile( m_nBritishIcon, "vgui/hud/teamicons/ukusa" , true, false);

   SetHiddenBits( HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT );
}

Nun, da der Konstruktor erstellt wurde, kann die main-Funktion erstellt werden, um dies zu starten. Für dieses Beispiel wird "Paint Background" verwendet, da bei Verwendung des normalen "Paint" man einen schwarzen, transparenten Hintergrund erhalten würde.

//-----------------------------------------------------------
// Zweck: Wenn der Spieler (ich) im Team "Combine" ist, zeige das Irak-Symbol
// Zweck+: sonst, wenn ich im Team "Rebels" bin, zeige das britische Symbol.
//-----------------------------------------------------------
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"); // Spamt die Konsole 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();
}

Das eigentliche HUD-Element ist fast fertig. Um es fertig zu stellen, muss die Header-Datei fertiggestellt werden. Öffne Rteamicon.h und füge folgendes ein:

// ======= *********-|RECOIL|-********* =======//
// Programmer: John Stuart                                          
// ============================================//

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

using namespace vgui;

//-----------------------------------------------------------
// Zweck: 
//-----------------------------------------------------------
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;

};

Die Materialien

Nachdem das HUD funktioniert, kann damit weiter gemacht werden, die tatsächlichen Bilder auf das HUD zu bekommen. Sie sind bereits vorhanden, nur sind si noch nicht defineirt. Öffne die Datei "scripts/HudLayout.res" und füge folgendes ein:

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

Selbstverständlich können die eigenen Bilder an beliebiger Stelle und mit beliebiger Größe platziert werden, indem xpos,ypos,wide,tall an die eigenen Vorstellungen angepasst werden.

Das Ergebnis

Es sollte jetzt ein gutes HUD-Element vorhanden sein, welches ein Symbol auf dem HUD entsprechend des Teams anzeigt.