2014-02-05 2 views
0

Я пишу простую игру в стиле воздушного хоккея в CodeSkulptor (python 2). 3 круга, в основном два весла и шар. Я понимаю, как обнаружить столкновения между кругами, но мне было трудно тогда точно моделировать, как этот круг отскакивает от круга, управляемого пользователем. Круг, управляемый пользователем (весло), имеет тенденцию потреблять мяч, и мяч застревает. Я думаю, что мой код для мяча, отскакивающего от стены, в значительной степени совпадает с кодом, который я написал для столкновения весла.Как определить точку столкновения между двумя кругами, а затем создать вектор для обновления положения круга?

Я прочитал немного о некоторых других сообщениях, и я понял, что мне нужно получить точку столкновения, а затем каким-то образом превратить это в вектор, чтобы обновить положение мяча. Может ли кто-нибудь помочь мне в этом? Кроме того, усложняет ли тот факт, что манипулятор управляется пользователем? Я предполагаю, что удар по мячу должен также учитывать вектор весла?

Благодарим за любые ответы и просим сохранить математику как можно проще.

Крис

+0

Вы задаете хороший вопрос. Ответ зависит от того, как вы хотите, чтобы игровой процесс работал. Вы можете выбрать либо очень простое моделирование, либо полностью реалистичное.Я рекомендую начать с простейшего уравнения, которое вы можете сделать, чтобы запустить его, а затем решить, нужно ли вам более точное моделирование, чтобы сделать игру забавной. Возможно, вы захотите попробовать такую ​​книгу: Начало математики и физики для программистов (http://www.amazon.com/Beginning-Math-Physics-Game-Programmers/dp/0735713901/ref=sr_1_1?s= book & ie = UTF8 & qid = 1391634202 & sr = 1-1 & keywords = 0735713901) – Kevin

+0

Да, я думаю, что, начиная с простейшего работоспособного решения, было бы лучше, поскольку я пытаюсь научить себя, как делать игры в первую очередь, и, как следствие, немного физики и математики. Спасибо за ссылку, просто нужно найти бесплатную версию этого и установить. – user3276942

ответ

1

Решение 1

Алгоритм, который работает хорошо для меня и произвольных форм является

  1. движение круг
  2. тест, если он перекрывает
  3. , перекрывает ли он : переместить его обратно
  4. измените направление.

Таким образом, вы не должны застревать, если другая часть не перемещается в среднее время. Потому что, двигаясь назад, вы не накладываетесь на потом и не пытаетесь вызвать скачок и изменение направления дважды.

Решение 2

Использование векторов и только круги:

circle1x, circle1y, circle1radius, circle2x, circle2y, circle2radius 

if (circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2 < (circle1radius + circle2radius) ** 2: 
    # they overlap using http://en.wikipedia.org/wiki/Pythagorean_theorem 
    # compute new direction 

Изменение направления

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

old_direction1 = (v1x, v1y) 
velocity1 = (v1x ** 2 + v1y ** 2) ** 0.5 
old_direction2 = (v2x, v2y) 

distance = ((circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2) ** 0.5 
new_direction1 = ((circle1x - circle2x)/distance * velocity1, 
        (circle1y - circle2y)/distance * velocity1) 
new_direction2 = ((circle2x - circle1x), ...) 

Но вы можете использовать это новое направление и старое направление для создания нового направления, которое выглядит более естественным. Я не проверял это, но это должно выглядеть примерно так:

combined_direction = old_direction + 2 * (old_direction dot-product new_direction) * new_direction

Скалярное произведение дает вам направление, которое проецируется на некоторый вектор есть читать.

Кроме того, как только вы получили это, вы можете создать упругие соударения с учетом как тяжелые круги являются: http://en.wikipedia.org/wiki/Collision

+0

Спасибо за подробный ответ, я попробую и отправлю отчет. – user3276942

Смежные вопросы