2015-01-27 4 views
2

У меня есть игра Pong-360, в которой дугообразные весла отклоняют шар, который должен оставаться в пределах круговой границы. Если мяч не встречается с веслом, когда он добирается до границы, он продолжает выходить за пределы поля, и игрок должен последний раз поразить бал. Проблема, с которой я сталкиваюсь, возвращает мяч в правильном направлении при ударе с помощью весла. Если мяч контактирует с определенной половиной лопасти, он должен отскакивать в этом направлении, но в любом случае должен быть возвращен на противоположную сторону границы без повторного удара по той же стороне границы.Отскок мяча в круге

Screenshot of game with added notes Прямо сейчас я совершил прыжок, разделив границу на 16 срезов и давая шару случайный угол в пределах диапазона, который зависит от того, какой срез он находился при ударе. Даже это не работает должным образом, потому что моя математика неверна, но ее нужно переделать любым способом. Я не могу понять, как получить угол, который обеспечит возвращение мяча на противоположную половину границы независимо от того, где он был поражен. Я сделал несколько попыток получить угол от переменных, таких как направление движения шара, текущее положение в пределах границы и положение лопасти, которая соприкоснулась, но до сих пор я испытал сбой. В настоящее время код для изменения направления мяча выглядит следующим образом:

public void bounce(){ 

     boolean changeAngle = false; 

     if(bluePaddle.intersects(ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter())){ 

      lastHit = 1; 
      changeAngle = true; 
     } 
     else if(redPaddle.intersects(ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter())){ 

      lastHit = 2; 
      changeAngle = true; 
     } 

     if (changeAngle){ 

      // Right side of boundary 
      if (ball.getX() > center_x) { 

       // Quadrant 4 
       if (ball.getY() > center_y){ 

        // Slice 13 
        if (ball.getY() - center_y > Math.sin(3 * Math.PI/8)){      
         angle = (double) (randNum.nextInt(90) + 90); 
        } 
        // Code for other slices omitted 
       }//end Quadrant 4 
       // Code for other quadrants omitted 
      }//end right side of boundary 

      // Code for Left side of boundary omitted 

      ball.setDx((int) (speed * Math.cos(Math.toRadians(angle)))); 
      ball.setDy((int) (speed * Math.sin(Math.toRadians(angle)))); 
     }//end if (changeAngle) 

     bouncing = false;  
    }//end bounce method 

Как вы можете видеть, как сейчас, угол просто генерируется случайным образом в пределах диапазона, который я думал, было бы хорошо для каждого среза. Чтобы подчеркнуть, мне в первую очередь нужна помощь в математике, реализация которой с помощью Java является вторичной. Весь код (все файлы .java и .class), который компилируется и запускается, можно найти здесь: https://github.com/pideltajah/Pong360/tree/master/Pong360

Основной метод находится в файле Pong.java.

Любая помощь будет оценена по достоинству.

+0

Стрелка, который вы нарисовали не представляется возможными. Обратите внимание, что если весло было в самом правом постулировании, это отклонение приведет к тому, что он достигнет своей собственной стороны. Более того, не представляется возможным работать очень разумно. Если бы красное весло было сверху, например, попадание правой части весла также отправило мяч против собственной стены красного. – dwn

+0

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

+1

В качестве альтернативы, возможно, вы можете разделить круг на четверти, и каждый игрок будет управлять двумя лопастями на 180 градусов друг от друга (или наоборот, если на квадрате). Если это глупая идея, извините, это уже поздно. – dwn

ответ

1

Сначала найдите, где он попал на весло. Вы можете сделать это так, например, в случае красного весла (синяя весла будет аналогичной, но вам может понадобиться поменять ang0 и ang1):

Края весла определяются двумя углами на вашем круге, ang0 и ANG1, где ang0 это нижний край, и ANG1 это верхний край

Предположим, центр окружности точки (0, 0) и мяч находится в точке pBall = (Xball, yBall)

шарик быть на определенном угле ballAng = atan2 (yBall, xBall) в диапазоне [ang0 .. ang1]

Теперь преобразуйте свое угловое положение на весле в параметр betwe en [0 .. 1]. Вы можете определить это как

u = (ballAng - ang0)/(ang1 - ang0); 

Теперь вы хотите, чтобы отобразить его на средней линии, например, так:

Сказать, что нижнее положение окружности осевую является точкой р0, а в верхней части центральной является точка p1

Теперь определим точку пересечения с осевой, как

p = p0 + u * (p1 - p0) 

в качестве вектора скорости для шара, это должно быть нормированный вектор разности

velBall = normalize(p - pBall) 

Надеется, что это имеет смысл

[EDIT: сделал поправку]

+0

Спасибо, что нашли время ответить. После этого я попытаюсь выполнить ваше решение и сделать дальнейшие обновления. Еще раз спасибо. –

+0

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

+0

Последнее понятие о нем: вы можете позволить прыгать, как обычно, но добавить некоторую магнитную силу к осевой линии – dwn

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