VGUI Screen Creation

From Valve Developer Community
< Ru
Revision as of 11:53, 12 July 2024 by Nesciuse (talk | contribs) (Multipage removal)
Jump to navigation Jump to search
English (en)Русский (ru)中文 (zh)Translate (Translate)

Добавление VGUI экрана на карту

Note.pngПримечание:В этом разделе предполагается мод, в котором были исправлены экраны VGUI. (Смотрите Модификацию кода ниже) но в остальном это то же самое. Экраны VGUI "не" работают в HL2 или HL2: DM; они вылетают из игры. (CS:S не тестировался.)
  1. Создайте
Warning icon.png
This article has been marked as a candidate for speedy deletion for the following reason:
Use {{Flag|en}} instead.
If you object to this decision, then please discuss why here (If you make a discussion section also create this redirect page). If this page doesn't meet the criteria for speedy deletion, then please remove this notice, but do not remove it from pages that you have created yourself
Administrators / Moderators - Remember to check if anything links here and the page history before deleting.

vgui_screen энтити. Это точечная энтити.

  1. Установите его Panel Name равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в vgui_screens.txt (который должен находиться в каталоге scripts).
  2. Установите Ширина панели в мире и Высота панели в мире в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
  3. Скомпилируйте карту и протестируйте.

Положение объекта на карте отмечает нижний левый угол панели. Направление панели (нормаль к ее грани) задается углом объекта (Yaw)..

Создание VGUI экрана

Файлы экрана VGUI имеют расширение .res и должны быть помещены в scripts\screen\..

  1. 🖿vgui_test_screen.res - хорошая отправная точка для создания файла экрана VGUI; его можно найти по пути 🖿...\hl2\scripts\screen.
  2. Материалы, используемые в файле .res, можно найти в 🖿hl2_misc_dir.vpk. Извлеките файлы материалов, упомянутые в файле .res, в 🖿...\materials\vgui\screen.
  3. Добавьте экран в 🖿scripts\vgui_screens.txt. Если его не существует, создайте его. Вот пример, описывающий экран vgui_test_screen в 🖿scripts/screen/vgui_test_screen.res. Отрегулируйте его под свой экран.
"VGUI_Screens"
{
   "vgui_test_screen"
   {
       // This is our example screen
       "type"		"vgui_screen_panel"
       "pixelswide"	480
       "pixelshigh"	240
       // This must be the file you created in step 1
       "resfile"	"scripts/screens/vgui_test_screen.res"
   } 
}

Пример файла 🖿vgui_screen.txt находиться в 🖿hl2/scripts.

Модификации кода VGUI

Возникла проблема с экранами VGUI, получающими ввод. Если это не исправить, игра может вылетать, когда курсор указывает на экран.

CInput ::ExtraMouseSample вызывает g_pClientMode-> CreateMove() без инициализации флагов кнопок, поэтому экран VGui обновляется с неверным вводом кнопки. Поскольку IN_VALIDVGUIINPUT устанавливается только из CInput ::CreateMove, экраны VGui обновляются только тогда, когда флажки кнопки действительны.

Есть два известных исправления. Оба они включают изменения кода и поэтому применимы только к модам.

Фикс 1

В src\game_shared\in_buttons.h, где определены другие флаги, добавить:

   #define IN_VALIDVGUIINPUT		    (1 << 23) //bitflag for vgui fix

дальше, в src\cl_dll\in_main.cpp внутри метода CInput::CreateMove ( ... ) добавить:

   cmd->buttons |= IN_VALIDVGUIINPUT;

прямо над:

   g_pClientMode->CreateMove( input_sample_frametime, cmd );

дальше, в src\cl_dll\c_baseplayer.cpp внутри метода C_BasePlayer::CreateMove( ... ) добавить:

   if(pCmd->buttons & IN_VALIDVGUIINPUT)

прямо над:

   DetermineVguiInputMode( pCmd );

(So it only calls DetermineVguiInputMode if the buttons include our flag)

и наконец, внутри метода C_BasePlayer::DetermineVguiInputMode( ... ) изменить оба экземпляра:

   pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2);

для чтения:

   pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2 | IN_VALIDVGUIINPUT);

После обновления движка HL2(en) в октябре, экраны VGUI аварийно завершают работу, когда вы наводите на них указатель мыши. Это связано с тем, что функция g_InputInternal, используемая в \src\cl_dll\c_vguiscreen.cpp, больше не работает. Попытка получить к нему доступ приводит к сбою. В качестве обходного пути оказалась полезной следующая функция C_VGuiScreen ::ClientThink(void).:

	// Convert (u,v) into (px,py)
	int px = (int)(u * m_nPixelWidth + 0.5f);
	int py = (int)(v * m_nPixelHeight + 0.5f);

// START TEDDYS FIX
	for (int i = 0; i < pPanel->GetChildCount(); i++)
	{
		vgui::Button *child = dynamic_cast<vgui::Button*>(pPanel->GetChild(i));
		if ( child )
		{
			int x1, x2, y1, y2;
			child->GetBounds( x1, y1, x2, y2 );

			// Generate mouse input commands
			if ( (m_nButtonState & IN_ATTACK) )
			{
				if ( px >= x1 && px <= x1 + x2 && py >= y1 && py <= y1 + y2 )
					child->FireActionSignal();
			}
		}
	}
// FIN TEDDYS FIX

	if ( m_bLooseThinkNextFrame == true )
	{
		m_bLooseThinkNextFrame = false;
		SetNextClientThink( CLIENT_THINK_NEVER );
	}

Фикс 2

Альтернативным исправлением может быть добавление новой логической переменной в CUserCmd, например bButtonFlagsValid, которая может быть установлена ​​в зависимости от допустимости флагов кнопки. Это позволит структуре внутренне хранить эту информацию в течение всего срока ее службы, освобождая при этом лишний бит кнопки.

Скриншоты

Экран VGUI, используемый в моде
Экран VGUI, используемый для отображения динамически отображаемых данных ЭКГ
Экран VGUI, используемый для управления минометом в Black Mesa