Заставьте объект путешествовать по линии, созданной AB Points - PullRequest
0 голосов
/ 16 сентября 2018

[На мой предыдущий вопрос Я объяснил детали]

Если вы посмотрите на изображение ниже, вы заметите, что есть объект Bullet, который исходит из точки A(x1,y1), и две другие точки, которые будут B и C.Теперь, когда Bullet создан, он получает последнюю известную позицию target и сохраняет ее.Затем он должен путешествовать до этой точки и дальше, пока не столкнется с любым другим объектом.

Итак, мой вопрос к вам: Как заставить объект Bullet перемещаться вдоль линии между A и B и затем продолжать движение по тому же пути, если не остановлен другим блоком? Представьте себе стрельбу по цели из настоящего оружия;пуля будет путешествовать столько, сколько сможет, даже если цель сама переместится.Вот чего я пытаюсь достичь.
enter image description here

1 Ответ

0 голосов
/ 17 сентября 2018

Чтобы определить положение пули в данный момент времени t, движущейся с некоторой скоростью v (которую вы можете выбрать произвольно), мы можем выполнить следующие шаги.Я буду считать, что t=0, когда пуля стреляет.(вы можете настроить, чтобы сделать это dt (дельта-время), если вы тоже хотите, это не имеет значения)

  1. Сначала найдите (нормализованный) вектор, который будет обозначать направление маркера.Это будет дано (1 / sqrt((x2-x1)^2 + (y2-y1)^2)) * (x2-x1, y2-y1).Создайте этот вектор один раз, когда пуля «выстрелит», и не меняйте его, поскольку пули остаются на постоянной траектории.(Вы можете сделать вектор членом класса Bullet, чтобы сохранить его, просто идея)
  2. Далее, умножьте это на скаляр v.Я должен отметить, что вы можете игнорировать эту переменную, если хотите, так как она может быть учтена в t, но с физической точки зрения имеет смысл включить.
  3. Наконец, чтобы получить позицию, просто умножьтеэтот вектор на t, где t - некоторое время, а затем добавьте исходный вектор (x1, y1) к этому результирующему вектору.(Обратите внимание, что все это всего лишь 2d кинематика, есть много онлайн-ресурсов, если вы хотите изучить это подробнее.

Это приведет к позициям пули x и y взаданное время t. Затем, когда вы обновляете позиции x и y, вам нужно будет реализовать некоторую функцию / алгоритм обнаружения столкновений, чтобы определить, попала ли пуля в что-то. Так как я действительно не знаю, как вы организовалиВаш код Я не могу дать вам конкретный совет, как лучше всего это сделать, но вот несколько советов.

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

Глядя на ваш предыдущий вопрос, я замечаю, что вы пытаетесь использовать углы.Хотя это, безусловно, правильный подход, я думаю, что это решение относительно простое для понимания и позволяет избежать тригонометрического аспекта всего этого.

В любом случае, я надеюсь, что ответил на ваш вопрос.Оставьте комментарий / вопрос, если у вас есть какие-либо дополнительные вопросы по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...