Source SDK

Source SDK

Not enough ratings
Modificación básica de Hud (Motor Source 2013)
By Oitnemood
tutorial original del foro de valve
https://developer.valvesoftware.com/wiki/Basic_Hud_Modification
Este tutorial muestra cómo cambiar el HUD añadiendo un gráfico. Añadir un gráfico al HUD no es tan difícil. Sin embargo, es recomendable que conozcas el proceso de creación de materiales.
   
Award
Favorite
Favorited
Unfavorite
Importar el material del HUD
En general, la adición de gráficos al HUD sigue el mismo procedimiento que la adición de cualquier material a los juegos basados en Source, así que crea tu gráfico a tu propia discreción. La diferencia es que vamos a dar a vtex algunos parámetros extra en el archivo .txt que acompaña al .tga.

Usaremos la siguiente configuración como ejemplo.
"UnlitGeneric" { "nomip" "1" "nocompress" "1" "nolod" "1" }

En este caso, le estamos diciendo a vtex...

$nomip
No haga mip-niveles para esta textura. Simplemente porque no vas a ver el HUD desde diferentes distancias.
$nocompress
No usar compresión en esta textura. Esto previene la aparición de artefactos en nuestro gráfico.
$nolod
No utilizar versiones de menor calidad de esta textura en versiones inferiores de DirectX. Esto es obvio ya que la diferencia de rendimiento es marginal.
Una vez que tengas las variables apropiadas configuradas, ahora vamos a ejecutar vtex. Se recomienda para mayor claridad que generes tus gráficos en el directorio /materiales/HUD/ (si no existe, créalo).

Para el .VMT, vamos a utilizar la siguiente configuración.
"UnlitGeneric" { "$basetexture" "HUD/nameofyourgraphic" "$translucent" "1" "$translucency" "1" "$ignorez" "1" }

Con el .vmt y por lo tanto el material completado, todo lo que queda es cambiar el HUD y añadir una clase. Empecemos con la clase.
Añadir una clase de elemento HUD
Abra su copia de MSVS. Busque la clase CHud. Usted debe ser capaz de recorrer una serie de archivos. Le recomiendo que guarde todos estos archivos y, si los edita, haga una copia de seguridad para poder conservarlos como referencia.

Todo lo que estamos tratando de hacer es poner un gráfico en la pantalla. En Half-Life 2 hay una función que tenemos que llamar para que esto ocurra, llamada paint. Vamos a necesitar una variable que actúe como soporte de nuestro sprite para poder llamarlo en el juego a través de la función paint. También sería bueno poder activar y desactivar esto, así que vamos a aprender a usar cvars para controlar los elementos del HUD de esta manera.

Aquí está la definición de nuestra clase de ejemplo.
#include "hudelement.h" #include <vgui_controls/Panel.h> using namespace vgui; class CHudImport : public CHudElement, public Panel { DECLARE_CLASS_SIMPLE( CHudImport, Panel ); public: CHudImport( const char *pElementName ); void togglePrint(); virtual void OnThink(); protected: virtual void Paint(); int m_nImport; };

Coloque el código anterior en hud_import.h. Recuerde, cuanto más sencillo sea el código ahora, más fácil será entenderlo después si tiene que modificarlo.

Ahora, cree un nuevo archivo .cpp llamado hud_import.cpp. Aquí están las declaraciones de inclusión y pre-función requeridas (en la parte superior de su archivo .cpp):
#include "hud.h" #include "cbase.h" #include "hud_import.h" #include "iclientmode.h" #include "hud_macros.h" #include "vgui_controls/controls.h" #include "vgui/ISurface.h" #include "tier0/memdbgon.h" using namespace vgui; DECLARE_HUDELEMENT( CHudImport );

Para iniciar esto tenemos que cargar la variable del puntero de la textura. El mejor lugar para ello es el constructor de la clase.

Lo que vamos a hacer:

Obtener el viewport y emparentarlo
hacerlo invisible, pero con alpha 100%
crear un nuevo id de textura para nuestra textura/sprite
conectar el id a la textura
hacer que se muestre sólo si tienes el traje y si no estás muerto
Así es como se hace.
CHudImport::CHudImport( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudImport" ) { Panel *pParent = g_pClientMode->GetViewport(); SetParent( pParent ); SetVisible( false ); SetAlpha( 255 ); //AW Crear textura para mirar alrededor m_nImport = surface()->CreateNewTextureID(); surface()->DrawSetTextureFile( m_nImport, "HUD/import" , true, true); SetHiddenBits( HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT ); }

Nuestro gráfico empieza siendo invisible, así que ahora tenemos que pintarlo. Pasemos a la función de pintar. Ésta, aunque más sencilla, tiene una parte muy importante asociada al tamaño y al espaciado de la que ocuparse.

void CHudImport::Paint() { SetPaintBorderEnabled(false); surface()->DrawSetTexture( m_nImport ); surface()->DrawTexturedRect( 2, 2, 128, 128 ); }

En primer lugar, establecemos el borde de pintura en falso. A continuación, dibujamos nuestra textura en nuestra superficie. La siguiente línea es la parte importante. En realidad, se define donde se pone el panel y lo grande que es en su archivo HudLayout.res. Esta última declaración se adjunta a la propia imagen. Estableces sus valores así...
surface()->DrawTexturedRect( xspacing , yspacing, xsize, ysize );

Usted pondría sus propios valores allí de acuerdo con el tamaño de su imagen.

Hay dos pasos a seguir, nuestro cvar toggle así como la edición del HudLayout.res.
Definir el ConVar
Primero, definamos la cvar. Vuelve a la parte superior del archivo cpp y pega esto:
static ConVar show_beta("show_beta", "0", 0, "toggles beta icon in upper right corner");

show_beta es el nombre de la variable que estamos usando como ejemplo. En realidad estamos creando la serie de imágenes del segundo post.

Esta variable nos permitirá escribir show_beta 1 en la consola.

Pero qué hará eso por nosotros, necesitamos una función para probarlo.
void CHudImport::togglePrint() { if (!show_beta.GetBool()) this->SetVisible(false); si no this->SetVisible(true); }
No es demasiado complejo, sólo un estado booleano tradicional. Y como es algo que puede cambiar en cualquier momento, deberíamos ponerlo en nuestra función think para que se compruebe siempre.
void CHudImport::OnThink() { togglePrint(); BaseClass::OnThink(); }

Y eso es todo. Construir, por lo que podemos pasar a la .res.
Edición de HudLayout.res
Abre /scripts/HudLayout.res en el directorio principal de tu mod y pega lo siguiente en él.
HudImport { "fieldName" "HudImport" "xpos" "r86" "ypos" "6" "wide" "80" "tall" "34" "visible" "0" "enabled" "1" "PaintBackgroundType" "2" }

Hay una serie de esquemas para elegir. Para más información sobre los esquemas de VGUI, puedes leer VGUI Documentation#Schemes.

Arrancando el juego ahora, deberías estar viendo tu HUD, con un gráfico en la esquina superior derecha de la pantalla dibujado con esquinas redondeadas.

Información extra

Si por alguna razón quieres que se muestre una Textura animada en la esquina superior derecha como yo quería, es posible y se puede lograr. No use VtfEdit porque cuando lo hice no funcionó Use el método original de VTEX. Básicamente en el documento de texto que acompaña al .tgas que has animado debes especificar los fotogramas de inicio y fin así

"startframe" "0" "endframe" "7"

Y llamar a ese documento .txt igual que a tu .tgas y hacer click y arrastrarlo sobre VTEX y dejar que funcione (NOTA~ debes tener el archivo .txt y el .tgas en la carpeta materialsrc de tu carpeta sourcesdkcontent/SOURCEMOD/ para que VTEX funcione)

(NOTA~ puedes comprobar que funciona en VTFEDIT si lo abres allí y pulsas play, pero no lo guardes allí!!!) Así que cuando tengas tu VTF animado funcionando ponlo en tu carpeta SourceMod /materials Ahora crea un vmt que es básicamente un documento Txt (puedes hacerlos en el Bloc de notas pero asegúrate de que la extensión es .vmt) Pega el siguiente código en tu .vmt

"UnlitGeneric" { "$basetexture" "'''hud/NameOfYourImage'''" "$translucent" "1" "Proxies" { "AnimatedTexture" { "animatedtexturevar" "$basetexture" "animatedtextureframenumvar" "$frame" "animatedtextureframerate" 10 } } }

Arriba hud se refiere a la carpeta dentro de su carpeta de materiales el VTF se encuentra y NameOfYourImage se refiere al nombre de su VTF (NOTA~ su vmt debe ser nombrado exactamente el mismo que su VTF e.g = image.vtf y image.vmt)