У меня есть игра Pong-360, в которой дугообразные весла отклоняют шар, который должен оставаться в пределах круговой границы. Если мяч не встречается с веслом, когда он добирается до границы, он продолжает выходить за пределы поля, и игрок должен последний раз поразить бал. Проблема, с которой я сталкиваюсь, возвращает мяч в правильном направлении при ударе с помощью весла. Если мяч контактирует с определенной половиной лопасти, он должен отскакивать в этом направлении, но в любом случае должен быть возвращен на противоположную сторону границы без повторного удара по той же стороне границы.Отскок мяча в круге
Прямо сейчас я совершил прыжок, разделив границу на 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.
Любая помощь будет оценена по достоинству.
Стрелка, который вы нарисовали не представляется возможными. Обратите внимание, что если весло было в самом правом постулировании, это отклонение приведет к тому, что он достигнет своей собственной стороны. Более того, не представляется возможным работать очень разумно. Если бы красное весло было сверху, например, попадание правой части весла также отправило мяч против собственной стены красного. – dwn
Вы можете заставить его попасть в центральную линию, привязав к нему векторы, но вместо этого вы можете работать подбором в стратегии. – dwn
В качестве альтернативы, возможно, вы можете разделить круг на четверти, и каждый игрок будет управлять двумя лопастями на 180 градусов друг от друга (или наоборот, если на квадрате). Если это глупая идея, извините, это уже поздно. – dwn