Я разрабатываю игру на Flash и мне нужна небольшая помощь. Это можно считать математической задачей.
Мой объект летит со скоростью, X
и мой объект может столкнуться с камнями. Когда он сталкивается с камнем, мне нужен мой объект, чтобы разбить камень и продолжить, но с меньшей скоростью. Легко написать код и написать что-то вроде:, myVelocity -= 10;
но моя главная проблема в том, что я хочу, чтобы он терял скорость меньше, чем выше начальная скорость.
Например: если скорость равна 300, я хочу, чтобы она потеряла 10, а если она была 200, я хочу, чтобы она потеряла 20.
Можно ли это сделать с помощью какой-то формулы?
mathematics
physics
Афра
источник
источник
log(myVelocity + 1) * N
?Ответы:
Я бы инвертировал скорость и умножил бы на что-нибудь, что тебе нравится:
Этот пример дает следующие эффекты:
источник
та система, которую вы и другие описываете, не создаст физически выглядящую физику. основная формула состоит в уменьшении 0,5 * m * v ^ 2 (кинематическая энергия) на постоянное значение всякий раз, когда объект попадает куда-либо.
поэтому, если объект весом 2 кг попадает в какой-то блок, которому требуется 16j энергии, прежде чем он сломается: скорость движения объекта изменится в соответствии с этой таблицей:
источник
Вы на самом деле не дали достаточно информации, чтобы сказать, какой диапазон вам нужен, то есть ли он ограничен, хотите ли вы геометрическую прогрессию и т. Д.
Первое, что вы хотите сделать, это получить число, пропорциональное величине скорости, которую вы хотите потерять (она не должна быть такой же, но она должна уменьшаться с увеличением скорости, чтобы сделать ее пропорциональной вашей потере). Стандартный способ сделать это - взять ответное :
Теперь для 100 у вас будет 0,01, для 200 - 0,005, для 300 - 0,0033 и так далее.
Теперь вам просто нужно настроить это число на то, что вы действительно хотите, умножив его. Так
даст вам 20 за 300, но это даст вам 15 за 200, а не 10. Это может быть хорошо для вас, в этом случае вам не нужно читать дальше. Вы можете настроить k так, как вам нравится, но вы не можете получать числа так, как вам нравится, если вы не сделаете немного больше, например, реализуете геометрическую прогрессию или измените базу для увеличения. Я не буду вдаваться в геометрические прогрессии здесь, но если вы хотите изменить базу, вы делаете это следующим образом:
Это предоставит вам диапазон, который вы изначально запрашивали в своем вопросе, 300 -> потеря 10, 200 -> потеря 20. FYI 100 -> потеря 40, и 50 -> потеря 80 (!), Что означает, что вы нужно ограничить вычитание - это то, что я сделал в строках (1) и (2).
Конечно, есть и другие способы решения всей этой проблемы, которые, я уверен, те, кто более математически искусен, чем я, опубликую здесь.
источник
Я думаю, вы можете использовать просто деление по скорости. Например: lost = 3 000 / myVelocity. Когда скорость равна 300, вы потеряете 10, а если 200, то потеряете 15. Выбор за вами правильных констант зависит от вас.
Если вы хотите, вы можете использовать более сложную формулу, например: постоянная / (постоянная2 * скорость ^ 2 + постоянная3 * скорость). Опять же - просто выберите константы, которые вам подойдут.
источник