[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: connect  
pff.clan.su - Форум » Игра NFK » NFK [R2] » Физика (Перышкин, Родина; Москва "Просвещение" 1989)
Физика
connectДата: Чт, 2009-10-15, 23:23 | Сообщение # 1
Активный участник
Группа: Модераторы
Сообщений: 204
Награды: 1
Статус: Offline
Открываю еще один топик, куда хотелось бы локализовать измыления, какающиеся физической модели игры.

Прежде всего, конечно, разговор пойдет о распрыге, как о самой животрепещущей теме. Позже я расскажу как он устроен и как на него можно влиять.

  • Физика НФК Часть 1 : http://pff.clan.su/forum/26-436-8833-16-1255694474
  •  
    connectДата: Пт, 2009-10-16, 16:01 | Сообщение # 2
    Активный участник
    Группа: Модераторы
    Сообщений: 204
    Награды: 1
    Статус: Offline
    Итак, предстоит длинный заумный пост, рассказывающий об устройстве физики в игре, актуальной к версии 068R2. Ленивым просьба не тратить время wink

    Остальным посоветую вооружиться чашечкой кофе, кружечкой чая или бутылочкой пива по выбору. Пристегнулись. Поехали.

    Часть Первая
    редакция 3

    Пожалй начну с того, что перечислю основные переменные и константы, учавствующие в процессах, о которых далее пойдет речь.

    Переменные:
    TPlayer - класс, в котором прописываются все основные свойства игрока
    (
    inertiaX, inertiaY - импульсы влияющие на движение модельки игрока в пространтсве. Далее - инерции.
    x, y - координаты игрока в пространстве
    speedjump - счеткик прыжков распрыга игрока.
    injump - микрозадержка для того, чтобы не было двойного срабатывания за один прыжок.
    speed - тут я просто храню текущую скорость игрока, для справки.
    dir - (от direction) показатель стороны куда мы смотрим и как мы это делаем. 0 или 1 - бежим влево или вправо соответственно. 2 или 3 - стоим и пялимся влево или вправо соответственно.
    )
    players - массив игроков типа TPlayer.
    players[0]. - обращение к конкретному игроку.
    id - в данном случае индекс игрока, к которому мы обращаемся при переборе.
    Другими словами players[id]. - это игрок, которого мы сейчас обсчитываем.

    Константы:
    GRAVITY = 0.02 - гравитация.
    PLAYERINITSPEED = 3 - начальная скорость игрока.
    PLAYERMAXSPEED = 5 - максимальная скорость игрока.

    Дебажные константы:
    DEBUG_SPEEDJUMP_Y = 0.012 - множитель распрыга, влияющий на вертикальное смещение.
    DEBUG_SPEEDJUMP_X = 0.33 - множитель распрыга, влияющий на горизонтальное смещение.
    DEBUG_SPEEDJUMP_MAX = 7 - Тут меня верно поправил Rh. Поэтому я опишу другими словами Эта константа определяет максимальное количество прыжков распрыга, при которых идет набор скорости. При его достижении скорость более не увеличивается, а остается постоянной.

    Пару слов об инерциях.
    Для удобства, буду называть их ниерцияУ и инерцияХ. ИнерцияУ это как пинок под зад wink Точнее сила этого пинка. Пока она больше ноля, мы летим вверх, но она постепенно уменьшается и, уходя в минуса, тянет нас к земле. ИнерцияХ толкает нас вправо, если она положительна и влево, если она меньше ноля. Получать инерции игрок может как от зажатия кнопок движения, так и от внешних факторов (попадание пули, взрывная волна, джамппад,...).
    Забегая вперед скажу, что именно инерции определяют величину смещения модельки игрока между тиками. Инерция в игре максимально может быть близкой к 5. Все что больше пяти обрезется. В случаее инерции равной 6 и больше, начинаются системные ошибки.

    Переходим к водным процедурам.
    Самой главной процедурой нфк является DXTimerTimer, этот кусок кода срабатывает при каждом "тике" игры, а это несколько раз в секунду. Почти весь игровой процесс протекает либо в ней самой, либо в вызываемых из нее процедурах.

    В алгоритмах обсчета физики игрока участвуют несколько процедур, та что пересматривает смещение игрока в пространстве имеет имя "playerphysic". Она вызывается из PredictNetworkPlayerPos при прогнозировании координат игрока в сетевой игре. Но главным местом ее вызова является процедура playermove.

    Но расскажу для начала про playerphysic, а уж потом вернусь к playermove, чтобы картина выглядела понятнее.

    playerphysic
    В самом начале playerphysic в переменные defx и defy запоминаются текущие координаты игрока. Что бы иметь под рукой значения предшествующие влиянию процедуры. Далее на инерциюУ влияет прежде всего гравитация :

    Code
    players[id].InertiaY := players[id].InertiaY + (Gravity*2.80);

    2.80 - величина постоянная. Gravity, как уже было упомянуто = 0.02 и тоже во время выполнения программы не меняется.

    После этого идет проверка, мол если вертикальная инерция между -1 и 0, то она делится на 1.11

    Code
    if (players[id].inertiay > -1) and (players[id].inertiay < 0) then players[id].inertiay := players[id].inertiay/1.11 // progressive inertia

    В другом случае, при условии, что инерцияУ больше ноля но меньше максимальной скорости, то она умножается на 1.1
    Code
    else if (players[id].inertiay > 0) and (players[id].inertiay < PLAYERMAXSPEED) then players[id].inertiay := players[id].inertiay*1.1; // progressive inertia

    Эти действия позволяют сделать иллюзию ускорениие импульса прыжка, его затухание и ускорение свободного падения. При положительной инерции мы резво взлетаем вверх (*1.1). Когда инерция иссякает, мы зависаем на пике(/1.11) и, в падении отрицательная инерция с каждым тиком ускоряется (+Gravity*2.80).

    Так работает изменение инерции по вертикали, но есть еще и горизонталь. ИнерцияХ принимается во внимание, если она по модулю больше 0.2 (т.е. больше 0.2, при движении вправо и меньше -0.2 при левостороннем движении). Если инерцияХ меньше, она обнуляется, считается, что игрок больше не перемещается по горизонтали. Вместе с тем же впервые дает о себе знать наличие распрыжки, тем что также обнуляются,ведь мы отановили свое вдижение.

    Вернемся к существенной инерцииХ. Если мы больше не жмем движение (dir = 2 или 3) тогда высчитывается торможение.

    Code
    если мы стоим на земле - players[id].InertiaX := players[id].InertiaX / 1.14
    в противном случае, мы в воздухе - players[id].InertiaX := players[id].InertiaX / 1.025

    Т.е. коеффициент трения в нфк равно 1.14 , а сопротивления воздуха 1.025 wink

    Тут же почему-то выссчитывается скорость торможения трупа

    Code
    if(players[id].dead > 0 ) and (isonground(players[id])) then players[id].InertiaX := players[id].InertiaX / 1.03;

    Трупы в нфк - существа особые, трение на них влияет иначе, а сопротивление воздуха и подавно уже не колышит. Это и понятно, им уже действительно все равно.

    Внимание! Здесь мы подошли к очень важному моменту, т.к. именно тут параметры распрыга влияют на игрока. Если количество зачисленных как распрыг прыжков больше одного (players[id].speedjump > 1), тогда физика претерпевает изменения.

    Code
    players[id].inertiay := players[id].inertiay + (players[id].speedjump * DEBUG_SPEEDJUMP_Y);

    и в зависимости от того, в какую сторону мы прыгали, либо налево
    Code
    players[id].x := players[id].x - (players[id].speedjump * DEBUG_SPEEDJUMP_X)

    либо направо
    Code
    players[id].x := players[id].x + (players[id].speedjump * DEBUG_SPEEDJUMP_X)

    И только после этого инерции влияют на новые кординаты игрока

    Code
    players[id].y := players[id].y + players[id].inertiay;
    players[id].x := players[id].x + players[id].inertiax;

    Еще раз подчеркну одну особенность. DEBUG_SPEEDJUMP_Y влияет на инерциюУ, а DEBUG_SPEEDJUMP_X напрямую на players[id].x

    Тут видимо необходима историческая справка.
    Изначально я делал распрыг, основываясь только на модификации инерции. Но результаты тех дней были настолько разительно неправдоподобны, что я придумал, как отделить распрыг от влияния торможения и ускорения. Придавая большую инерцию, я получал большой рывок, но практически мгновенное его затухание, что приводило к ущербным подергиваниям модельки.

    Дальше идут не столь важные в нашем случае проверки на препядствия и нахождение в жидкостях. Упомяну лишь, что во всех случаях кроме столкновения с потолком, счетчик распрыгов обнуляется, что в свою очеред обнуляет и влияние распрыжки. Обнуляются также и инерции в зависимости от того было ли столконовение с горизонтальной плоскостью или вертикальной.

    Сделаем паузу, скушаем твикс и хлебнем топлива, если кто зачитался и забыл это сделать. Дальше.

    Playermove
    Вернемся к playermove. Напомню, что playermove "главнее", чем playerphysic так как она вызывает последнюю, а не наоборот. Поэтому действия перечисленные тут, по времени выполнения будут предшествовать всяческим смещениям, происходяжим в playerphysic.

    Итак, вначале там идет всякое бла-бла-бла, а потом дикое условие (тут надо поднапрячься):
    Если зажат "moveup первого игрока" И мы - первый игрок ИЛИ зажат "moveup второго игрока" И мы второй игрок, ТОГДА при условии что мы НЕ В ПРЫЖКЕ, ровно как если мы тупо прыгающий бот, следующий код будет выполнен. Фухх. Говоря простым языком, дальше кусок кода выполнится только для того, кто прыгает.

    А если мы в воде или лаве - обнулить распрыжку нафиг, ибо как это. о_О

    Потом идет второе дикое условие, что б уж наверняка. Если при всем вышеупомянутом зажата кнопка движения, соответствующая направлению нашего прыжка И мы не в присядке, то в конце концов, счетчик распрыга увеличиться. Наконец-то.

    А если вдруг все вышеперечисленные условия не удовлетворены, распрыжка также уходит в ноль, т.к. это значит, что мы явно делаем что-то не то.

    Так, ага, счетчик распрыга мы крутанули. Потом, мы вызываем уже известную нам playerphysic и идем дальше.

    Ниже, в числе все прочего бла-бла-бла встречается еще и такая строка как

    Code
    if (isonground(players[i])) then players[i].inertiay := 0; // really nice thing :)

    Как бе намекающая, что если мы на земле, вниз нас уже тянуть не надо. Я пробовал ставить -1. Эффект примерно такой, как если бы пол подбрасывал нас.. землятрясение и только. wink


    Сообщение отредактировал connect - Пн, 2009-10-19, 09:52
     
    connectДата: Пт, 2009-10-16, 17:37 | Сообщение # 3
    Активный участник
    Группа: Модераторы
    Сообщений: 204
    Награды: 1
    Статус: Offline
    Лирическое отступление:

    Большое спасибо Битнику, за то, что он сделал видео распрыжки из 075, с выведенными через бот.длл показателями инерции. Я просматривал это видео покадрово и выписал присваемые игроку инерции в начале каждого прыжка.
    инерцияУ : 2.900 2.844 2.499 2.099 1.899 1.643 1.499
    инерцияХ : 2.999 3.329 3.799 4.099 4.400 4.800 5.199
    На основе этих данных я и выводил коэффициенты для 068R2

     
    RhДата: Пт, 2009-10-16, 20:34 | Сообщение # 4
    Участник
    Группа: Модераторы
    Сообщений: 148
    Награды: 4
    Статус: Offline
    Народ, тема создана для распрыга и всего, что с ним связано (физика, мувинг - как хотитие).
    .
    Тестируем, подбираем параметры (из доступных). Пишем, что нравится, что не нравится и почему. Чего не хватает, что работает не правильно и т.п.
    .
    Нужно ли подгонять распрыг максимально к 075 или можно остановиться на чем то менее похожем на него? (по результатам тестов и настроек).
    .
    Возможно у кого то есть идеи по альтернативному распрыгу и мувингу (например, распрыг, получаемый при раскачивании прицела и т.п.) - пишите. Возможно побдерем что-нибудь толковое.

    Физику (мувинг, распрыг) нужно доделать в первую очередь и по возможности окончательно, что бы к этому уже не возвращаться. Т.к. на физике завязано все остальное - и постройка карт и параметры оружия, да почти все.

     
    connectДата: Пн, 2009-10-19, 09:45 | Сообщение # 5
    Активный участник
    Группа: Модераторы
    Сообщений: 204
    Награды: 1
    Статус: Offline
    Вчера в разговоре с psy пришла мысль сделать доступными для изменения коэффициенты торможения.

    Однако они влияют только на смещение по горизонтали.

     
    EnforcerДата: Пн, 2009-10-19, 10:57 | Сообщение # 6
    Инжинер
    Группа: Модераторы
    Сообщений: 1161
    Награды: 9
    Статус: Offline
    Сделайте как было - замутите сброс скорости при отпускании кнопки вверх - с этими настройками будет вроде какраз то )

     
    RhДата: Пн, 2009-10-19, 14:39 | Сообщение # 7
    Участник
    Группа: Модераторы
    Сообщений: 148
    Награды: 4
    Статус: Offline
    Обратите внимание, сейчас в Р2, если отпустить прыжок и продолжать бежать (по прямой) распрыг не сбрасывается. Т.е. можно бежать со скоростью максимальной распрыжки. Или набрать распрыг в 2-3 прыжка, потом пробежать какой то участок (например без низкого потолка), а потом опять начать прыгать и набирать распрыг не с нуля а уже с 3-4 прыжка соответственно.
    Кто за, кто против? Считаю, что это добавляет контроля распрыжке и плохого в этом нет.
    Соответственно, если сделать сброс распрыжки на отпускание прыжка, то "контролить" не получится. Сейчас распрыг сбрасывается при нажании приседа. Считаю этого достаточно.

    Quote (connect)
    Вчера в разговоре с psy пришла мысль сделать доступными для изменения коэффициенты торможения.

    Кон, я уже говорил, что в Р2 сейчас распрыг какой то дерганный.
    С Псаем когда говорили, то оба отмечали, что при распрыжке моделька в полете как бы проваливается. Отсюда и дергание. Очень заметно по распрыгу на прямой в сравнении с 075. В 075 намного плавнее.
    Может появится идея от чего это зависит.
     
    EnforcerДата: Пн, 2009-10-19, 15:00 | Сообщение # 8
    Инжинер
    Группа: Модераторы
    Сообщений: 1161
    Награды: 9
    Статус: Offline
    Quote (Rh)
    Отсюда и дергание. Очень заметно по распрыгу на прямой в сравнении с 075. В 075 намного плавнее.

    ОЧень хорошо что заметили... Да действительно так... в этом есть корявость которая и в тфк есть толька там более жосткая корявость...

    вот... Насчет контроля распрыга то в нфк 075 это довольно добро получается... контролить распрыг не получится если надо нажимать ещё одну конопку дополнительно... Когда бежишь на это нетвремени и неудобно толи дело просто отпустил прыжок и скорость вернулась на прежнюю !!! ТАК ПРИВЫЧНЕЕ


     
    RhДата: Пн, 2009-10-19, 19:10 | Сообщение # 9
    Участник
    Группа: Модераторы
    Сообщений: 148
    Награды: 4
    Статус: Offline
    Quote (Enforcer)
    ОЧень хорошо что заметили... Да действительно так... в этом есть корявость которая и в тфк есть толька там более жосткая корявость...

    Хотел сказать что этим дерганием сейчас напоминает ТФК, но не стал. Действительно похоже (в плохом смысле), но в ТФК еще жестче.

    Quote (Enforcer)
    Когда бежишь на это нетвремени и неудобно толи дело просто отпустил прыжок и скорость вернулась на прежнюю !!! ТАК ПРИВЫЧНЕЕ

    Когда это успели прывыкнуть? В 075 сброса распрыга при отжатии прыжка нет.

    Кстати, Коннект, опиши тут свои идеи по изменению мувинга, которые ты хотел изначально, если не передумал.
    Альтернативный распрыг (зависящий от движений прицелом), изменение или контроль высоты прыжка и т.п.
    Народ пообсуждает, потом решишь уже - стоит/не стоит заморачиваться.
    Потому как меньше всего хочется делать, тем более хорошо (а это в любом случае долго), то что потом все равно придется переделывать.
    К остальным это тоже относится - альтернативные распрыги, мувинг в целом и т.п. Может будут толковые идеи.

     
    connectДата: Пн, 2009-10-19, 23:03 | Сообщение # 10
    Активный участник
    Группа: Модераторы
    Сообщений: 204
    Награды: 1
    Статус: Offline
    Quote
    Кстати, Коннект, опиши тут свои идеи по изменению мувинга

    Мысль такая, сделать базис = 075, остальное делать в качестве мода. Сюда же будет относится и новая физика.

    А конкретно:
    Увеличить гравитацию, что позволит снизить высоту прыжка и ускорить перемещение. Больше аркадности.
    Перейти от вертикальных карт к горизонтальным, что позволит воплощать в картах более реальную архитектуру. Меньше платформенности.
    Снять ограничение квадратности, перейдя к полигонам вместо бриков, что позволит не терять скорость на "ступеньчатых подъемах".
    Повышение контроля в воздухе, через прыжок с приседанием, который уменьшает высоту кривой.

    Но это все из разряда мечтаний. Чем дольше путь до 075, тем меньше сил на все остальное.

     
    pff.clan.su - Форум » Игра NFK » NFK [R2] » Физика (Перышкин, Родина; Москва "Просвещение" 1989)
    • Страница 1 из 3
    • 1
    • 2
    • 3
    • »
    Поиск: