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

Залипание на стенах (2 стр)

Страницы: 1 2
#15
3:17, 29 авг. 2013

s3dworld
> главное появился кое какой неприятный эффект в момент передвижения в одну
> сторону, потом в прыжке меняем направления и в результате в момент приземления
> мы скользим на месте какое-то время

У тебя в коде управление стоит так :
- если зажали влево - то крутим шарик (если на земле) и тянем его (в воздухе)
-если отпустили влево - то перестаем тянуть его (если на земле) и перестаем тянуть (если в воздухе),
а вдруг он крутится еще?
Кто будет останавливать вращение?
Я код внимательно изучил - так вот - контакты там определяются в post методе - т.е. будет кадр - когда контактов нет - а он уже на земле - в итоге - твоя скорость вращения и дает тот неприятный импульс. Просто поставь везде условия - что если в полете - скорость вращения = 0. А лучше ее вообще запретить.

И зачем юзать шарик - если коробка отлично справится с таким платформером?


#16
5:13, 29 авг. 2013
И зачем юзать шарик - если коробка отлично справится с таким платформером

Круг однозначно не хуже. Имеет даже преимущества. Он не будет спотыкаться и застревать на небольших стыках/выступах на земле, легче поднимается в горку.
Только я бы его вообще не вращал. Сделал бы фиксированный угол. А силы применял так же, как раньше к коробке через setLinearVelocity().

s3dworld
С таким радиусом и плотностью динамический объект должен весить около 3.5 кило (пи*радиус^2*плотность). Можешь проверить через mBody.getMass().

с учётом прочитанного: 0 - статический объект, 1 - динамический.

Сомневаюсь, что так написано в официальном туториале.

не нормальные значения и на что их заменить

я бы, во-первых, сделал вес енеми около 70, изменив плотность на 20. Маленькие объекты могут залипать при контакте с большими из-за трения.
fixtureDefEnemy.density=20.0f;

Во-вторых, выставил гравитацию земную. 10 хотя бы.
b2World world(b2Vec2(0.0f,10.0f));

В-третьих, зачем крутить то, что не крутится?
bodyDefEnemy.fixedRotation=true;
pBodyEnemy->SetAngularVelocity(-10.0f);

В-четвертых, трение
The friction parameter is usually set between 0 and 1
fixtureDefEnemy.friction=0.6f;      // Трение

#17
6:35, 29 авг. 2013

s3dworld
> Подскажите, где у меня выставлены не нормальные значения и на что их заменить?
> Потому что при установке трения для горки, персонаж по ней лазает как надо, но
> с другой её стороны просто взбирается по стенке.
У тебя он взбирается по стенке потому, что у неё есть сила трения, так как у тебя горка - один треугольник с силой трения 0.2f. Лучше сделай два прямоугольника (или какие-нибудь многоугольники): 1)Наклонная поверхность горки с силой трения 0.2f; 2) Поверхность горки, которая справа :), поставь у неё силу трения 0.0f.

s3dworld
> И главное появился кое какой неприятный эффект в момент передвижения в одну
> сторону, потом в прыжке меняем направления и в результате в момент приземления
> мы скользим на месте какое-то время. Посмотрите это на видео:
Ну, исправь это так, как сказал fzr125, то есть если персонаж в воздухе, то запрети ему вертеться и поставь SetAngularVelocity(0.0f).

Должно получиться примерно так: http://youtu.be/ej-sydjnbKw

#18
10:17, 29 авг. 2013

fzr125
> Просто поставь везде условия - что если в полете - скорость вращения = 0. А лучше ее вообще запретить.
Добавление pBodyEnemy->SetAngularVelocity(0.0f) в то место, где определяется что у персонажа нет контактов решает проблему со скольжением (или как там правильно было бы объяснить: в общем он немного назад проскальзывал). Правда теперь он какое-то время на месте замирает и потом только двигается дальше. А нужно было бы, чтобы он непрерывно двигался.

Snorkasnork
> С таким радиусом и плотностью динамический объект должен весить около 3.5 кило
Да, выдаёт 3.57443476. Изменил значения.

Сейчас все перемещения сделал на SetLinearVelocity(). В момент держания влево (аналогично и в право, только значение положительное):

+ Показать

И в момент отжатия (одинаково для обеих направлений):

+ Показать

И когда персонаж имеет почву под ногами и мы его не двигаем (чтобы по горке не съезжал):

+ Показать

Получается вот что:

+ Показать

Обратите внимание что когда персонаж останавливается на горке, он почему-то подпрыгивает. А этого бы не хотелось. При этом когда он идёт с горки, он идёт не по ней, а как бы будто гравитация не успевает его к ней притянуть. Ну и залипание на горке со стороны её стены.

VoinC++
Видимо горку и другие объекты так и придётся составлять из деталей.

#19
11:37, 29 авг. 2013

s3dworld
> Обратите внимание что когда персонаж останавливается на горке, он почему-то
> подпрыгивает.
Он подпрыгивает потому, что ты применяешь к нему SetLinearVelocity(b2Vec2(-10.0f,pBodyEnemy->GetLinearVelocity().y)). Если хочешь, чтобы он не подпрыгивал, то придётся скорость по оси OY направлять вниз, перпендикулярно к наклонной поверхности горки... А чем тебя не устраивает установка скорости вращения(то есть SetAngularVelocity)?

s3dworld
> Видимо горку и другие объекты так и придётся составлять из деталей.
Лучше сделай, какой-нибудь небольшой редактор мира и в нём по-быстрому создавай карту, потом сохраняй её в текстовый документ и считывай в своей игре:).

#20
12:11, 29 авг. 2013

VoinC++
> А чем тебя не устраивает установка скорости вращения(то есть SetAngularVelocity)?
Когда у меня было всё на SetAngularVelocity(), то при движении вправо, затем прыжке и в воздухе движении влево, когда я приземлялся, у меня персонаж тянуло вправо. Он даже не скользил на месте, его немного тянуло вправо, а затем отпускало. То есть применялось вращение и оно сохранилось и использовалось когда приземлились. Я устанавливал SetAngularVelocity() в 0.0f когда определял что нахожусь в воздухе. При этом меня больше не тянуло вправо, но появилась другая проблема: в момент приземления персонаж скользил на месте и потом только двигался. То есть получалось будто ему надо было набрать скорость (вращение или как там). Мне же надо чтобы он без замедления двигался, то есть с воздуха он упал или нет, чтобы без перерывов двигался в указанную сторону.

> Лучше сделай, какой-нибудь небольшой редактор мира и в нём по-быстрому создавай карту, потом сохраняй её в текстовый документ и считывай в своей игре:).
Редактор будет. Просто пока тестово изучаю возможности Box2D и смотрю можно ли мне его себе на пользу применить.

Вообще я с этой физикой уже запутался. Сделаешь что-то, появляется баг в одном. Исправишь это чем-то, появляется другой баг. Его заделаешь, открывается предыдущий. Поэтому лучше опишу то, что мне надо:

  1. На экране персонаж не должен наклоняться.
  2. Предпочтительно лучше если его форма будет прямоугольной. С кружками остаётся свободное расстояние при столкновении со стенами, если описывать круг по высоте. Возможно эту проблему можно решить если для столкновения по высоте использовать круг по высоте, а для горизонтали - круг по горизонтали. Но описывать два динамических объекта для одного персонажа - я не знаю, разве это правильно?
  3. Чтобы персонаж сразу же передвигался когда я нажимаю кнопку. В принципе будет ли у него небольшой разгон или нет - это не так важно.
  4. Чтобы персонаж мог сразу остановиться при отпускании клавиши. ну или по крайней мере делал это очень быстро.
  5. Чтобы перемещение персонажа не влияло на то, находится ли он в воздухе, или на земле.
  6. Чтобы когда он поднимался на горку, он не прыгал по ней ни в момент перемещения, ни в момент когда останавливается.
  7. Чтобы он спускался по горке не в виде отскока и плавного притягивания гравитации к ней, а в виде взаимодействия с горкой (не знаю как этот момент правильно объяснить: в общем нужно чтобы его ноги были на горке).
  8. Чтобы когда он идёт по горке и совершает прыжок, то высота его подскока было ровно больше на такое расстояние, на которое он успел забраться на горку, в отличии от подскока с земли. То есть если он с земли может прыгнуть 2 метра в высоту, но когда он заберётся на горку на высоту 5 метров, то сможет прыгнуть уже на 7 метров в высоту. Просто у меня получалось с зорки прыгать в несколько раз выше чем с земли (именно в момент движения), не знаю, может он от горки энергии получил много.
  9. Ну и ещё действительно ли придётся горку разбивать на 2 объекта чтобы по самой наклонной можно было ходить, а по вертикальной поверхности не лазить? Просто Snorkasnork написал что это быдлокодовское решение, если разбивать объект на две части. Но как другим способом решить проблему?
#21
12:17, 29 авг. 2013

Сейчас же пока код такой:

+ Показать

Получается так:

+ Показать

Заметьте, что когда я двигаться вправо и при этом вроде одновременно нажимаю кнопку прыжка и отпускаю клавишу движения вправо, то персонаж прыгает и сам двигается вправо (хотя кнопку движения я отпустил). При этом он сам прыгает на горе в момент остановки. С горы он слетает. На верхушке горы он считает что он в воздухе. На стенке горы залипает в момент движения в её сторону. И с верхушки горы бывает вправо сам отпрыгивает, даже если нажать чуть-чуть вправо и отпустить.

#22
13:28, 29 авг. 2013

Вот новое видео, чтобы было видно какие клавиши нажимаются:

+ Показать
#23
15:40, 29 авг. 2013

s3dworld

два динамических объекта для одного персонажа - я не знаю, разве это правильно?

Не знаю, но у меня персонаж состоит из двух тел в сумме которые состоят из 9 фикстур, включая сенсоры.
+ Показать

Вообще, для таких платформеров лучше не париться с физикой, так как она в них чаще своя «дискретная», все фиксировано. Движок дает некую свободу, «реалистичность», которую потом же приходится урезать. Если в твоей игре не нужно, чтобы все разлеталось в разные стороны, если тебе нужен «марио», подумай, так ли необходима тебе физика?

Теперь к проблемам.

Применять скорость вместо силы или импульса не совсем правильно. Но с силами будет разгон.

Цепляется за стены, потому как ты придаешь ему скорость, и он таранит стену, тем самым за нее цепляясь.
Решение: как вариант слушать касания слева/справа (только аккуратно и проверять, чтобы объект касания был статичным) и отключать в этот момент клавиши.

Спрыгивает с горки потому как ты двигаешь его строго вправо/влево, когда горка уходит по диагонали. Это практически прыжок.
Решение: как вариант, опять же, слушать касания с земли, вытягивать из них нормали (из манифолда) и направлять скорость по ним (немного сложно).
В прочем, тема с вращением круглого тела здесь больше подходит. Но мороки не меньше.

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

На верхушке находится в прыжке - это с нормалями что-то. Так очень острый угол.
Совет: выводи важные параметры (значения различных буленовских is*SOMETHING*, контакты и прочее) на экран или лог.

Слетает с верхушки горки вправо - проблема с проверкой контактов и состояний (в полете и др.). Возможно важен порядок проверок кнопок и контактов.
Совет: используй дебагер.

Страницы: 1 2
Box2DФорумОбщее

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