Ru/Personal Game Logo

=Вступление=
В случае если вы используете 2007 версию SDK, в которой в главном меню игры нет Логотипа, этот туториал как раз то что доктор прописал.
Его также можно использовать для того чтобы написать дополнительный логотип, например вашей команды разработчиков .
Наш логотип будет аналогичен коду от VALVe в 2009 версии движка, только он не читает запись из файла gameinfo.txt
=Начнем=
Откроем клиент игры. Я создал новый фильтр в Visual Studio 2010, в фильтре Source Files и располагал файлы там.
Вы можете поступить как угодно.
Напишем файл интерфейса для логотипа igamelogo.h
/*
	Copyright © 2010-2012, Refresh Team
	Interface of gamelogo panel
*/
#ifdef _WIN32
#pragma once
#endif
#include <vgui/VGUI.h>
namespace vgui {
	class Panel;
	typedef unsigned long HFont;
}
abstract_class IGameLogo
{
public:
	virtual void	Create( vgui::VPANEL parent ) = 0;
	virtual void	Destroy( void ) = 0;
};
extern IGameLogo *gamelogo;
Создадим файл GameLogo.h
/*
	Copyright © 2010-2012, Refresh Team
	Load a game logo to menu
*/
#ifdef _WIN32
#pragma once
#endif
#include "vgui_controls/Frame.h"
#include "igamelogo.h"
class CGameLogoPanel : vgui::Frame
{
	DECLARE_CLASS_SIMPLE( CGameLogoPanel, vgui::Frame );
public:
	CGameLogoPanel( vgui::VPANEL parent, char const *panelName );
	~CGameLogoPanel();
	void SetParent(Panel *newParent);
	void SetParent(vgui::VPANEL panel);
};
class CGameLogo : public IGameLogo
{
private:
	CGameLogoPanel *gamelogopanel;
public:
	CGameLogo( void )
	{
		gamelogopanel = NULL;
	}
	void Create( vgui::VPANEL parent )
	{
		gamelogopanel = new CGameLogoPanel( parent, "GameLogo" );
	}
	void Destroy ( void )
	{
		if ( gamelogopanel )
		{
			gamelogopanel->SetParent( (vgui::Panel *)NULL );
			delete gamelogopanel;
		}
	}
};
static CGameLogo g_GameLogo;
IGameLogo *gamelogo = ( IGameLogo * )&g_GameLogo;
Далее создадим файл GameLogo.cpp
/*
	Copyright © 2010-2012, Refresh Team
	Base class for creating a logo
*/
#include "cbase.h"
#include "GameLogo.h"
#include "tier0/memdbgon.h"
using namespace vgui;
CGameLogoPanel::CGameLogoPanel( vgui::VPANEL parent, char const *panelName ) : BaseClass( NULL, panelName ) // Конструктор
{
	SetParent( parent );
	SetMoveable( false );
	SetSizeable( false );
	SetTitleBarVisible( false );
	SetKeyBoardInputEnabled( false );
	SetMouseInputEnabled( false );
	SetPaintBackgroundEnabled( false );
	SetPaintBorderEnabled( false );
	SetProportional( true );
	SetMenuButtonVisible( false );
	SetMinimizeButtonVisible( false );
	SetMaximizeButtonVisible( false );
	SetCloseButtonVisible( false );
	SetScheme( vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "SourceScheme") );
	LoadControlSettings( "resource/GameLogo.res" );
	SetVisible( true );
}
void CGameLogoPanel::SetParent(vgui::VPANEL panel)
{
	BaseClass::SetParent(panel);
}
void CGameLogoPanel::SetParent(Panel *newParent)
{
	BaseClass::SetParent(newParent);
}
CGameLogoPanel::~CGameLogoPanel() // Деструктор
{
}
 // Это функция вызываемая при вводе команды в консоль
void gamelogo_CC()
{
	DevMsg("Debug mode for gamelogo hud is disabled\n");
}
 // Определение консольной команды при выполнении которой будет включаться/выключаться режим отладки
ConCommand cl_gamelogo_build_mode("cl_gamelogo_build_mode", gamelogo_CC, "Change build mode to gamelogo");
Далее открываем файл vgui_int.cpp
Подключим наш файл интерфейса
#include "igamelogo.h"
Найдем функцию void VGui_CreateGlobalPanels( void ), допишем в ее конец создание нашей функции
// Если использовать как родительскую панель PANEL_GAMEUIDLL
// То логотип будет автоматически скрываться при запуске карты
VPANEL GameUiDll = enginevgui->GetPanel( PANEL_GAMEUIDLL);
gamelogo->Create( GameUiDll );
Затем в конец функции void VGui_Shutdown() допишем уничтожение нашего логотипа
gamelogo->Destroy();
Запускаем мод. Не пугайтесь если ничего не отобразилось
Нужно в GameLogo.res написать вот что
"resource/GameLogo.res"
{
	"GameLogo"
	{
		"ControlName"		"CGameLogo"
		"fieldName"		"GameLogo"
		"xpos"		"62"
		"ypos"		"0"
		"wide"		"255"
		"tall"		"255"
		"autoResize"		"0"
		"pinCorner"		"0"
		"visible"		"1"
		"enabled"		"1"
		"tabPosition"		"0"
		"settitlebarvisible"		"1"
		"title"		"#Frame_Untitled"
	}
	"ImageRefresh"
	{
		"ControlName"		"ImagePanel"
		"fieldName"		"ImageRefresh"
		"xpos"		"0"
		"ypos"		"0"
		"wide"		"255"
		"tall"		"255"
		"autoResize"		"0"
		"pinCorner"		"0"
		"visible"		"1"
		"enabled"		"1"
		"tabPosition"		"0"
		"image"		"../game/refresh"
		"scaleImage"		"0"
		"scaleAmount"		"0.000000"
		"tileImage"		"0"
		"tileHorizontally"		"0"
		"tileVertically"		"0"
	}
}
Заменяем ../game/refresh на путь к своему логотипу
=Результаты=
Вот и все. Приведу примеры того что получилось у меня в результате кодинга :)
800px|thumb|center|Главное меню
800px|thumb|center|Меню во время игры
* Автор: LestaD
* Игра: Refresh