Предотвращение выхода за границы при смягчении пеннеров

Я работаю над проектом, который использует следующую функцию замедления для перемещения объектов на экране:

function easeinoutquart(t,b,c,d) as float
    't=time, b=startvalue, c=change in value, d=duration
    d=d/2
    t=t/d
    if (t < 1) then 
        return c/2*t*t*t*t + b
    end if
    t=t-2
    return -c/2 * (t*t*t*t - 2) + b
end function

Я продолжаю сталкиваться с ситуациями, когда значения быстро выходят за пределы, в результате чего объекты перемещаются за пределы экрана с головокружительной скоростью. Первая ситуация, похоже, была вызвана усечением результатов функции до целочисленных значений, которые я исправил. Следующее, что вызвало точно такое же поведение, было, когда значение времени не было сброшено после того, как объекты остановились и было введено новое расстояние замедления. После добавления значения сброса после изменения значения пункта назначения (change = destination-start) это, казалось, полностью решило проблему.

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

Чтобы кратко описать код:

loop
   check for user input (up down left right select) 
      if so set new dest position for all images, reset timer for all images
      if a new image is selected on screen, load related content, reset related content timer

      is there an image in the queue to download? if so get initiate async download
      are any images downloaded? If so swap out temp image with final image

      call easing function for primary images (vertical movement on y axis)
      call easing function for related content (horizontal movement on x axis)
      draw all graphics and swap display buffer
end loop

До добавления кода загрузки / замены изображения (фактический обмен - это просто изменение указателя), все отлично работало как с предварительно загруженными изображениями, так и с временными изображениями. Теперь, когда я сначала загружаю временные изображения и меняю местами, я думаю, что цикл иногда выполняется более чем на 1/30 секунды, и, возможно, это приводит к тому, что значения таймера становятся странными.

В сущности, мне интересно, есть ли какие-то "ограничивающие" зажимы, которые я могу поставить на значения, которые не позволят функции замедления генерировать сумасшедшие значения, которые быстро выходят из-под контроля. Например, общее расстояние перемещения не должно превышать 250 пикселей за одну итерацию, фактически всегда должно быть всего несколько пикселей по отношению к целевому значению.

1 ответ

Решение

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

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

время - это количество миллисекунд с момента запуска функции замедления:

change=destination-currentposition
currentposition=inoutquart(time,currentposition,change,duration)
if time > duration then startarray[i]=destarray[i]

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

Другие вопросы по тегам