Как вы знаете из школьного курса, горизонтальная координата - абсцисса - независимая координата, а ордината - вертикальная координата - зависимая. А что у нас зависит? Скорость (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 - любое целое число). Например, скорость зависит не только от направления, но и от веса содержимого карманов персонажа. Но я воздержу вас от многомерных функций, они очень сложны, лучше сделать расчёты поэтапно.
Комментариев нет:
Отправить комментарий