Ru/VGUI Screen Creation: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
{{otherlang2
{{lang|VGUI Screen Creation}}
|title=Создание VGUI экрана
|en=VGUI_Screen_Creation
}}
== Добавление VGUI экрана на карту ==
== Добавление VGUI экрана на карту ==
{{note:ru|В этом разделе предполагается мод, в котором были исправлены экраны VGUI. (Смотрите [[#VGUI code modifications| Модификацию кода]] ниже) но в остальном это то же самое. Экраны VGUI "не" работают в HL2 или HL2: DM; они вылетают из игры. (CS:S не тестировался.)}}
{{note:ru|В этом разделе предполагается мод, в котором были исправлены экраны VGUI. (Смотрите [[#VGUI code modifications| Модификацию кода]] ниже) но в остальном это то же самое. Экраны VGUI "не" работают в HL2 или HL2: DM; они вылетают из игры. (CS:S не тестировался.)}}


# Создайте [[VGUI_Screen|vgui_screen]] энтити. Это точечная энтити.
# Создайте {{en}} [[VGUI_Screen|vgui_screen]] энтити. Это точечная энтити.
# Установите его '''Panel Name''' равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в <code>vgui_screens.txt</code> (который должен находиться в каталоге <code>scripts</code>).
# Установите его '''Panel Name''' равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в <code>vgui_screens.txt</code> (который должен находиться в каталоге <code>scripts</code>).
# Установите '''Ширина панели в мире''' и '''Высота панели в мире''' в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
# Установите '''Ширина панели в мире''' и '''Высота панели в мире''' в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
Line 107: Line 104:
[[Image:Ekg_vgui.jpg|thumb|left|Экран VGUI, используемый для отображения динамически отображаемых данных ЭКГ]]
[[Image:Ekg_vgui.jpg|thumb|left|Экран VGUI, используемый для отображения динамически отображаемых данных ЭКГ]]


[[Category:Tutorials]]
[[Category:Programming:ru]]
[[Category:VGUI|S]]
[[Category:Tutorials:ru]]
[[Category:VGUI:ru]]

Revision as of 10:31, 24 May 2022

English (en)Русский (ru)中文 (zh)Translate (Translate)

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

Template:Note:ru

  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; его можно извлечь из source engine.gcf по пути hl2/scripts/screen/ с помощью GCFScape.
  2. Материалы, используемые в файле .res, можно найти в source materials.gcf . Извлеките файлы материалов, упомянутые в файле .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 в октябре, экраны 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, используемый для отображения динамически отображаемых данных ЭКГ