Добрый день,
сейчас занимаюсь кое каким баловством, пробую на основе паранои сделать интересный шутер по монстрам, собственно там уже все есть и система готова (классы оружия и загрузка параметров)и т.д. но хочется приятных мелочей.
Дело такое, при отдаче (читай viewpunch) очень сильно страдает точность, это легкой наблюдается даже в кс, дело в том что реальный путь пули оказывается еще дальше чем предшествующий ему punch (в кс пули не летят в центр экрана даже если достигнут максимальный панч, при том что разброс (который vector_cone) сам по себе небольшой).
Кароче к чему я =) в Battlefield2 в скриптовом языке была команда BackOnRecoil то есть возвращение к исходному значению, так же как и в халве мы лишь делаем "удар" а потом постепенно возвращаем, компенсируем этот удар. Вопрос такой, в каком месте делается это "возвращение", его я почему то не знаю где искать. Возможно ли вместо панча делать простое передвижение центра экрана в какую нибудь точку (добавлением вектора), без каких либо компенсаций.
Возможно дело каким то образом завязано на магических буквах viewpos... кто знает )
Смотрел, но как я понял (может неправильно понял), но в хл есть угол обзора (текущий) и текущий же панч, в функции DropPunchAngle он просто меняет панч и со временем сбрасывает его до нуля. Самой передачи панча к обзору я как то не увидел.
извиняюсь что сам не разобрался (обычно сам разбираюсь), просто сейчас на работе пригрузили и голова не варит =).
Дядя Миша писал: не передачи, а прибавления. В view.cpp оно.
во view.cpp у нас 2 строчки добавления клиентовского и серверного панчей, т.к. у меня была параноя, там работал только серверный панч.
Если закоментить строку с прибавлением панча (в view.cpp) то экран дергаться не будет, но "физически" то есть на сервере пули будут подниматься как и раньше, поэтому нужно отрубать все панчи на сервере. (или в pm_четотам закоментить функцию droppunchangle)
Хочу отметить, прибавление панча к виду не несет никаких "физических" последствий на стрельбу и т.д., просто экран сдвигается в какую либо сторону, а физически вы стреляете туда где у вас был бы центр экрана если бы сдвига этого небыло. В этом большая проблема и "несостоятельность" того панча.
//-----------------------------------------------------------------
vec3_t viewangles;
float vrecoil = 0.6;// параметр скачка по вертикали
float hrecoil = 0.3;// параметр скачка по горизонтали
gEngfuncs.GetViewAngles( (float *)viewangles ); // берем текущую позицию вида и храним в переменной
viewangles[PITCH] -= vrecoil; // добавляем к переменной высоту скочка
viewangles[YAW] -= gEngfuncs.pfnRandomFloat(hrecoil*-1,hrecoil); // делаем рандомное вычисление от в какую сторону и на сколько будем делать горизонтальный скачок
gEngfuncs.SetViewAngles( (float *)viewangles ); // изменям текущий вид на тот что у нас в переменной.
//-----------------------------------------------------------------
Просто, но довольно симпатично играется.
Посмотрев как сделан панч в COD4MW2, увидил такую картину: там панч довольно сложный и складывается ощущение что он какой-то "составной"- из нескольких способов разных сделан. С одной стороны на некоторых пушках пули летят вверх постепенно как в вышеописанном коде, с другой стороны после отпускания кнопки стрельбы панч очень быстро возвращается на исходную позицию, кажется будто возвращение запускается только после отпускания клавиши стрельбы, в этом плане одиночные выстрелы все идут практически в одну точку, как бы быстро ты не стрелял, а когда зажимаешь вид сильно убегает вверх. Второе необычное это то что на некоторых пушках не такой сильный разброс и ствол просто бросает из стороны в сторону примерно в одном небольшом квадрате, притом складывается ощущение что панч общий состоит из "маленьких" и "больших", возможно это просто рандом от 0 до ЧИСЛА, но от большие подергивания выглядят так буд-то они возвращаются к исходной точке, а маленькие нет.
Как не странно, но вот вопрос отдачи для шутеров более менее реалистичных, это вопрос первой важности, и нужно придумать Систему в которой будет достаточно лишь указать необходимые параметры чтобы получить пушку такой какой нам надо, без лишнего кода.
во view.cpp у нас 2 строчки добавления клиентовского и серверного панчей, т.к. у меня была параноя, там работал только серверный панч.
В view.cpp только КЛИЕНТСКИЙ punchangle. И совершенно такой же punchangle на сервере, который находиться в pm_shared.cpp. В паранойе punchangle в pm_shared.cpp заменили на punchangle из HL2. А под клиент не сделали.
Если руки прямые, то можешь очень просто переделать серверный punchangle из HL2 в клиентский punchangle из HL2, по аналогии со старым punchangle.
А тебя я так и не понял, потому что многобукаф, а смысл не ясен. Что за система?
Чтобы было понятно что я хочу, расскажу что я собираюсь делать.
/*оффтоп
В планах у меня создание мода, который для игроков так же как и для custom девелоперов будет отличатся широтой возможностей. После довольно серьезных колебаний по поводу выбора движка, я все таки остановился на Source движке, потому что он все же более новый, и если правильно действовать и знать что делаешь, то его можно оптимизировать под старые компы (суть оптимизации - "вырезать" "лишнее", примерно то что делают в промоде, минимализм, олдскульный брашевый мэппинг).
Вот получается, к кодингу я хоть и не совсем глух, но и не хочу особо им заморачиваться, и в данном случае, код GoldSource игры мне знать не зачем. Конечно код Source SDK я изучать не планирую, буду искать буржуя подкованного в этой сфере, мое дело геймдизайн.
оффтоп закончен ) */
На данный форум я вышел с этой темой, потому что просто для фана кручу верчу параноевский SDK, и заодно пробую, на играбельность некоторые фичи. Дело ведь в том что особо хитрая и интересная панч система если такая будет написана, она пригодится в любом моде (даже в любой игре), поэтому я спросил вас, нет ли у кого нибудь наработок по панчам, нет ли у кого чистого интереса что-то с ваять? То что мне нужно, я сделаю сам, но вдруг кто-то знает что -то интересное и может поделится своими знаниями?
Последние две недели что либо сделать не получалось, потому что работа->деньги->еда =).
Что я не знаю:
1. gEngfuncs.GetViewAngles - вот хорошо бы найти лист большинства функций, можно даже без пояснения, чтобы знать что они есть, и не искать их в стоге сена.
2. Мне не совсем ясна работа кнопок, я понял основные принципы работы кнопок на сервере, но на клиенте фактически ничего такого нет. Мне нужна функция OnRelease любой кнопки (Атаки в нашем случае), именно момента когда её отпускают, а не состояния "не нажата".
3. GetViewAngles/SetViewAngles - вот эти функции они помогут нам работать с видом (view) игрока. Мне немного не понятны, почему разработчики халвы решили разделить панч на 2: "физический" для просчета куда летят пули и добавление смещения к view, но не самом смещение view. Суть в том что меняют эту переменную панч энгла, хотя могли напрямую менять ViewAngles, зачем?
4. Очень мне не ясна работа с векторами в DropPunchAngle, конкретно "смягчение"\"сглаживание" вектора, что бы он не моментально скакал туда - сюда.
//----------------------------------------
Что я имел ввиду под системой:
Во первых для каждой конкретной игры нужна своя система, я не знаком с Xash weapon system, слышал, и кажется мне... =)) что не то это что я имел ввиду.
Должна быть сложная функция или ряд функций, которые могли бы изменять view но с разными параметрами, к примеру:
- возвращать ли сделанный панч?
- На сколько возвращать сделанный панч (коэф.)
- скорость возвращения?
- когда возвращать сделанный панч (сразу, через время, после отжатия кнопки стрельбы).
- частота исполнения этого панча (для разнообразия)
- собственно размеры панча
- Сглаживание панча (или скорость передвижения экрана)
вот смотрите мы сделали такую функцию, и нам нужно сделать автомат у которого в основном идут небольшие невозвратные панчи и иногда проскакивали большие панчи с возвращением. С такой функцией задал параметры и все работает.
p.s. я сам смогу все это сделать, но нужна ваша помощь, по тем пунктам что я не знаю.
FaL_DissecTor писал: вот хорошо бы найти лист большинства функций, можно даже без пояснения, чтобы знать что они есть, и не искать их в стоге сена.
просто матом хочется орать.
в папку engine\cdll_int.h заглянуть никак?
Цитата:
FaL_DissecTor писал: Мне нужна функция OnRelease любой кнопки (Атаки в нашем случае)
cl_dll\input.cpp
Функции IN_blablaDown - это нажатие кнопки, а IN_blablaUp - соответственно отпускание.
Там же можешь увидеть, как эти события перехватывает код спектатора.
Цитата:
FaL_DissecTor писал: Суть в том что меняют эту переменную панч энгла, хотя могли напрямую менять ViewAngles, зачем?
А как ты потом извлечешь пунчангл из вьюанглесов?
Он же "гниёт" со временем. Т.е. угол отклонения с каждой секундой становится всё меньшы и меньшы пока не дойдет до нуля.
Цитата:
FaL_DissecTor писал: Очень мне не ясна работа с векторами в DropPunchAngle, конкретно "смягчение"\"сглаживание" вектора, что бы он не моментально скакал туда - сюда.
Дядя Миша писал: А как ты потом извлечешь пунчангл из вьюанглесов?
Он же "гниёт" со временем. Т.е. угол отклонения с каждой секундой становится всё меньшы и меньшы пока не дойдет до нуля.
Это как раз таки понятно (не совсем понятны конкретно вычисления, математика), и еще дело в другом.
Мы стоим и смотрим в стену (начальное положение), потом стреляем:
если выключен серверсайд панч то - пули будут лететь в начальное положение, в то время как экран поведен наверх (прицел будет выше чем летят пули)
если выключен клиент панч то вид вообще не сдвинется с места, а пули полетят наверх, выше прицела.
Так вот вопрос, зачем разделять панчи, почему просто не сделать панч только на клиенте а потом брать с клиента текущий viewangles и стрелять строго по нему? Ведь благодаря этому разделению не получается точного совпадения обоих панчей.
FaL_DissecTor писал: (не совсем понятны конкретно вычисления, математика)
Это очень просто:
Движок рисует сцену не мгновенно. На это тратится некоторое время, которое сохраняется в pparams->frametime. Те несколько милисекунд, которые прошли с момента отрисовки предидущего кадра.
Вот оперируя этим значением мы каждый кадр отнимаем по чють-чють.
C++ Source Code:
len = VectorNormalize ( ev_punchangle );
len -= (10.0 + len * 0.5) * frametime;
len = max( len, 0.0 );
Первая строчка - получаем общую длину нашего вектора (и одновременно нормализуем его до еденичных значений, зачем - поясню чють позже).
Затем мы делим длину вектора на два и прибавляем волшебное число 10.
Почему десять я не знаю, думаю подобрано эмпирическим путём, как наиболее оптимальная скорость возврата пунчанглов. И затем мы умножаем это всё на фрейм тайм, чтобы скорость возврата углов не зависела от текущего FPS. Иными словами, если сцена тяжкая и движок выдает всего 30 FPS, то и пунчанглы будут возвращаться намного медленнее, чего нам не нужно.
В третьей строчке мы проверяем, чтобы наша длина вектора не стала не дай бог меньше нуля, потому что в противном случае, игрока начнет раскачивать как маятник туда-сюда.
Ну и последнее - мы умножаем наш нормализованный вектор на полученную длину (которая уже меньше исходной).
Данный подход позволяет вообще не заморачиваться по какому именно углу у нас ненулевое значение, дабы избежать идиотских проверок
C++ Source Code:
if( ev_punchangle.x > 0 )
и тому подобного. Собственно процесс продолжается до тех пор, пока длина вектора не станет нулевой.
Насчет "пули летят не туда куда смотрит игрок" - дело в том, что положение прицела определяют cl_viewangles, которые отсылаются на сервер. viewangles влияют только лишь на положение экрана.
Спасибо большое, все понятно, теперь понял смысл умножения на frametime, ведь чем меньше фпс, тем больше frametime, а значит быстрее уменьшается punch, бесхитростно все так =). По cl_viewangles отдельное спасибо ).
p.s. Извиняюсь конечно за нубские вопросы, но действительно человеку не особо знакомому с кодерством, многие очевидные вещи кажутся не такими очевидными ).