Занялся механизмом рикошета при стрельбе. Естественно, подглядел образцы кода где можно, даже на бумажке алгоритм расписал. Когда выстреливается только одна пуля, она прекрасно рикошетит в цикле сколько нужно раз, хоть десять. Ну это чисто для теста, по задумке, после одного-двух рикошетов, кинетическая энергия пули падает, и цикл обрывается. Проблема в том, что когда рикошетят несколько пуль (см. дробовик), то отрикошетившие пули попадают в одну точку. Где ошибся, не знаю, вроде бы всё перепробовал. По смыслу, каждая новая пуля должна иметь свою собственную точку попадания после рикошета, а на практике, все последующие берут конечную точку попадания от самой первой. Может подскажете чего, товарищи форумчане?
Ну ты хоть алгоритм подробно распиши, что ли... У нас тут не битва экстрасенсов.
Ты точно правильно берёшь исходное направление пули? Это не просто v_forward игрока?
XaeroX писал: Ты точно правильно берёшь исходное направление пули? Это не просто v_forward игрока?
Завтра копну в этом направлении, спс.
Цитата:
XaeroX писал: Ну ты хоть алгоритм подробно распиши, что ли...
Я ещё сам попытаюсь разобраться, если не выйдет, кину кусок кода в тему.
Добавлено 19-11-2014 в 02:21:
Алгоритм такой:
Когда сила пули (iDamage) больше 10, то:
1. Если угол попадания трассы больше 60 градусов, то прерываем цикл.
2. Если энтитя, в которую мы попали, не брашевая, то прерываем цикл.
3. Проводим новую трассу из точки попадания под углом в столько же градусов, каков угол старой трассы относительно стены (короче, зеркально отражаем выстрел).
4. "Стреляем" в новом направлении, и делим iDamage пополам.
После первого рикошета всё повторятся до тех пор, пока угол попадания не станет больше 60 градусов, или iDamage не станет меньше 10.
GioHAUS0n писал: Мне помниться, что она может вернуться обратно стрелку с первого рикошета:
То-то меня бесит такое поведение при альтернативной атаке гаусса. Не, ну я могу такую гадость сделать, чтоб в 15 процентах случаев пулька рикошетила обратно, но это будет неимоверно бесить игроков. Я не спец в баллистике, но думаю, что рикошет обратно - это редкость.
Вроде справился с задачей, всё работает как надо. Перепилил код, добавил прострелы:
C++ Source Code:
1
// ============================
2
// ku2zoff: рикошет и прострелы
3
// ============================
4
choose_think: // выбор
5
if (iDamage > 12) // все операции проводим только если урон больше 12
В зависимости от того, как мы попали и во что попали, выбирается действие: рикошет или прострел. Действие выполняется, урон уменьшается в два раза. Возвращаемся к выбору действия. Там вычисляем угол и солид энтити согласно новым данным, которые остались после предыдущего действия, и цикл повторяется. Цикл прерывается, если урон становится меньше 12, или когда пуля попадает под углом больше 60 градусов в непростреливаемую стенку.
Ku2zoff писал: Я не спец в баллистике, но думаю, что рикошет обратно - это редкость.
Стрелять, не задумываясь о рикошете, как мы делаем в играх - в реале это редкость.
И я не совсем понимаю, для чего они тебе нужны. Весь мир стремится к упрощению механики игры, чтобы игрок мог чётко просчитывать свои действия (в этом смысл киберспорта). А ты вводишь прострелы (ну ок, их ещё можно просчитать в том же КС) и рикошеты, которые в реале, вообще говоря, непредсказуемы из-за микрорельефа. Какой следующий шаг? Рикошет с учётом карты нормалей?
Урон по идеи не должен тупо делиться на два, а уменьшаться в зависимости от толщины простреливаемого объекта. А то получится, что игрок будет наносить одинаковый урон, простреливая стену, и простреливая какую-нибудь брашевую периллу в 1 юнит толщиной.
А рикошеты — это очень интересно. В ARMA хорошо реализовали: https://www.youtube.com/watch?v=2mZNpurQj4U
На сколько я понял по коду, у тебя каждая пуля будет рикошетить если попадает под условие градуса? По-моему это перебор, и стоит добавить random (5-10% пуль будут рикошетить).
tolerance писал: По-моему это перебор, и стоит добавить random
Это ж пробный код. Конечно добавлю рандом. И углы рандомизирую.
Цитата:
XaeroX писал: Весь мир стремится к упрощению механики игры,
Вот так и родилось Press E to win. А вообще, я конечно уменьшу процент рикошетов. Ещё и зависимость от материалов введу. Вон, с бронёй и повреждением от разных видов видов урона очень интересно получилось. Там в зависимости от чего хочешь защититься в первую очередь, такую броню и юзаешь(ну шлем, жилет или щитки на руки-ноги, или всё вместе). Тоже пока в стадии разработки.
Добавлено 19-11-2014 в 18:22:
Меня сейчас больше беспокоит правильность работы этого кода. Вроде как норм пока, боюсь как бы неприятный баг какой не словить. Особенно меня смущает использование goto. Другого варианта пока не нашёл.
Если стремиться к реализму и хардкорности то надо делать: один выстрел - один фраг. Потому что в реале даже от одной пули 9мм можно убить особенно в голову.
Нет, так родились Quake1, Quake2 и Quake3. Именно поэтому в них играли, играют и будут играть ещё десятки лет, вот увидите.
А "Press E to win" - это выкидыш.