Пятница, 03.05.2024, 06:41
Приветствую Вас Guest | RSS
Главная страница | Статьи | Регистрация | Вход
Меню сайта

Случайный рисунок

Категории каталога
Туториалы по маппингу (HL2) [68]
Туториалы по маппингу для Half-Life
Туториалы по текстурированию (HL2) [10]
Туторы по текстурированию для Half-Life
Туториалы по моделированию (HL2) [9]
Туторы по моделированию для Half-Life
Туториалы по программированию (HL2) [53]
Туторы по прагроммированию для Half-life
Другие туториалы (HL1 и HL2) [4]
Туторы которые не вошли в другие категории
Half-Life 2 Beta [1]
Статьи о npc и weapon в бете Half-Life 2, а так же мануалы и FAQ.
Туториалы по маппингу (HL1) [14]
Туторы по маппингу для Half-Life 1
Туториалы по текстурированию (HL1) [1]
Туторы по текстурированию для Half-Life 1
Туториалы по моделированию (HL1) [1]
Туторы по моделированию для Half-Life 1
Туториалы по программированию (HL1) [30]
Туторы по программированию для Half-Life 1

Наш опрос
Оцените мой сайт
Всего ответов: 632

Начало » Статьи » Туториалы по программированию (HL1)

Как пофиксить моргание монстров на движущихся платформах

Наверное все, кто хоть раз пытался поставить монстра на какой-нибудь лифт или поезд сталкивались с пренеприятнейшим явлением - монстр начинал моргать и дергаться. Данный глюк пришел к нам из хл 1.1.0.0 и так и не был пофикшен до настоящего времени.
Частично его устранили в спирите - в лифтах монстр ПОЧТИ не дергается, хотя на поездах продолжает моргать как ни в чем не бывало. Я не берусь точно установить причины этого глюка - возможно, что это как-то связано с переносом рендерера в клиент из движка. Итак вот мой путь решения данной проблемы (после фикса монстры абсолютно перестают моргать на любых движущихся поверхностях). Мое решение заключается в том, что когда монстр стоит на месте интерполяция для него отключена. Однако легко сказть - отключить интерполяцию, когда монстр стоит на месте - на самом деле четкого критерия тут нету. Так например есть
монстры, у которых pev->velocity всегда равна нулю и не зависит от скорости монстра. К тому же монстры могу еще поворачиваться, ускорение у них везде задается по разному и.т.д. Я подумал, что лучше всего использовать соответствующий флаг в самой анимации - флаг STUDIO_LX. Данный флаг есть в любой анимации движения обычного монстра, однако летающие монстры ее не используют, правда и на платформах они тоже не ездят  (предствьте себе например алиен_контроллера на поезде). Однако ближе к делу.
У летающих монстров есть флаг FL_FLY который и послужит нам критерием. Кстати незабудьте проставить его у нихиланта - у него данный флаг почему-то отстутствует. Найдте void CNihilanth :: Spawn( void ) и добавьте еще один флаг в pev->flags

 
pev->flags    |= FL_MONSTER | FL_FLY;

Я не проверял каждого монстра в отдельности, но если вы увидете, что к примеру ихитозавр
или там monster_leesh двигаются дерганно - просто поставьте им этот флаг и все пройдет.
Теперь собственно сам код. Откройте client.cpp и найдите функцию int AddToFullPack.
Замените в ней вот этот код

if ( !player &&
    ent->v.animtime &&
ent->v.velocity[ 0 ] == 0 &&
ent->v.velocity[ 1 ] == 0 &&
ent->v.velocity[ 2 ] == 0 )
{
    state->eflags |= EFLAG_SLERP;
}

на приведенный ниже
if(ent->v.flags & FL_FLY )
    state->eflags |= EFLAG_SLERP;
else    state->eflags &= ~EFLAG_SLERP;

Таким образом мы сообщим клиенту, что данная энтитя летающая и для нее нужно включить интерполяцию
Переходим на клиент. Откроем файл StudioModelRenderer.cpp и найдем в нем функцию StudioSetUpTransform.
Сначала нам надо получить доступ к флагам модели в анимции. Для этого создадим новую перменную.
Прокрутите код до условия if (m_pCurrentEntity->curstate.movetype == MOVETYPE_STEP)
и чуть ниже добавьте новую переменную:
if (m_pCurrentEntity->curstate.movetype ==MOVETYPE_STEP)
{
    float    f = 0;
    float    d;
    mstudioseqdesc_t    *pseqdesc;//acess to studio flags
    pseqdesc = (mstudioseqdesc_t *)((byte *)m_pStudioHeader
    + m_pStudioHeader->seqindex) + m_pCurrentEntity->curstate.
    sequence;

Теперь спуститесь ниже, до первого цикла с оригинами и замените его на вот такое условие.
C++ Source Code:
if (pseqdesc->motiontype & STUDIO_LX || m_pCurrentEntity-
    >curstate.eflags & EFLAG_SLERP)
for (i = 0; i < 3; i++) modelpos[i] += (m_pCurrentEntity->origin[i] -
    m_pCurrentEntity->latched.prevorigin[i]) * f;

Собственно говоря это и есть отключение интерполяции по оригину. Если монстр не двигается - значит
интерполяция отключена.
Компилируйте оба проекта. Демокарта прилагается



Источник: http://www.hlfx.ru/forum/showthread.php?s=08077d3c0f5c95eb3c499ca8c7341ced&threadid=15
Категория: Туториалы по программированию (HL1) | Добавил: DetLeR (16.08.2007) | Автор: Дядя Миша
Просмотров: 997 | Рейтинг: 0.0 |

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Кто в Онлайн

Друзья сайта

Баннеры

  Сайт CrazyArts   Black   Сообщество сайтов о Half-Life   Самый   Только   Все   hl2 top 100     Rambler's Top100  

игры
игры

  Каталог сайтов Планета Топ 100 - Planet Top 100       ТОП ЛУЧШИХ ИГРОВЫХ САЙТОВ           Detroit Team Site :: Моды от Detroit Team, видео, новости.   Naruto-kun[Звезда Наруто]  


The idea of dising: Homie7