HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Спрайт при активации trigger_camera (https://hlfx.ru/forum/showthread.php?threadid=4756)
Отправлено FanaT2 23-04-2016 в 17:07:
Спрайт при активации trigger_camera
Хочу знать, как сделать так, чтобы при активации trigger_camera спрайт растягивайся по всему экрану?
С HLSDK дружу плохо, поэтому ногами не бить
.
Отправлено ***FantoM*** 23-04-2016 в 17:32:
FanaT2
Eсть два способа
Первый(маппинг)
Поставить trigger_camera и перед нею поставить env_sprite.
Второй(кодинг)
Найти функцию включения камеры и передать мессагу для включения эффекта на клиенте,
а эффект создать через triapi.
Отправлено Ku2zoff 24-04-2016 в 04:34:
Маппингом быстрее. В блушифте так камеры сделаны, что в начале игры можно посмотреть. Только маппинг подходит только для статичных камер. Для подвижных нужен кодинг.
FanaT2 поищи тутор по ночному виденью, там есть как нарисовать спрайт на весь экран. Без триапи. Просто. Чтоб не парить мозг этим триапи раньше времени.
Отправлено FanaT2 25-04-2016 в 17:10:
Ku2zoff
Вот код из ночного видения
if (m_fOn)
{
// здесь задается имя спрайта
HSPRITE hspr = SPR_Load( "sprites/of_nv_b.spr" );
// 128, 255, 128 - это зеленоватый цвет в RGB, измени если нужно
SPR_Set(hspr, 128, 255, 128 );
// 20 - это скорость анимации спрайта, количество кадров/сек
int frame = (int)(flTime * 20) % SPR_Frames(hspr);
int xSize = SPR_Width(hspr, 0);
int ySize = SPR_Height(hspr, 0);
for (int yPos = 0; yPos < ScreenHeight; yPos += ySize)
{
for (int xPos = 0; xPos < ScreenWidth; xPos += xSize)
{
SPR_DrawAdditive(frame, xPos, yPos, NULL);
}
}
}
куда его нужно вставить,чтобы он работал после активации камеры?
Отправлено FanaT2 26-04-2016 в 19:11:
***FantoM*** Ku2zoff Куда же вставить код?
Отправлено Ku2zoff 27-04-2016 в 14:29:
FanaT2 значит, решил кодить. Тогда пиши новую клиентскую мессагу. Например, gmsgCameraSprite. В player.cpp по аналогии с остальными мессагами:
C++ Source Code:
gmsgCameraSprite = REG_USER_MSG("CameraSprite", 1); |
Объём в 1 байт более чем достаточно, чтобы вкл/выкл эффект. Далее, в коде камеры, в функции void CTriggerCamera::Use, после строчки SET_VIEW( pActivator->edict(), edict() ); вставляешь вызов новой мессаги, примерно такой:
C++ Source Code:
MESSAGE_BEGIN( MSG_ONE, gmsgCameraSprite, NULL, pActivator->pev ); |
Ниже, в функции void CTriggerCamera::FollowTarget после строчки SET_VIEW( m_hPlayer->edict(), m_hPlayer->edict() ); повторно отправляешь мессагу:
C++ Source Code:
MESSAGE_BEGIN( MSG_ONE, gmsgCameraSprite, NULL, pActivator->pev ); |
На сервере в принципе всё. На клиенте заводишь в классе CHud переменную m_iCameraSprite и новую мессагу по аналогии с существующими. Принимая мессагу на клиенте, меняешь значение переменной с 0 на 1 и наоборот. В функцию CHud::Redraw засовываешь код:
C++ Source Code:
3 | // здесь задается имя спрайта |
4 | HSPRITE hspr = SPR_Load( "sprites/of_nv_b.spr" ); |
6 | // 128, 255, 128 - это зеленоватый цвет в RGB, измени если нужно |
7 | SPR_Set(hspr, 128, 255, 128 ); |
9 | // 20 - это скорость анимации спрайта, количество кадров/сек |
10 | int frame = (int)(flTime * 20) % SPR_Frames(hspr); |
11 | int xSize = SPR_Width(hspr, 0); |
12 | int ySize = SPR_Height(hspr, 0); |
14 | for (int yPos = 0; yPos < ScreenHeight; yPos += ySize) |
16 | for (int xPos = 0; xPos < ScreenWidth; xPos += xSize) |
18 | SPR_DrawAdditive(frame, xPos, yPos, NULL); |
Немного шаманства с сейв/рестором и поиск потенциальных багов...
PROFIT!!!
Добавлено 27-04-2016 в 20:29:
З.Ы. есть нюанс. Кажется, я не учёл выключение спрайта, когда игрок дохнет. ХЗ. Если будет такое, то просто отправь мессагу с нулевым значением из функции CBasePlayer::Killed.
Отправлено FanaT2 27-04-2016 в 18:24:
Ku2zoff огромное тебе спасибо!
Добавлено 27-04-2016 в 21:24:
Ku2zoff Реально ли сменить спрайт не через код, а через entity trigger_camera?