Ru/VGUI Screen Creation: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
(Created page with "{{otherlang2 |title=Создание VGUI экрана |en=VGUI_Screen_Creation }} == Adding a VGUI screen to map== {{note|This section assumes a mod where VGUI screens have b...")
 
m (Multipage removal)
 
(13 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{otherlang2
{{LanguageBar}}
|title=Создание VGUI экрана
|en=VGUI_Screen_Creation
}}
== Adding a VGUI screen to map==
{{note|This section assumes a mod where VGUI screens have been fixed (see the [[#VGUI code modifications|code modifications section]] below) but otherwise left the same. VGUI screens do ''not'' work in HL2 or HL2:DM; they crash the game. (CS:S not tested.)}}


# Create a [[VGUI_Screen|vgui_screen]] entity. This is a point entity.
== Добавление VGUI экрана на карту ==
# Set its '''Panel Name''' to the name of the screen that should be shown. (This is not the filename of the screen.) The available screens are listed in <code>vgui_screens.txt</code> (which should be in the <code>scripts</code> directory).
{{Note|В этом разделе предполагается мод, в котором были исправлены экраны VGUI. (Смотрите [[#VGUI code modifications| Модификацию кода]] ниже) но в остальном это то же самое. Экраны VGUI "не" работают в HL2 или HL2: DM; они вылетают из игры. (CS:S не тестировался.)}}
# Set '''Panel Width in World''' and '''Panel Height in World''' to match the size of the brush. 64 wide by 32 tall would be a reasonable starting size.
# Compile the map and test.


The position of the entity in the map marks the bottom-left corner of the panel. The panel's direction (the normal of its face) is set by the entity's angle (Yaw).
# Создайте {{en}} [[VGUI_Screen|vgui_screen]] энтити. Это точечная энтити.
# Установите его '''Panel Name''' равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в {{code|vgui_screens.txt}} (который должен находиться в каталоге {{code|scripts}}).
# Установите '''Ширина панели в мире''' и '''Высота панели в мире''' в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
# Скомпилируйте карту и протестируйте.


== Creating a VGUI screen ==
Положение объекта на карте отмечает нижний левый угол панели. Направление панели (нормаль к ее грани) задается углом объекта (Yaw)..
VGUI screen files have a ''.res'' extension and should be placed in <code>scripts\screens\</code>.


# <code>vgui_test_screen.res</code> is a good starting point for creating a VGUI screen file; it can be extracted from <code>source engine.gcf</code> at path <code>hl2/scripts/screens/</code> using [[GCFScape]].
== Создание VGUI экрана ==
# The materials used in the ''.res'' file can be found in <code>source materials.gcf</code>. Extract the material files mentioned in the ''.res'' file to <code>materials\vgui\screens\</code>.
Файлы экрана VGUI имеют расширение .res и должны быть помещены в {{code|scripts\screen\}}..
# Add the screen to <code>scripts\vgui_screens.txt</code>. If it does not exist, create it. Here is an example which describes screen <code>vgui_test_screen</code> at <code>scripts/screens/vgui_test_screen.res</code>. Adjust it for your screen.
 
# {{path|vgui_test_screen|res}} - хорошая отправная точка для создания файла экрана VGUI; его можно найти по пути {{path|...\hl2\scripts\screen}}.
# Материалы, используемые в файле .res, можно найти в {{file|hl2_misc_dir|vpk}}. Извлеките файлы материалов, упомянутые в файле .res, в {{path|...\materials\vgui\screen}}.
# Добавьте экран в {{path|scripts\vgui_screens|txt}}. Если его не существует, создайте его. Вот пример, описывающий экран {{code|vgui_test_screen}} в {{path|scripts/screen/vgui_test_screen|res}}. Отрегулируйте его под свой экран.


  "VGUI_Screens"
  "VGUI_Screens"
Line 33: Line 31:
  }
  }


An example <code>vgui_screen.txt</code> file can be [[GCFScape|extracted]] from <code>source engine.gcf</code> at <code>root/hl2/scripts</code>.
Пример файла {{file|vgui_screen|txt}} находиться в {{path|hl2/scripts}}.
 
 


==VGUI code modifications==
==Модификации кода VGUI==


There is a problem with VGUI screens receiving input. Unless it is fixed, the game may crash when the cursor points at the screen.
Возникла проблема с экранами VGUI, получающими ввод. Если это не исправить, игра может вылетать, когда курсор указывает на экран.


<code>CInput::ExtraMouseSample</code> calls <code>g_pClientMode->CreateMove()</code> without initializing the button flags, thus the VGui screen is updated with bad button input. Since <code>IN_VALIDVGUIINPUT</code> is only set from within <code>CInput::CreateMove</code>, the VGui screens only update when the button flags are valid.
{{code|CInput ::ExtraMouseSample}} вызывает {{code|g_pClientMode-> CreateMove()}} без инициализации флагов кнопок, поэтому экран VGui обновляется с неверным вводом кнопки. Поскольку {{code|IN_VALIDVGUIINPUT}} устанавливается только из {{code|CInput ::CreateMove}}, экраны VGui обновляются только тогда, когда флажки кнопки действительны.


There are two known fixes. They both involve code changes and therefore are only applicable to mods.
Есть два известных исправления. Оба они включают изменения кода и поэтому применимы только к модам.


=== Fix 1 ===
=== Фикс 1 ===
In '''src\game_shared\in_buttons.h''', where the other flags are defined add:
В '''src\game_shared\in_buttons.h''', где определены другие флаги, добавить:
     #define IN_VALIDVGUIINPUT     (1 << 23) //bitflag for vgui fix
     #define IN_VALIDVGUIINPUT     (1 << 23) //bitflag for vgui fix


next, in '''src\cl_dll\in_main.cpp''' inside method <code>CInput::CreateMove ( ''...'' )</code>
дальше, в '''src\cl_dll\in_main.cpp''' внутри метода {{code|CInput::CreateMove ( ''...'' )}}
add:
добавить:
     cmd->buttons |= IN_VALIDVGUIINPUT;
     cmd->buttons |= IN_VALIDVGUIINPUT;
right above:
прямо над:
     g_pClientMode->CreateMove( input_sample_frametime, cmd );
     g_pClientMode->CreateMove( input_sample_frametime, cmd );


next, in '''src\cl_dll\c_baseplayer.cpp''' inside method <code>C_BasePlayer::CreateMove( ''...'' )</code>
дальше, в '''src\cl_dll\c_baseplayer.cpp''' внутри метода {{code|C_BasePlayer::CreateMove( ''...'' )}}
add:
добавить:
     if(pCmd->buttons & IN_VALIDVGUIINPUT)
     if(pCmd->buttons & IN_VALIDVGUIINPUT)
right above:
прямо над:
     DetermineVguiInputMode( pCmd );
     DetermineVguiInputMode( pCmd );
''(So it only calls <code>DetermineVguiInputMode</code> if the buttons include our flag)''
''(So it only calls {{code|DetermineVguiInputMode}} if the buttons include our flag)''


and finally, inside method <code>C_BasePlayer::DetermineVguiInputMode( ''...'' )</code>
и наконец, внутри метода {{code|C_BasePlayer::DetermineVguiInputMode( ''...'' )}}
change '''both''' instances of:
изменить '''оба''' экземпляра:
     pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2);
     pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2);
to read:
для чтения:
     pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2 | IN_VALIDVGUIINPUT);
     pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2 | IN_VALIDVGUIINPUT);


Since an [[HL2]] engine update in October VGUI Screens will crash when you put your mouse over them. This is because the <code>g_InputInternal</code> function used in <code>\src\cl_dll\c_vguiscreen.cpp</code> is no longer working. Trying to access it makes it crash. For a workaround, the following <code>C_VGuiScreen::ClientThink( void )</code> function has proven useful:
После обновления движка {{L|HL2}} в октябре, экраны VGUI аварийно завершают работу, когда вы наводите на них указатель мыши. Это связано с тем, что функция {{code|g_InputInternal}}, используемая в {{code|\src\cl_dll\c_vguiscreen.cpp}}, больше не работает. Попытка получить к нему доступ приводит к сбою. В качестве обходного пути оказалась полезной следующая функция {{code|C_VGuiScreen ::ClientThink(void)}}.:


  // Convert (u,v) into (px,py)
  // Convert (u,v) into (px,py)
Line 99: Line 95:
  }
  }


=== Fix 2 ===
=== Фикс 2 ===
An alternative fix would be to add a new boolean variable to <code>CUserCmd</code> such as <code>bButtonFlagsValid</code> that can be set depending on the validity of the button flags. This would allow the structure to internally store this information for its whole lifetime while freeing up that extra button bit.
Альтернативным исправлением может быть добавление новой логической переменной в {{code|CUserCmd}}, например {{code|bButtonFlagsValid}}, которая может быть установлена ​​в зависимости от допустимости флагов кнопки. Это позволит структуре внутренне хранить эту информацию в течение всего срока ее службы, освобождая при этом лишний бит кнопки.


== Example screenshots ==
== Скриншоты ==
[[Image:Granted_vgui.jpg|thumb|left|VGUI screen used in mod]]
[[File:Granted_vgui.jpg|thumb|left|Экран VGUI, используемый в моде]]


[[Image:Ekg_vgui.jpg|thumb|left|VGUI screen used to display dynamically drawn EKG data]]
[[File:Ekg_vgui.jpg|thumb|left|Экран VGUI, используемый для отображения динамически отображаемых данных ЭКГ]]


[[Category:Tutorials]]
[[File:Bms mortar vgui.jpg|thumb|left|Экран VGUI, используемый для управления минометом в {{bms|3.1}}]]
[[Category:VGUI|S]]
{{ACategory|Programming}}
{{ACategory|Tutorials}}
{{ACategory|VGUI|S}}

Latest revision as of 11:53, 12 July 2024

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

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

Note.pngПримечание:В этом разделе предполагается мод, в котором были исправлены экраны VGUI. (Смотрите Модификацию кода ниже) но в остальном это то же самое. Экраны VGUI "не" работают в HL2 или HL2: DM; они вылетают из игры. (CS:S не тестировался.)
  1. Создайте English vgui_screen энтити. Это точечная энтити.
  2. Установите его Panel Name равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в vgui_screens.txt (который должен находиться в каталоге scripts).
  3. Установите Ширина панели в мире и Высота панели в мире в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
  4. Скомпилируйте карту и протестируйте.

Положение объекта на карте отмечает нижний левый угол панели. Направление панели (нормаль к ее грани) задается углом объекта (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