Страницы

понедельник, 7 сентября 2009 г.

Вопрос Aimar'а: "имеем в изометрии объект, движущийся в любом направлении. Игру фоткать не хочу, на картинке вроде по блокам и границе ясно, какова изометрия. Проблема с реализацией зависимости скорости от направления: одинаковая скороть смотрится не очень реалистично; функцию пока не подобрал оптимальную; можно, в принципе, интервалам значения давать. В любом случае скорости нужно сравнивать, какая самая большая должна быть? Самая маленькая? Зависимость нужна, в общем."

Вопрос очень интересный, тем более, что он часто встречается в программирований и ещё чаще в математике. Зависимость, автор вопроса, уже знает - direction. А вот функцию он не придумал и в этом его ошибка. Какие могут быть функций? И тут самое интересное, да какие угодно! В данном случае, его интересует приплюснутый по вертикали эллипс, т.е. вверх и вниз медленне, а вправо и влево быстрее. Вертикальные значения direction? 90 и 270. А боковые? 0 и 180. В данном случае, функия (abs(cos(direction)) + 1) подходит больше всего. Влево(abs(cos(180)) + 1) и вправо(abs(cos(0)) + 1): = 2 . А вверх и вниз: = 1. т.е. если перс идёт вправо или влево, то скорость в 2 раза выше, а если вверх или вниз, то обычной. Причём, значение скорости будет плавно меняться. Вот вам графическое оформление:



Как вы знаете из школьного курса, горизонтальная координата - абсцисса - независимая координата, а ордината - вертикальная координата - зависимая. А что у нас зависит? Скорость (speed). Поэтому ложим её на ординату, а на абсциссу - направление(direction). Что значит зависимая? Это значит, какое будет направление, такая и будет скорость, но не наоборот. На картинке вы видите саму функцию, в виде 2 горок. При направление направо(direction = 0), скорость = 1, вверх (direction = 90) - скорость = 2 и т.д. Вы можете подставить в уравнение функций (abs(cos(direction)) + 1) и узнать значение скорости от направления. Заметьте, что функция цикличная и симметричная (это говорит о том что, если direction вырвется за пределы (0-360), то ничего страшного не случиться, а это очень важно). Графически эту функцию можно получить по правилам переноса(или проще, через специальную программу по построению графиков).


А конечный код будет выглядеть так:
speed = _speed * (abs(cos(direction)) + 1);
где - _speed коэффициент скорости(т.е. _speed = 3; или другому числу).
Можно преобразовать эту функцию(раскрыть скобки), возможно повлияет на производительность игры, читабельность кода:
speed = _speed + abs(cos(direction)) * _speed;

Результирующую скорость (speed) можно подправить в соответствий с вашими реалиями(запросами баланса, удобство визуальной части) просто умножив на число(оно должно быть около 1, может быть 0.8 или 1.2, это так, замер на глазок).

Как узнать какие есть функций? Это я отсылаю вас к математикам. Но есть стандартный набор который вы должны были узнать, это:
Cos(), Sin(), Tg(), обратные их варианты, log() и его варианты, abs() - модуль(симметрия относительно ординаты), округление (лесенка), корень от числа, степень, 1/x (обратная зависимость), x (прямая зависимость) и многие другие. Их графические варианты должны были показать вам, а свойства рассказать.

Функций очень важны, они играют большую роль. Им есть разные применения, вот у меня в Space Freedom, скорость корабля зависима от расстояния до цели. Вот так это происходит у меня:
speed += speed_acc * min(max(0, point_distance(x, y, vFinishDot.x, vFinishDot.y) / (max(1, speed * 4) * room_speed)) , 1);

Можете попробовать нарисовать эту функцию и посмотреть как зависима скорость от расстояния. Видите что моя функия не циклична и не симметрична, поэтому при значениях не входящих в эту функцию, значения будут неверными.
Маленькое дополнение, это двухмерная зависимость (как вы видели на картинке, 2 оси), но она может быть n-мерная(где n - любое целое число). Например, скорость зависит не только от направления, но и от веса содержимого карманов персонажа. Но я воздержу вас от многомерных функций, они очень сложны, лучше сделать расчёты поэтапно.

Комментариев нет:

Отправить комментарий