Ru/Personal Game Logo: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
(Переписан туториал, по причине утечки памяти в коде предыдущего)
Line 8: Line 8:
Откроем клиент игры. Я создал новый фильтр в Visual Studio 2010, в фильтре Source Files и располагал файлы там.<br/>
Откроем клиент игры. Я создал новый фильтр в Visual Studio 2010, в фильтре Source Files и располагал файлы там.<br/>
Вы можете поступить как угодно.<br/>
Вы можете поступить как угодно.<br/>
Напишем файл интерфейса для логотипа '''igamelogo.h'''<br/>
<source lang=cpp>
/*
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;
</source>
Создадим файл '''GameLogo.h'''<br/>
Создадим файл '''GameLogo.h'''<br/>
<source lang=cpp>
<source lang=cpp>
Line 15: Line 42:
*/
*/


// Подключение базового класса
#ifdef _WIN32
#pragma once
#endif
 
#include "vgui_controls/Frame.h"
#include "vgui_controls/Frame.h"
#include "igamelogo.h"


// Определение нашего класса
class CGameLogoPanel : vgui::Frame
class CGameLogo : vgui::Frame
{
{


DECLARE_CLASS_SIMPLE( CGameLogo, vgui::Frame );
DECLARE_CLASS_SIMPLE( CGameLogoPanel, vgui::Frame );


public:
public:
CGameLogo( vgui::VPANEL parent, char const *panelName );
CGameLogoPanel( vgui::VPANEL parent, char const *panelName );
~CGameLogo();
~CGameLogoPanel();
void toggleBuildMode(); // Переключение режима отладки логотипа
void SetParent(Panel *newParent);
void SetParent(vgui::VPANEL panel);
};


class CGameLogo : public IGameLogo
{
private:
private:
bool m_bBuildMode;
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;
</source>
</source>
<br/><br/>
<br/><br/>
Line 42: Line 101:


#include "cbase.h"
#include "cbase.h"
// Подключаем наш заголовочный файл
#include "GameLogo.h"
#include "GameLogo.h"


// Должен быть последним подключением в файле
#include "tier0/memdbgon.h"
#include "tier0/memdbgon.h"


using namespace vgui; // Используем vgui для удобства
using namespace vgui;


static CGameLogo *g_pGameLogo = NULL; // Переменная в которой хранится созданный класс
CGameLogoPanel::CGameLogoPanel( vgui::VPANEL parent, char const *panelName ) : BaseClass( NULL, panelName ) // Конструктор
 
CGameLogo::CGameLogo( vgui::VPANEL parent, char const *panelName ) : BaseClass( NULL, panelName ) // Конструктор
{
{
g_pGameLogo = this; // Помещаем в переменную созданный класс


m_bBuildMode = false; // Выключаем режим отладки
SetParent( parent );


SetParent( parent ); // Устанавливаем родительскую панель
SetMoveable( false );
SetSizeable( false );


SetMoveable( false ); // Запрет на перемещение
SetTitleBarVisible( false );
SetSizeable( false ); // Запрет на изменение размера


SetTitleBarVisible( false ); // Заголовок не видим
SetKeyBoardInputEnabled( false );
SetMouseInputEnabled( false );


SetKeyBoardInputEnabled( false ); // Вводить с клавиатуры запрещено
SetPaintBackgroundEnabled( false );
SetMouseInputEnabled( false ); // И с мыши
SetPaintBorderEnabled( false );


SetPaintBackgroundEnabled( false ); // Не отрисовывается фон
SetProportional( true );
SetPaintBorderEnabled( false ); // И границы


SetProportional( true ); // Размер автоматически перерасчитывается к размеру экрана игрока
SetMenuButtonVisible( false );
SetMinimizeButtonVisible( false );
SetMaximizeButtonVisible( false );
SetCloseButtonVisible( false );


SetMenuButtonVisible( false ); // Кнопка меню скрыта
SetMinimizeButtonVisible( false ); // Кнопка сворачивания скрыта
SetMaximizeButtonVisible( false ); // Кнопка разворачивания тоже скрыта
SetCloseButtonVisible( false ); // Ну и кнопка закрытия соответственно
// Подгружаем и устанавливаем схему отображения из файла
SetScheme( vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "SourceScheme") );
SetScheme( vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "SourceScheme") );


// Это файл который отвечает за внешний вид панели логотипа
LoadControlSettings( "resource/GameLogo.res" );
LoadControlSettings( "resource/GameLogo.res" );


SetVisible( true ); // Видимость панели
SetVisible( true );


}
}


void CGameLogo::toggleBuildMode() // Переключение режима отладки панели
void CGameLogoPanel::SetParent(vgui::VPANEL panel)
{
if ( m_bBuildMode ) // Если режим отладки включен
{
SetMoveable( false );
SetSizeable( false );
 
SetTitleBarVisible( false );
 
SetKeyBoardInputEnabled( false );
SetMouseInputEnabled( false );
 
SetPaintBackgroundEnabled( false );
SetPaintBorderEnabled( false );
m_bBuildMode = false; // То выключаем его
}
else // Если же он уже выключен
{
SetMoveable( true );
SetSizeable( false );
 
SetTitleBarVisible( true );
 
SetKeyBoardInputEnabled( true );
SetMouseInputEnabled( true );
 
SetPaintBackgroundEnabled( true );
SetPaintBorderEnabled( true );
 
m_bBuildMode = true; // Включаем
}
}
 
CGameLogo::~CGameLogo() // Деструктор
{
{
BaseClass::SetParent(panel);
}
}


// Функция создания панели с логотипом
void CGameLogoPanel::SetParent(Panel *newParent)
void GameLogo_Create( VPANEL parent )
{
{
new CGameLogo( parent, "GameLogo" );
BaseClass::SetParent(newParent);
}
}


// Функция скрытия панели с логотипом
CGameLogoPanel::~CGameLogoPanel() // Деструктор
void GameLogo_Destroy()
{
{
g_pGameLogo = NULL;
}
}


Line 141: Line 155:
void gamelogo_CC()
void gamelogo_CC()
{
{
if ( g_pGameLogo )
DevMsg("Debug mode for gamelogo hud is disabled\n");
{
g_pGameLogo->toggleBuildMode();
}
}
}


Line 152: Line 163:
<br/><br/>
<br/><br/>
Далее открываем файл '''vgui_int.cpp'''<br>
Далее открываем файл '''vgui_int.cpp'''<br>
И где нибудь вверху после подключений напишем такие строки<br/>
Подключим наш файл интерфейса<br/>
<source lang=cpp>
<source lang=cpp>
// Определение функций для использования в файле
#include "igamelogo.h"
void GameLogo_Create( VPANEL parent );
void GameLogo_Destroy();
</source>
</source>
<br/><br/>
</br><br/>
Найдем функцию '''void VGui_CreateGlobalPanels( void )''', допишем в ее конец создание нашей функции<br>
Найдем функцию '''void VGui_CreateGlobalPanels( void )''', допишем в ее конец создание нашей функции<br>
<source lang=cpp>
<source lang=cpp>
Line 164: Line 173:
// То логотип будет автоматически скрываться при запуске карты
// То логотип будет автоматически скрываться при запуске карты
VPANEL GameUiDll = enginevgui->GetPanel( PANEL_GAMEUIDLL);
VPANEL GameUiDll = enginevgui->GetPanel( PANEL_GAMEUIDLL);
GameLogo_Create( GameUiDll );
gamelogo->Create( GameUiDll );
</source>
</source>
<br/><br/>
<br/><br/>
Затем в конец функции '''void VGui_Shutdown()''' допишем уничтожение нашего логотипа<br/>
Затем в конец функции '''void VGui_Shutdown()''' допишем уничтожение нашего логотипа<br/>
<source lang=cpp>
<source lang=cpp>
GameLogo_Destroy();
gamelogo->Destroy();
</source>
</source>
<br><br>
<br><br>

Revision as of 03:58, 16 August 2012

Вступление

В случае если вы используете 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"
{
}



Запускаем мод. Не пугайтесь если ничего не отобразилось. Включаем режим отладки командой cl_gamelogo_build_mode

cl_gamelogo_build_mode
Затем жмем CTRL+SHIFT+ALT+B
Настраиваем панель и жмем Save и Exit
Выключаем режим отладки той же командой, что и включали




Для особо ленивых или знающих предоставлю почищенный файл 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 на путь к своему логотипу

Результаты

Вот и все. Приведу примеры того что получилось у меня в результате кодинга :)

Главное меню
Меню во время игры





  • Автор: LestaD
  • Игра: Refresh