Flash Game Book (6 урок)
Трение
Почему объекты замедляются? Потому-что они теряют энергию.
Есть два способа работы с трением: правильный способ и достаточный способ.
Реальное трение.
Если вы тащите коробку по полу справа налево, то сила трения действует влево,
противоположно направлению векторной скорости.
Векторная скорость коробки будет стремиться к нулю с постоянным замедлением.
Уравнение для трения скольжения выглядит так:
F=u*mass*gravity
mass*gravity - вес объекта.
Чем больше вес объекта, тем больше трение, которое будет противодействовать движению скольжения объекта.
u - коэффициент трения (коэффициент трения скольжения).
Коэффициент трения является числовым значением между 0 и 1.
В реальной жизни этот множитель определяется экспериментально и отличается для каждой взаимодействующей поверхности объекта.
Например, влажный ледяной куб на резиновом полу может иметь очень низкий коэффициент трения (.01),
в то время как теннисные туфли на том же полу могут иметь более высокий коэффициент трения (.2).
Вы можете просто выбрать значение для u в зависимости от вида поверхности, с которой имеете дело.
Используя второй закон Ньютона, мы можем определить замедление в результате трения:
F=mass*accel=u*mass*gravity.
Сокращая mass в обеих частях уравнения, мы получаем:
accel=u*gravity.
Для выполнения реализации трения нужно:
1. Найти ускорение в результате трения, используя уравнение
accel=u*gravity
2. Применить значение accel к векторной скорости в каждом кадре (так-же как с ускорением), пока векторная скорость не достигнет нуля.
Прекратите применение переменной, когда скорость достигнет нуля. Если вы этого не сделаете, объект станет двигаться в противоположном направлении.
Помните, что отрицательное ускорение является замедлением.
рассмотрим это в действии.
Откроем новый проект.
Создадим новый слой.
На слое нарисуем объект (в моем примере это прямоугольник).
Преобразуем объект в клип (F8) с именем cube.
Выберем наш созданный слой (в моем примере это myCube).
И впишем в него (в Actions-Frame):
xmov=10;
gravity=2;
u=.15;
accel=u*gravity;
_root.onEnterFrame=function(){
if (Math.abs(xmov)>=Math.abs(accel)){
if (xmov>0){
xmov-=accel;
} else if (xmov<0){
xmov+=accel;
}
} else {
xmov=0;
}
cube._x+=xmov;
}
В строке 1 мы сообщаем объекту начальную векторную скорость так,
чтобы он имел некоторый ее запас для движения до остановки.
Затем мы определяем переменную гравитации и постоянную трения u.
В строке 4 мы используем гравитацию и постоянную трения для нахождения значения ускорения, возникающего в процессе трения.
Выражение if в событии onEnterFrame нужно для того, чтобы удостовериться,
что мы прибавляем или вычитаем ускорение правильно (в зависимости от направления движения).
Выражение if также контролирует, что произойдет с объектом, если векторная скорость меньше, чем ускорение,
если такое происходит, то в следующем кадре объект должен остановиться.
Достаточный подход к описанию трения.
Более быстрый и простой способ обработки трения и достижения визуально очень похожего результата.
1. Выберите число между 0 и 1. Давайте назовем это число ослаблением.
2. Умножайте ослабление на векторную скорость в каждом кадре.
Если ослабление равно 1, то векторная скорость никогда не изменится.
Если ослабление равно 0, то векторная скорость равна 0 после кадра 1.
Если ослабление имеет значение между 0 и 1, то скорость будет стремиться к 0 в каждом кадре.
xmov=10;
decay=.95;
_root.onEnterFrame=function(){
xmov*=decay;
cube._x+=xmov;
}
Как видите, это гораздо более простой способ использования трения.