Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
0
03:24, 10 июля 2013

Понг. Расчет отражения мяча при соударении с поверхностью

Из истории видеоигр мы знаем, что Pong – это симулятор настольного тенниса: мячик двигается по экрану по линейной траектории и, если он ударяется о периметр игрового поля или об одну из нарисованных ракеток, его траектория изменяется в соответствии с углом столкновения. Эту траекторию, а также само перемещение мяча по этой траектории мы и будем сегодня рассчитывать. Как ни странно, для этого нам понадобятся знания из курса 7 класса средней школы (привет тем, кто считает, что математика нужна только учителям математики).

Траектория в соответствии с углом столкновения может рассчитываться разными способами. Я предлагаю такой: от центра ракетки мяч отражается с очень малым углом; чем дальше от центра, тем больше угол отражения. Если он ударился правее от центра, то и мяч будет отлетать в правую сторону, если левее, то в левую.

Blog post image

Рис. 1

Этот принцип будет соблюдаться и для всех стен периметра игрового поля, которое имеет размер 620x460.

Теперь нам нужно вывести формулу, которая будет определять точку, в которую отлетит мяч при соударении. Например,  мяч отпрыгивает от координаты [x1=1;y1=-5] (см. рис. 1), угол мы знаем (угол = x1*10). Чтобы получить координату [x2;y2], продолжим линию до пересеченья с осью Oy. Таким образом, мы получим два подобных друг другу треугольника. Нам известен катет и противолежащий угол, найдем длину стороны С1 (см. рис. 2):

C1=x1/tg(угол альфа).

Из свойств подобных треугольников известно, что отношение периметров и длин биссектрис, медиан, высот и серединных перпендикуляров равно коэффициенту подобия, а коэффициент подобия — число k, равное отношению сходственных сторон подобных треугольников. Итак, длина С2=(расстояние от y1 до y2)+C1; коэффициент подобия k=C2/C1. Теперь осталось найти координату x2. Для этого коэффициент подобия k умножим на x1 (свойство подобных треугольников).

Blog post image

Рис. 2

В данном случае координата y2 будет равна 5.Если же мяч оттолкнется от точки x1=3, то y2=5 нам уже не подойдет, и нам нужно будет рассчитать точку соприкосновения с правой стенкой. Также продолжим линию до пересечения с осью Oy, получим два подобных треугольника, у одного из которых мы будем знать катет и противолежащий угол. Нам известно, что стена находится на x=8. Найдем сторону B1 (см. рис. 3): B1=x/tg(угол альфа). Чтобы найти сторону B2, нам нужно узнать во сколько раз она меньше стороны B1. Это легко сделать, найдя отношение точек x/x1. Отсюда B2=B1/(x/x1). Под сторонами A1, B1, C1 подразумеваются полные стороны треугольника, а не до соприкосновения со сторонами A2, B2, C2. Когда эти две стороны треугольников найдены, можем найти координату y2: y2=B1-B2.

Blog post image

Рис. 3

Теперь перейдем к движению мяча по найденной траектории. Нам нужно, чтобы мяч переместился из точки (x1,y1) в точку (x2,y2). Распишем всё сразу на языке программирования С++.

  1. double Ball::Move()
  2. { int bool=0;
  3. int x,y,a,b;
  4. double L,t0,vx,vy;
  5. int v=5;//скорость перемещения
  6. int t=0;//время
  7. // вектор перемещения = (x2-x1,y2-y1);
  8. L=sqrt(pow((x2-x1),2)+pow((y2-y1),2));// длина вектора
  9. vx=(x2-x1)/L*v;// проекции скорости на x
  10. vy=(y2-y1)/L*v;// проекции скорости на y
  11. t0=L/v;// время движения по пути
  12. while(t<t0){
  13. if(t+1>=t0) bool=1;
  14. x=x1+vx*t;//вычисляем координаты точки
  15. y=y1+vy*t;
  16. setcolor(4);//устанавливаем цвет контура мяча
  17. setfillstyle(1,4);//метод закраски и цвет мяча
  18. fillellipse(x,y,10,10);//координаты мяча и его радиус (если указать, разные
  19. // цифры, то получится овал)
  20. delay(10);
  21. if(bool!=1){// стираем мяч
  22. setcolor(getbkcolor());
  23. setfillstyle(1,getbkcolor());
  24. fillellipse(a,b,15,15);}
  25. a=x;b=y;
  26. t+=1;}}

На этом пока всё. Как видите, игрострой – это сплошная математика и физика. О программной реализации расчета отражения мяча поговорим в следующей статье. Также в следующих постах я расскажу о том, как добавить ракетки для игроков, компьютера, как компьютер будет отбивать мяч – ведь это всё-таки игра, и компьютер должен поддаваться :-)

 
0
1573
1