为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能使用 robot.getPixelColor 让我的红球停在蓝框上?

为什么我不能使用 robot.getPixelColor 让我的红球停在蓝框上?

神不在的星期二 2022-12-21 10:54:50
标题。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,但没有任何区别。现在,幸运的是,我发现如果我将 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 事件分派线程中正确执行其任务。



查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信