C # отскок / бросить физику для предметов, выпадающих - PullRequest
1 голос
/ 19 декабря 2011

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

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

РЕДАКТИРОВАТЬ В ЗАПРОСЕ:

Хорошо, когда монстр будет уничтожен, я выбрал бы случайное местоположение в пределах тайла, в котором он находится, давайте назовем это местоположение endLoc и местоположение монстра startLoc. Затем я бы нашел центральную точку x между этими двумя точками и уменьшил бы y на 20 (потому что именно на это количество пикселей я хочу, чтобы элемент увеличивался), поэтому давайте назовем эту переменную launchLoc:

launchLoc = new Vector2(startLoc.X + ((endLoc.X - startLoc.X) / 2), startLoc.Y - 20)

Я думаю, что это дает правильный Вектор.

Так что теперь мне нужно запустить элемент из startLoc, для launchLoc, а затем вернуть его обратно в endLoc. Это где это сбивает с толку, и я не уверен, как сделать реалистичную дугу для этого. Конечный результат заставил бы предмет двигаться, как будто он двигался по гауссиане, как если бы он был брошен в воздух.

Я пытался сделать так, чтобы во время каждого интервала скорость увеличивалась на 120-ую, от разницы Х, между startLoc и launchLoc, увеличивая кратность, но я не мог заставить ее работать очень хорошо. Я не уверен, что это был лучший способ сделать это. Я использую 120th, потому что значение y равно 20, и элемент перемещается вверх на 1 пиксель каждый интервал, поэтому при суммировании от 1 до 20 получается 120, это будет постоянно увеличивать движение x, как если бы его подбрасывали.

Это в 2D, кстати, я надеюсь, что это помогает.

1 Ответ

1 голос
/ 19 декабря 2011

Вы начинаете с начального вектора скорости в момент времени t 0 ( v (t 0 )) и положения ( р 0 )). Можно предположить, что сила тяжести создает постоянное ускорение ( a (t 0 ) = <0, -9,8 м / с <sup>2 > , хотя ваша ценность может отличаться), пока объект не приземлится. Таким образом, общая форма движения для перехода от одного временного интервала к следующему:

<b><i>p</i></b>(t) = 0.5*<i><b>a</i></b>(0)*(t-t<sub>0</sub>)<sup>2</sup> + <i><b>v</i></b>(0)*(t-t<sub>0</sub>) + <i><b>p</i></b>(0)
<b><i>v</i></b>(t) = <i><b>a</i></b>(0)*(t-t<sub>0</sub>) + <i><b>v</i></b>(0)

Чтобы выяснить, когда остановить это движение, вам необходимо выяснить, в какое время путь объекта будет пересекать поверхность, на которую он отскакивает. Вы должны будете сделать это для всех поверхностей, для которых разумно ожидать, что это произойдет. Таким образом, для плоскости с линейным уравнением Ux + Vy + T = 0 вы разбиваете вектор положения на его компоненты, как в:

<b><i>p</i></b>(t) = <<b><i>p</i></b><sub>x</sub>(t), <b><i>p</i></b><sub>y</sub>(t)>
Затем используйте квадратную формулу , чтобы найти t<sub>c</sub>, где <b><i>p</i></b>(t<sub>c</sub>) удовлетворяет линейному уравнению:
0.5*(U<b><i>a</b></i><sub>x</sub>(t<sub>0</sub>)+V<b><i>a</b></i><sub>y</sub>(t<sub>0</sub>))*t<sub>c</sub><sup>2</sup> + (U<b><i>v</b></i><sub>x</sub>(t<sub>0</sub>)+V<b><i>v</b></i><sub>y</sub>(t<sub>0</sub>))*t<sub>c</sub> + (U<b><i>p</b></i><sub>x</sub>(t<sub>0</sub>)+V<b><i>p</b></i><sub>y</sub>(t<sub>0</sub>)+T) = 0
Выберите ветку так, чтобы t c > t 0 . Оттуда просто выяснить, где объект столкнется с поверхностью. Затем вы можете обновить вектор скорости и вектор положения в зависимости от поведения отскока. Если плоскость выровнена по оси (то есть, это горизонтальная плоскость с вектором нормали, параллельным оси Z), то просто переверните знак Z-компонента вектора скорости и умножьте весь вектор скорости на некоторый коэффициент затухания d, где 0 & le ; d <1, чтобы ослабить скорость. Затем повторяйте, пока не пройдет какое-то заданное время или скорость не достигнет минимальной величины (ваш звонок на этом). </p>

С произвольно ориентированными плоскостями становится немного сложнее. Вам нужно будет рассчитать угол падения столкновения и отразить вектор скорости относительно плоскости нормали. Я не буду вдаваться в подробности, так как подозреваю, что вы, вероятно, не заинтересованы в этом.

...