Ru/VGUI Screen Creation: Difference between revisions
SlasteliNVL (talk | contribs) (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...") |
SlasteliNVL (talk | contribs) No edit summary |
||
Line 3: | Line 3: | ||
|en=VGUI_Screen_Creation | |en=VGUI_Screen_Creation | ||
}} | }} | ||
== | == Добавление VGUI экрана на карту == | ||
{{note| | {{note:ru|В этом разделе предполагается мод, в котором были исправлены экраны VGUI. (Смотрите [[#VGUI code modifications| Модификацию кода]] ниже) но в остальном это то же самое. Экраны VGUI "не" работают в HL2 или HL2: DM; они вылетают из игры. (CS:S не тестировался.)}} | ||
# | # Создайте [[VGUI_Screen|vgui_screen]] энтити. Это точечная энтити. | ||
# | # Установите его '''Panel Name''' равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в <code>vgui_screens.txt</code> (который должен находиться в каталоге <code>scripts</code>). | ||
# | # Установите '''Ширина панели в мире''' и '''Высота панели в мире''' в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером. | ||
# | # Скомпилируйте карту и протестируйте. | ||
Положение объекта на карте отмечает нижний левый угол панели. Направление панели (нормаль к ее грани) задается углом объекта (Yaw).. | |||
== | == Создание VGUI экрана == | ||
VGUI | Файлы экрана VGUI имеют расширение .res и должны быть помещены в <code>scripts\screen\</code>.. | ||
# <code>vgui_test_screen.res</code> | # <code>vgui_test_screen.res</code> - хорошая отправная точка для создания файла экрана VGUI; его можно извлечь из <code>source engine.gcf</code> по пути <code>hl2/scripts/screen/</code> с помощью [[GCFScape]]. | ||
# | # Материалы, используемые в файле .res, можно найти в <code> source materials.gcf </code>. Извлеките файлы материалов, упомянутые в файле .res, в <code> materials \ vgui \ screen \ </code>. | ||
# | # Добавьте экран в <code> scripts \ vgui_screens.txt </code>. Если его не существует, создайте его. Вот пример, описывающий экран <code> vgui_test_screen </code> в <code> scripts / screen / vgui_test_screen.res </code>. Отрегулируйте его под свой экран. | ||
"VGUI_Screens" | "VGUI_Screens" | ||
Line 33: | Line 33: | ||
} | } | ||
Пример файла <code>vgui_screen.txt</code> находиться в <code>hl2/scripts</code>. | |||
==VGUI | ==Модификации кода VGUI== | ||
Возникла проблема с экранами VGUI, получающими ввод. Если это не исправить, игра может вылетать, когда курсор указывает на экран. | |||
<code>CInput::ExtraMouseSample</code> | <code>CInput ::ExtraMouseSample</code> вызывает <code>g_pClientMode-> CreateMove()</code> без инициализации флагов кнопок, поэтому экран VGui обновляется с неверным вводом кнопки. Поскольку <code>IN_VALIDVGUIINPUT</code> устанавливается только из <code>CInput ::CreateMove</code>, экраны VGui обновляются только тогда, когда флажки кнопки действительны. | ||
Есть два известных исправления. Оба они включают изменения кода и поэтому применимы только к модам. | |||
=== | === Фикс 1 === | ||
В '''src\game_shared\in_buttons.h''', где определены другие флаги, добавить: | |||
#define IN_VALIDVGUIINPUT (1 << 23) //bitflag for vgui fix | #define IN_VALIDVGUIINPUT (1 << 23) //bitflag for vgui fix | ||
дальше, в '''src\cl_dll\in_main.cpp''' внутри метода <code>CInput::CreateMove ( ''...'' )</code> | |||
добавить: | |||
cmd->buttons |= IN_VALIDVGUIINPUT; | cmd->buttons |= IN_VALIDVGUIINPUT; | ||
right above: | right above: | ||
g_pClientMode->CreateMove( input_sample_frametime, cmd ); | g_pClientMode->CreateMove( input_sample_frametime, cmd ); | ||
дальше, в '''src\cl_dll\c_baseplayer.cpp''' внутри метода <code>C_BasePlayer::CreateMove( ''...'' )</code> | |||
добавить: | |||
if(pCmd->buttons & IN_VALIDVGUIINPUT) | if(pCmd->buttons & IN_VALIDVGUIINPUT) | ||
right above: | right above: | ||
Line 62: | Line 62: | ||
''(So it only calls <code>DetermineVguiInputMode</code> if the buttons include our flag)'' | ''(So it only calls <code>DetermineVguiInputMode</code> if the buttons include our flag)'' | ||
и наконец, внутри метода <code>C_BasePlayer::DetermineVguiInputMode( ''...'' )</code> | |||
изменить '''оба''' экземпляра: | |||
pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2); | pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2); | ||
to read: | to read: | ||
pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2 | IN_VALIDVGUIINPUT); | pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2 | IN_VALIDVGUIINPUT); | ||
После обновления движка [[HL2]] в октябре, экраны VGUI аварийно завершают работу, когда вы наводите на них указатель мыши. Это связано с тем, что функция <code>g_InputInternal</code>, используемая в <code>\src\cl_dll\c_vguiscreen.cpp</code>, больше не работает. Попытка получить к нему доступ приводит к сбою. В качестве обходного пути оказалась полезной следующая функция <code>C_VGuiScreen ::ClientThink(void)</code>.: | |||
// Convert (u,v) into (px,py) | // Convert (u,v) into (px,py) | ||
Line 99: | Line 99: | ||
} | } | ||
=== | === Фикс 2 === | ||
Альтернативным исправлением может быть добавление новой логической переменной в <code>CUserCmd</code>, например <code>bButtonFlagsValid</code>, которая может быть установлена в зависимости от допустимости флагов кнопки. Это позволит структуре внутренне хранить эту информацию в течение всего срока ее службы, освобождая при этом лишний бит кнопки. | |||
== | == Скриншоты == | ||
[[Image:Granted_vgui.jpg|thumb|left|VGUI | [[Image:Granted_vgui.jpg|thumb|left|Экран VGUI, используемый в моде]] | ||
[[Image:Ekg_vgui.jpg|thumb|left|VGUI | [[Image:Ekg_vgui.jpg|thumb|left|Экран VGUI, используемый для отображения динамически отображаемых данных ЭКГ]] | ||
[[Category:Tutorials]] | [[Category:Tutorials]] | ||
[[Category:VGUI|S]] | [[Category:VGUI|S]] |
Revision as of 13:45, 20 June 2021
Добавление VGUI экрана на карту
- Создайте vgui_screen энтити. Это точечная энтити.
- Установите его Panel Name равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в
vgui_screens.txt
(который должен находиться в каталогеscripts
). - Установите Ширина панели в мире и Высота панели в мире в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
- Скомпилируйте карту и протестируйте.
Положение объекта на карте отмечает нижний левый угол панели. Направление панели (нормаль к ее грани) задается углом объекта (Yaw)..
Создание VGUI экрана
Файлы экрана VGUI имеют расширение .res и должны быть помещены в scripts\screen\
..
vgui_test_screen.res
- хорошая отправная точка для создания файла экрана VGUI; его можно извлечь изsource engine.gcf
по путиhl2/scripts/screen/
с помощью GCFScape.- Материалы, используемые в файле .res, можно найти в
source materials.gcf
. Извлеките файлы материалов, упомянутые в файле .res, вmaterials \ vgui \ screen \
. - Добавьте экран в
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;
right above:
g_pClientMode->CreateMove( input_sample_frametime, cmd );
дальше, в src\cl_dll\c_baseplayer.cpp внутри метода C_BasePlayer::CreateMove( ... )
добавить:
if(pCmd->buttons & IN_VALIDVGUIINPUT)
right above:
DetermineVguiInputMode( pCmd );
(So it only calls DetermineVguiInputMode
if the buttons include our flag)
и наконец, внутри метода C_BasePlayer::DetermineVguiInputMode( ... )
изменить оба экземпляра:
pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2);
to read:
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
, которая может быть установлена в зависимости от допустимости флагов кнопки. Это позволит структуре внутренне хранить эту информацию в течение всего срока ее службы, освобождая при этом лишний бит кнопки.