2013-05-31 2 views
0

Я работаю над простой 2-й игрой. Я делаю линейную анимацию движения изображения по разным направлениям.Движущаяся анимация, включающая ускорение/дециберация

Функция для перемещения изображения (move_to_right) требует 2 параметра

  1. Distance: Общее расстояние, пройденное
  2. Duration: Продолжительность чтобы покрыть это расстояние

Класс, который держит изображение имеет эти переменные, необходимые для выполнения линейных движений:

  1. distance_total: хранить общее расстояние (берется из параметра «расстояние»)
  2. frame_total: хранит необходимо всего кадра (взятые из «длительность» параметра)
  3. frame_spent: сколько кадров, передаваемых во время анимации
  4. speed: как многие из пикселей изображения шаг для каждого кадра, первоначально 0
  5. основные переменные изображения, такие как X, Y координаты, ширина, высота и т.д.

грубый код:

class Animated 
    def initialize 
     #all things needed to show a picture properly in the screen along with its properties such as x, y coordinates. 
    end 
    def move_to_right (distance,duration) 
     @distance_total = distance 
     @frame_total = duration 
     @frame_spent = 0 
     @speed = @distance_total/@frame_total 
     #the animation runs in game's loop, but for this time, to make it simple and easy to understand, I'll just use while statement 
     while @frame_spent <= @frame_total 
      self.x += @speed 
      @frame_spent += 1 
     end 
    end 
end 
$test = Animated.new 
$test.move_to_right (100,60) 

Эти коды работают хорошо, но это все, просто простая анимация движения. Изображение перемещается 100 pixel вправо in 60 frames

НО

Теперь мне нужно динамическое движение, которое включает в себя ускорение/замедление, вот сценарий:

  1. первый 30% от продолжительности включает ускорение. Скорость начинается с 0 и поднимается от кадра к кадру
  2. следующие 40% длительности срабатывания линейное движение. Скорость постоянна и не изменяется
  3. последние 30% длительности включает decceleration. Скорость начинается с последней скорости линейного перемещения и падает от кадра к кадру, пока, наконец, не остановится.
  4. Этот сценарий не должен оказывать какое-либо влияние на общее расстояние и продолжительность. Это означает, что все это должно покрывать 100 пикселей в 60 кадрах.

Вопросы: 1. Какие переменные необходимы для выполнения вышеуказанного сценария? Для чего они используются? 2. Какие шаги? Если вы можете, пожалуйста, также укажите уравнение/расчет, чтобы сделать его понятным

Вам не обязательно отвечать на коды; текстовые объяснения или направление будут большой помощью. Существует никаких ограничений по языку, поэтому, если вы хотите помочь в использовании кода на любом языке, это абсолютно нормально.Заранее спасибо :)

+0

Если это код для определенного языка, вы должны добавить [подсветку синтаксиса] (http://meta.stackexchange.com/questions/981/syntax-highlighting-language-hints). – Dukeling

ответ

1

Это не проблема, но кропотливый вопрос.

Вы должны нарисовать диаграмму V-t, чтобы понять вашу проблему.

Площадь под кривой равна расстоянию. Теперь вы можете рассчитать количество ускорений.

1- Используйте 3 цикла в методе move_to_right.

2- Первый цикл будет работать в течение 30% кадра и скорости + = ускорение, x + = скорость;

3- Второй цикл будет работать% 40 кадра и x + = скорость;

4 Последняя петля% 30 кадра и скорость - = ускорение, x + = скорость.

Надеюсь, это поможет вам! :)

+0

Я понимаю о диаграмме v-t. Я могу рассчитать ускорение/замедление, если я знаю конечную скорость каждого цикла. Проблема заключается в том, что в этом сценарии видно только время и область. Площадь, которая должна быть покрыта, составляет 100, состоит из 2 треугольников и 1 коробки. Все, что известно, представляет собой сумму этих двух треугольников + box = 100 и все они в 60 кадрах. 100 и 60 взяты из параметра, поэтому следующий случай может быть 200 пикселей в 30 кадрах и т. Д. Ничего не исправлено. Как узнать скорость? Как узнать площадь каждого треугольника и прямоугольника? – AzDesign

+0

Ускорение постоянное. v = v0 + a * t и V0 = 0. Просто V = a * t :)) Для метода (200,30) он увеличивается до достижения a * 9t, переходит на 12 кадров и уменьшает 9 кадров (достигает V = 0). – Daedelus

0

Этот link идеален и отвечает на мой вопрос. Ослабление анимации становится более гибким без специального кода для конкретного движения. Удивительно, что весь скрипт является автономным без какого-либо влияния на существующий код. Он доступен на нескольких языках.

Смежные вопросы