(Java) Мяч реалистично отскакивает от ракетки

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

//advance the ball
            ball.advance();
            //check if ball should bounce off canvas sides
            if(ball.getCenterX()+ ball.getRadius() > canvas.getWidth()) ball.setDirectionX(LEFT);
            if(ball.getCenterX() - ball.getRadius() <0) ball.setDirectionX(RIGHT);

            if(ball.getCenterY()+ ball.getRadius() > canvas.getHeight()) ball.setDirectionY(UPWARDS);
            if(ball.getCenterY() - ball.getRadius() < 0) ball.setDirectionY(DOWNWARDS);

Проблема в том, что я не уверен, должен ли я изменить эти операторы if или добавить больше, и я не уверен, как правильно заставить мяч отскакивать от весла. Я попытался добавить пару операторов if, и лучшее, что у меня получилось, было следующим: GIF игры. Я добавил следующие операторы:

if(ball.getCenterY()+ ball.getRadius() > paddle.getTopLeftY()) ball.setDirectionY(UPWARDS); if(ball.getCenterY()+ ball.getRadius() < paddle.getTopLeftX()) ball.setDirectionY(DOWNWARDS);

Спасибо за любую помощь, которую вы могли бы дать :)


person user3390522    schedule 23.09.2015    source источник
comment
Рассмотрите возможность предоставления запускаемого примера, демонстрирующего вашу проблему. Это не дамп кода, а пример того, что вы делаете, который подчеркивает проблему, с которой вы столкнулись. Это приведет к меньшей путанице и лучшим ответам.   -  person MadProgrammer    schedule 23.09.2015
comment
Я думаю, что у меня слишком много кода, чтобы сделать короткий работающий пример/я действительно не знаю, как это сделать, потому что я использую пару классов. Я мог бы опубликовать конкретные части, если это может помочь вам помочь мне. Проблема в том, что я не могу понять, как настроить операторы if так, чтобы мяч отскакивал от ракетки и поднимался вверх или падал на дно, если он не попал в ракетку. С первым фрагментом кода, который я опубликовал, он выглядит так: окно находит, но проходит прямо через весло, и я пытаюсь понять, как заставить его отскочить.   -  person user3390522    schedule 23.09.2015


Ответы (1)


Я считаю, что вам нужно, чтобы мяч отскакивал, когда координаты обе X и Y достигают ракетки.

Прямо сейчас вы просто используете ball.getCenterY()+ ball.getRadius() > paddle.getTopLeftY(), поэтому не имеет значения, находится ли мяч рядом с ракеткой по оси X.

Попробуйте с чем-то вроде этого.

(возможно, вам придется настроить < и > в зависимости от того, увеличиваются или уменьшаются значения для X при движении слева направо)

boolean bounceInY = ball.getCenterY()+ ball.getRadius() > paddle.getTopLeftY();
boolean bounceInX = (ball.getCenterX()+ ball.getRadius() > paddle.getTopLeftX()) && (ball.getCenterX()+ ball.getRadius() < paddle.getTopLeftX() + paddle.getWidth());
if (bounceInY && bounceInX) ball.setDirectionY(UPWARDS);
person eugenioy    schedule 23.09.2015
comment
Кажется, что при добавлении этого кода ничего не происходит (я тоже напортачил с ‹ и ›). Все еще проходит через весло: gyazo.com/d1b30c91e6485e9d24c85d1682fd50a3 Однако я пытался добавить эту строку: if (ball .getCenterY() + ball.getRadius() › paddle.getTopLeftY() && ball.getCenterY() + ball.getRadius() ‹ paddle.getTopLeftX() + paddle.getWidth()) ball.setDirectionY(UPWARDS); и это работает немного, но не стабильно. Кажется, что один раз он отскакивает от весла, а в следующий раз проходит насквозь. есть идеи? - person user3390522; 23.09.2015
comment
Из вашего кода кажется, что вы используете paddle.getTopLeftX() + paddle.getWidth() вместо paddle.getTopRightX(). Я изменяю свой ответ, чтобы использовать ту же структуру. Возможно так и работает.. - person eugenioy; 23.09.2015
comment
Хорошо, теперь он начинает отскакивать от весла с вашим кодом: gyazo.com/0ad8c31942a308d7ba39e001b419b66e, но это немного глючит, так как кажется, что мяч иногда отскакивает из-под весла, а иногда и сверху. Кроме того, когда он промахивается, кажется, что он больше не достигает нижней части окна, он отскакивает, прежде чем доберется до дна. - person user3390522; 23.09.2015
comment
Это может быть связано с тем, насколько вы увеличиваете координаты X и Y мяча в каждом цикле. Попробуйте уменьшить шаги. Я не думаю, что смогу помочь вам намного больше, учитывая объем вашего ответа, возможно, вам следует опубликовать новый вопрос с этой новой проблемой и включить больше кода. - person eugenioy; 23.09.2015
comment
Ладно спасибо за помощь! Я собираюсь взять перерыв и попытаться понять это завтра. - person user3390522; 23.09.2015