Решение проблемы с обработкой столкновений

Сообщение Решение проблемы с обработкой столкновений
» 20 сен 2013, 04:37

Как-то раз я задался вот таким вопросом: viewtopic.php?f=7&t=1127
На что никто не дал ответа. Что ж... мне это было необходимо, поэтому я всерьез озадачился. Долгое время казалось, что это невозможно, но...

Начнем с маленькой теории. Как С2 обрабатывает столкновения?
И так, допустим у нас есть пуля, размер которой составляет 4х4 пикселя.
Есть стена ширина которой 2 пикселя (т.е. в 2 раза меньше ширины пули).
Есть событие, что если пуля сталкивается со стеной - она останавливается.
При этом скорость пули составляет 100 пикселей в секунду.

Допустим, скорость игры составляет 60 кадров в секунду.
Давайте посчитаем, сколько пикселей пролетит пуля за 1 кадр (за 1 тик)?
100/60 = 1,6

Теперь вспоминаем нашу ситуацию. Ширина стены = 2 пикселя, Ширина пули = 4. Скорость пули за 1 кадр = 1,6. 1,6 меньше, чем 2, а 4 больше чем 2. Значит при частоте кадров в 60 fps, при скорости 100 пикселей/сек наша пуля ГАРАНТИРОВАННО воткнется в стену.

А что если кадров меньше? Намного меньше! 10 fps. Считаем:
100/10 = 10. Т.е. прикиньте, за 1 кадр пуля перемещается на 10 пикселей.
10 больше чем 2 и даже больше чем ширина пули. В этом случае пуля с 90% вероятностью просто перепрыгнет мимо стены и полетит дальше!!! Почему не со 100% вероятностью? Просто это зависит от расстояния между пулей и стеной... если это расстояние равно 10и - то тогда да, врубится.

Почему? Потому, что С2 проверяет все события только кадр за кадром, тик за тиком!
Один кадр - это один шаг в игре. Не шаг персонажа, не шаг пули, а вообще шаг всей игры.
Если в игре мы задали скорость пули в 100 пикселей в секунду - так и будет, каждую секунду она перемещается на 100 пикселей, вот только проверяться условия будут лишь максимум 60 раз в секунду, а не 100 и не 1000. То есть когда придет пора проверить столкновение - пуля уже может переместиться на приличное число пикселей дальше объекта и движок подумает, что столкновения не произошло.

Эти 60 кадров не просто то, что мы видим, это 60 проверок событий в секунду! Поэтому если события тяжелые или их очень много - то процессор не успевает... и на проверку одного тика(кадра) требуется больше времени, что приводит к понижению FPS.
Частота кадров зависит не только от игры, но и от системы в целом. Некоторые могут играть и при этом рендерить видео на 3D-Max и их fps может отличаться от fps игры на свободной от лишних просчетов машине.
Поэтому частота кадров - это штука непредсказуемая. У кого-то пуля всегда врубится в стену, а у кого-то она всегда будет лететь мимо. Что делать в данном случае? Смотрите исходник!
speed.capx
(80.28 КБ) Скачиваний: 828
Большое спасибо всем, кто пишет мне респекты в ЛС! Очень рад, что до сих пор мои советы, примеры и уроки пользуются спросом... Но, к сожалению, я уже давно не занимаюсь разработкой игр и программированием вообще, поэтому я уже не лучший советчик в этом деле, да и времени совсем нет. Здесь на форуме я уже практически не бываю, но всегда открыт для общения в ВК: vk.com/virusfun
Но хоть меня здесь почти нет, мне все равно будут приятны ваши отзывы и плюсы [+]
Аватара пользователя

Игродел
Сообщений: 893
Я тут с 23 сен 2012, 14:51
Откуда: Хабаровск