Да чёт не очень играбельная игра-то получилась.
С точки зрения игрока это ВТФ ЯННП
|
̶Н̶у̶ ̶о̶х̶у̶е̶т̶ь̶ ̶т̶е̶п̶е̶р̶ь̶
Как правильно организовать перемещение персонажа? Сейчас у меня метод "в лоб". Создаем капсулу вокруг игрока и задаем ей линейную скорость в нужно направлении, отсюда всякие косяки в виде плохого перемещения по лестницам и наклонным поверхностям( даже когда трение выставлено в ноль ). Поэтому появилась идейка сделать перемещение на рейкастинге. Замысел такой: бросаем луч вниз под игроком, находим точку пересечения и перемещаем в нее игрока, затем кидаем еще луч перед игроком на небольшом расстоянии от него тоже вниз но с начальной точкой чуть выше точки пересечения первого луча( то бишь - высота шага ), если есть пересечение то можно сделать шаг -> делаем интерполяцию между двумя полученными точками. В принципе, такой подход работает и довольно неплохо. Но как делают труЪ пацаны?
|
Кароч тру пацаны делают вот как:
Делаем что-то типа подпружиненого персонажа. То есть: у нас есть капсульный персонаж и двигаем мы его SetLinearVelocity( vel ), дополнительно кидаем луч под персонажа, находим расстояние между точками пересения луча и позиции игрока. Из этого расстояния вычитаем некоторую высоту "пружины"( у меня это 1,5 ) - получаем скорость выталкивания\притяжения перса - складываем эту скорость с vel и также двигаем SetLinearVelocity( vel ). В коде это выглядит так:
// spring based step
ruVector3 currentPosition = ruGetNodePosition( mBody );
ruVector3 rayBegin = currentPosition - ruVector3( 0, 0.2, 0 );
ruVector3 rayEnd = rayBegin - ruVector3( 0, 100, 0 );
ruVector3 intPoint;
ruNodeHandle rayResult = ruCastRay( rayBegin, rayEnd, &intPoint );
const float staticYOffset = 1.5f;
if( rayResult.IsValid() && !(rayResult == mBody) )
{
mCurrentVel.y = -( currentPosition.y - intPoint.y - staticYOffset ) * 5;
}
ruMoveNode( mBody, direction * speed + mCurrentVel );
В чем профит:
1) Идеально ходим по лестницам - никаких застреваний.
2) Идеально ходим по наклонным поверхностям - без уменьшения скорости при подъеме и вылетания вперед при спуске.
3) При приземлении после прыжка возникает приятный эффект подпружинивания.
4) Персонаж не скользит на наклонных поверхностях.
Пруф будет в следующей версии игры. Можете попробовать реальзовать подобное на любом физ движке.