Показать сообщение отдельно
Старый 08.01.2015, 22:01   #732
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Да чёт не очень играбельная игра-то получилась.
С точки зрения игрока это ВТФ ЯННП
̶Н̶у̶ ̶о̶х̶у̶е̶т̶ь̶ ̶т̶е̶п̶е̶р̶ь̶

Как правильно организовать перемещение персонажа? Сейчас у меня метод "в лоб". Создаем капсулу вокруг игрока и задаем ей линейную скорость в нужно направлении, отсюда всякие косяки в виде плохого перемещения по лестницам и наклонным поверхностям( даже когда трение выставлено в ноль ). Поэтому появилась идейка сделать перемещение на рейкастинге. Замысел такой: бросаем луч вниз под игроком, находим точку пересечения и перемещаем в нее игрока, затем кидаем еще луч перед игроком на небольшом расстоянии от него тоже вниз но с начальной точкой чуть выше точки пересечения первого луча( то бишь - высота шага ), если есть пересечение то можно сделать шаг -> делаем интерполяцию между двумя полученными точками. В принципе, такой подход работает и довольно неплохо. Но как делают труЪ пацаны?
Кароч тру пацаны делают вот как:
Делаем что-то типа подпружиненого персонажа. То есть: у нас есть капсульный персонаж и двигаем мы его 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) Персонаж не скользит на наклонных поверхностях.

Пруф будет в следующей версии игры. Можете попробовать реальзовать подобное на любом физ движке.
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо mr.DIMAS за это полезное сообщение:
Mr_F_ (08.01.2015), Samodelkin (08.01.2015)