HLFX.Ru Forum
Показать все 21 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Разброс пуль (https://hlfx.ru/forum/showthread.php?threadid=1601)


Отправлено Drakulla 25-11-2008 в 17:55:

Half-Life Разброс пуль

{
// Мне нужен тутор по созданию ефекта разброса пуль ну как в контре -
када сидиш точно стреляет , чем больше двигаешся тем больше разброс при стрельбе . Можно еще и про отдачу .
}


Отправлено XaeroX 25-11-2008 в 18:20:

Что ты уже сделал в этом направлении? Какие идеи, наработки? Исходники поковырял?

__________________

xaerox on Vivino


Отправлено Drakulla 25-11-2008 в 18:34:

мне над для ознакомления


Отправлено XaeroX 25-11-2008 в 18:53:

Ты сам собираешься изучать СДК и разбираться с нашей помощью, или тебя интересует исключительно готовое?

__________________

xaerox on Vivino


Отправлено Drakulla 25-11-2008 в 19:34:

нет , меня интерисует сам код


Отправлено XaeroX 25-11-2008 в 19:36:

а... ну я такой код не встречал и сам не писал.

__________________

xaerox on Vivino


Отправлено FaL_DissecTor 25-11-2008 в 20:29:

Я начал с этого как раз таки. Но наверное из-за недостаточности знаний о том как там все действует и т.д.

Кароче говоря сначала то что я заметил в коде некоторых игр.
КС - Идут панчи, довольно просто - вверх, после какого-то момента несколько - из стороны в сторону. Сами же пули летят сами по себе, не похоже на разброс, такое ощущение что им уже описан путь с определенной вероятностью разброса. К примеру в той же параное - разброс делается чисто панчами+ разброс, и это не очень удобно с точки игры, слишком неудобно управлять таким разбросом. В кс же пули идут скорее всего по другому отдельно расчитанному вектору разброса, думаю там своя собственная функция разброса отличная от ХЛ-овской FireBulletPlayer (вроде).
А вот в сталкере к примеру разброс постоянен, изменяется модификаторами в режиме приседания, бега, прыжка. И панч идет простой - вверх (притом не возвращается). Такой разброс мне кажется сделать куда проще.

Что я попробывал сделать, но при этом кое какие баги есть (расхождение клиента и сервера скорее всего, пули летят в одном направлении, а декали рисуются в другом месте, где-то упустил вектор трассы который рисует декали).

Я сделал две функции довольно примитивного разброса.
void CAK47::SpreadItUp( void )
{
if (flSpreadInd >= 0.1) flSpreadInd = 0.1;
else flSpreadInd=flSpreadInd+0.02;
SpreadItDown();
}

void CAK47::SpreadItDown( void )
{

if (flSpreadInd==0.008)
{
pev->nextthink = gpGlobals->time + 5.0;
}
if ((0.008>=flSpreadInd) || (0.008 > flSpreadInd-0.1)) flSpreadInd=0.008;
else flSpreadInd=flSpreadInd-0.005;
SetThink( SpreadItDown );
pev->nextthink = gpGlobals->time + 0.2;
}

Соответсвенно в функции атаки
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, Vector( flSpreadInd, flSpreadInd, flSpreadInd ) , 8192, BULLET_PLAYER_762MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );

и в конце атаки SpreadItUp(); //spread increases
(какой тег для кода С++?)
Вроде работало, хотя уже и не помню сколько раз менял это дело, где-то точно работало, пробывал.

Есть идея создать немного другую функцию. Точнее изменить существующую.

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

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

Ну ещё приписать какой нибудь "модификатор движения" переменный коэфицент который менялся бы со сменой скорости и положения тела, а сам вектор из таблицы умножался бы на этот коэфицент(тем самым уменьшая разброс).

Ещё я не знаю как делать чтобы панч мог накладываться на предыдущий (в оригинале это только один раз происходит, то есть один скачек экрана, а следующий идет от центра опять же на то же расстояние). У Бузера в параное был этот кода, но там очень многобукаф +).

з.ы. У меня видюха погибла веселой смертью, и читать что либо, не то что код писать - ужасное действие, поэтому пока ниче не сделал. Ещё вопрос где согласование клиента с сервером на эту тему, отчего декали рисуются не там где надо.

__________________
Такие дела...


Отправлено Drakulla 26-11-2008 в 12:49:

ага , ясно


Отправлено Друг Alermana 26-11-2008 в 13:10:

Цитата:
Drakulla писал:
ага , ясно

И что тебе ясно??


Отправлено Drakulla 26-11-2008 в 14:48:

што ето дело мутное..


Отправлено Друг Alermana 27-11-2008 в 06:17:

Цитата:
FaL_DissecTor писал:
(расхождение клиента и сервера скорее всего, пули летят в одном направлении, а декали рисуются в другом месте, где-то упустил вектор трассы который рисует декали

Просто стандартные векторы на клиенте задефинены, а вабще первый выстрел всегда в цель это как то даже бесит.


Отправлено FaL_DissecTor 27-11-2008 в 20:01:

У меня появились вопросы.

SetThink( SpreadItDown );
pev->nextthink = gpGlobals->time + 0.2;

Такое оущущение что эта функция не повторяется, слямзил из кода рпг, так что не уверен что она верна для данного случая. Как сделать правильно? Я в перезарядке задал принудительное обнуление разброса. Сейчас разброс увеличивается но не сужается, только при перезарядке.

Vector( flSpreadInd, flSpreadInd, flSpreadInd ) - вот тут у меня вопрос. Это вектор и три координаты его x,y,z как я понял. Начну с того что когда я ставил множитель для каждой координаты то наблюдал странные эффекты. Точно не готов сказать что это 100% верно но наблюдал такие вещи.
первая отвечает не за верх-низ, вторая за лево-право, за что отвечает третья? Она влияет на разброс, притом что разброс серьезно меняется когда она равна 0.0 и 1.0.

следующий.
написал такую дребедень

//*******
if (IN_JUMP) PosMod=10.0;
else if (IN_RUN) PosMod=1.5;
else if (IN_DUCK) PosMod=0.1;
else PosMod=1.0;
//*******

Как поняли PosMod это float переменная - коэфицент положения, незнаю насколько верно, но вроде не хочет работать =). Взял тоже из бошки.

DefilerUnit
Как бы объяснить, стреляю я значит с пушки, трассы и декали рисуются в центре как у мп5 к примеру, а зомбей которые находятся слева и справа(хорошенько так справа) убивает.

__________________
Такие дела...


Отправлено Друг Alermana 27-11-2008 в 21:14:

Цитата:
FaL_DissecTor писал:
Как бы объяснить, стреляю я значит с пушки, трассы и декали рисуются в центре как у мп5 к примеру, а зомбей которые находятся слева и справа(хорошенько так справа) убивает.

ГЫ у стандартных векторов еще в плеере идет вычисление...


Отправлено XaeroX 27-11-2008 в 23:36:

Цитата:
FaL_DissecTor писал:
Взял тоже из бошки.

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

__________________

xaerox on Vivino


Отправлено FaL_DissecTor 28-11-2008 в 20:16:

XaeroX
эм косяк. Спасибо что указал, только я так и не пойму как правильно проверять на это условие (сам код). Это у меня развлекаловка, для себя, я не проггер, до всего приходится доходить самому или откуда-то тырить, если догадатся не получается. =)

ив я действительно не знаю отчего физ. полет пули отличается от графического. Физ. вроде нормально работает, а вот граф. только увеличивается.

__________________
Такие дела...


Отправлено XaeroX 28-11-2008 в 20:28:

Цитата:
FaL_DissecTor писал:
только я так и не пойму как правильно проверять на это условие

Ну как-то так:

if (m_afButtonPressed & IN_JUMP) PosMod=10.0;

т.е. как минимум какую-то переменную проверять надо.

__________________

xaerox on Vivino


Отправлено FaL_DissecTor 28-11-2008 в 20:50:

XaeroX
эмм так пробывал, никакой разницы, что сидя, что стоя, что в прыжке (я для приседа зделал 10х увеличение чтобы было сразу видно, никакого эффекта).

__________________
Такие дела...


Отправлено Ku2zoff 16-12-2008 в 12:34:

Итак, скорость игрока это pPlayer->pev->velocity.Length() Отсюда я сделал зависимость величины разброса от скорости движения.


Отправлено FaL_DissecTor 17-12-2008 в 19:52:

Ku2zoff Логично и скорее всего так сделанно в кс, там при попадании тебя отталкивает и точность сильно уменьшается. Ещё можно(?) вектор движения разложить на х,у и z, так вот по z добавляеть еще разбросу побольше =).
Но правда он как был постоянный, постоянным и останется =) а интерестно было бы увидеть код панчей примерно как в параное с пояснениями и собственно самого разброса приблизительно как в КС (уж очень он там хитрый, не простой).

__________________
Такие дела...


Отправлено Ku2zoff 31-12-2008 в 17:55:

>>Ещё я не знаю как делать чтобы панч мог накладываться на предыдущий

В хл панчи сделаны на клиенте, они не могут накладываться так. Но если их сделать на сервере, то всё будет норм. Ствол будет задираться вверх как в Day of Defeat или STALKER.

C++ Source Code:
m_pPlayer->pev->punchangle.x += 10;

в праймэри или сэкондэри аттак.


Отправлено Дядя Миша 31-12-2008 в 19:17:

>>В хл панчи сделаны на клиенте, они не могут накладываться так.
ну-да, ну-да
angles игрока ведь передаются обратно на сервер - кто же мешает приплюсовывать punch к нему?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 03:42.
Показать все 21 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024