標題。GUI 如下所示:Ball Puzzle GUI下面的代碼是我的定時器任務,負責控制球的向下運動,調用者:timer.scheduleAtFixedRate(moveDown, 0, 20);每當按下箭頭鍵時,球應該會繼續朝那個方向移動,直到它遇到一個正方形。我知道我現在正在使用 .cancel() 但我打算通過臨時暫停 TimerTask 來解決這個問題。雖然不向 X 或 Y 值添加任何內容,但球永遠不會停止。(我應該提一下,當它到達底部時,它會循環回到頂部)當不更改 X 或 Y 值時,輸出的顏色似乎會發生變化。例如,第一次在 (0,360) 時,輸出顏色為 (208,208,208),而下一次在 (0,360) 時,輸出顏色為 (240,240,240)。當添加我認為會在框的邊緣停止它的東西時,Y + 51,它仍然沒有停止。檢測到的唯一顏色是 (208,208,208),這是一種灰色。如果我同時加上 Y+51 和 X+25,球仍然沒有停止,只輸出灰色。請注意,我已將速度更改為 1,但沒有任何區別?,F在,幸運的是,我發現如果我將 80 加到 Y 上,將 25 加到 X 上,它就會停在盒子的邊緣。我還發現,如果我為負責向上移動球(速度為負)的 TimerTask 添加 25 到 Y 和 25 到 X,球將停止在距離框邊緣 1 個像素的位置。 public void run() { try { Robot robot = new Robot(); int y = ball.positionY + 80; int x = ball.positionX + 25; System.out.println(ball.positionX); System.out.println(ball.positionY); color = robot.getPixelColor(x, y); System.out.println("Red = " + color.getRed()); System.out.println("Green = " + color.getGreen()); System.out.println("Blue = " + color.getBlue()); } catch (AWTException e) { e.printStackTrace(); } if((color.getRed() == 0) && (color.getGreen() == 0) && (color.getBlue() == 255)){ moveDown.cancel(); moving = false; } else{ ball.positionY += 5; if (ball.positionY > 670) { ball.positionY = 0; } } ball.repaint(); }有誰知道到底發生了什么?我還沒有弄清楚右/左方向,因為似乎沒有模式。
1 回答
拉莫斯之舞
TA貢獻1820條經驗 獲得超10個贊
機器人不是檢測方塊的可靠方法。雙緩沖可能意味著您的像素實際上并未顯示。
由于您自己的代碼正在繪制正方形,因此請將這些正方形的坐標保存在私有字段中,并使用它們來檢查碰撞而不是檢查像素顏色:
private final Collection<Rectangle> squares = new ArrayList<>();
// ...
if (squares.stream().anyMatch(sq -> sq.contains(x, y))) {
moveDown.cancel();
moving = false;
} else {
ball.positionY += 5;
if (ball.positionY > 670) {
ball.positionY = 0;
}
}
另請注意,Swing 對于多線程的使用是不安全的。您應該使用javax.swing.Timer而不是 java.util.Timer,因為它在 AWT 事件分派線程中正確執行其任務。
添加回答
舉報
0/150
提交
取消
