atHorizontalEdge
и atVerticalEdge
могут быть объявлены внутри или вне цикла while
, это не важно.
Важно то, что следующее вычисляется только один раз ,перед началом цикла:
atHorizontalEdge = (ball.getX() == getWidth() - BALL_SIZE) || ball.getX() == 0 ;
atVerticalEdge = (ball.getY() == getHeight() - BALL_SIZE) || ball.getY() == 0 ;
Поэтому каждый из atHorizontalEdge
и atVerticalEdge
будет иметь одинаковое значение от начала до конца вашего run
метода (который навсегда).
Вы, очевидно, хотите, чтобы две вышеупомянутые строки выполнялись на каждой итерации в вашем цикле, поскольку они не собираются обновляться сами по себе ...
while (true) {
atHorizontalEdge = (ball.getX() == getWidth() - BALL_SIZE) || ball.getX() == 0 ;
atVerticalEdge = (ball.getY() == getHeight() - BALL_SIZE) || ball.getY() == 0 ;
...
}
РЕДАКТИРОВАТЬ: Кроме того, было бы лучше проверить, если x и y были больше или равны ширина / высота, и меньше или равно 0 по двум причинам:
- Если вы решите изменить приращение с 1, вы можете пропустить это точное значение и вызвать ошибку, но что более важно:
- Вы используете
double
, и представление числа с плавающей точкой может не быть точно с чем вы сравниваете его, так что ==
может вызвать ошибки, и шар можетПройдите край и продолжайте идти.
т.е.ball.getX() >= getWidth() ... ball.getX() <= 0
Что должен знать каждый компьютерщик об арифметике с плавающей точкой