Войти
Box2DФорумОбщее

Перемещение автомобиля между полосами

#0
11:52, 7 дек. 2014

Доброго времени суток!
Механика игры представляет из себя раннер, что-то в Subway Surfers, но с автомобилем в главной роли, поэтому переход между полосами (Полосы горизонтальные) должен быть не мгновенным, плюс требуются более-менее честные столкновения. Изначально писал без физических движков, но научавшись со коллииями решил не писать велосипеды, а использовать готовые.

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

Сейчас остановился на варианте с MouseJoint, который подключен к автомобилю (A) и к центру полосы(B). но проблема в том что точка B не движется вместе с автомобилем, и я сдвигаю ее каждый кадр, между кадрами автомобиль успевает уехать вперед, и MouseJoint начинает ощутимо действовать в горизонтальной плоскости и этот вариант мне не нравится.

buss_and_mousejoint | Перемещение автомобиля между полосами

Сейчас вижу только вариант сделать свой тип джоинера (переделанный MouseJoint), который бы притягивал объект не к точке, а к вектору и направить этот вектор вдоль нужной полосы.

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


#1
12:32, 7 дек. 2014

Выброси физику и проблемы пропадут сами по себе. Определение коллизий AABB это 20 строчек кода, использовать для этого бокс2д - это забивание гвоздей микроскопом

#2
13:07, 7 дек. 2014

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

#3
13:32, 7 дек. 2014

Двигай через SetPosition. Тип тела установи в kinematic.

#4
14:23, 7 дек. 2014

>> Двигай через SetPosition. Тип тела установи в kinematic.
Ага, момент про кинетические тела я упустил. Попробую переделать в таком виде. Спасибо!

#5
16:50, 7 дек. 2014

Лучше использовать не импульс, а силу. И добавить демпинг, чтобы глушить остатки.

#6
2:32, 8 дек. 2014

Daemon19
> Двигай через SetPosition. Тип тела установи в kinematic.
не двигай через SetPosition. двигай по примерно такому закону:

 
vec dstVelocity = (dstPoint - body->pos) * velocityCoef;
vec force = (dstVelocity - body->velocity) * forceCoef;
body->applyForce(force);
по сути - то же самое, что упругость + вязкость, но более контролируемо.
#7
10:28, 8 дек. 2014

>> не двигай через SetPosition. двигай по примерно такому закону:
Я думал сделать тело как Kinematic и через задание линейной скорости "симулировать" ускорение и отдачу от столкновенний, а в крайних случаях, когда расстояние до нужно координаты будет меньше заданной скорости по вертикали, делать setPosition().

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

#8
21:24, 8 дек. 2014

Suslik
>> по сути - то же самое, что упругость + вязкость, но более контролируемо.

Отлично! Я делал похоже, но не вводил коэффицентов, в результате авомобиль приближался к полосе но постоянно уменьшал терял скорость и никак не мог приблизиться. Так просто шикарно.

Box2DФорумОбщее

Тема в архиве.