【问题标题】:Java Image get desktop image and create macroJava Image 获取桌面图像并创建宏
【发布时间】:2011-08-16 12:43:32
【问题描述】:

嗯,我正在玩一个在线 Flash 游戏,你必须尽快点击白框。我怎样才能用 Java 自动化呢?盒子的位置是随机的。

我尝试使用Robot 类并使用getPixelColor,但这太慢了。

那么我需要做什么:

  1. 我的游戏窗口是 500x500 窗口,所以从中获取像素
  2. 找到 5x5 白框
  3. 点击它们

有什么建议吗?

【问题讨论】:

  • “有什么建议吗?”找到比在线游戏作弊更好的追求?
  • @Andrew Thompson :这只是一个随机的在线游戏,我的分数在那里并不重要,我想这样做的原因是学习用java进行图像识别。我的意思是……我这样做不是为了获得高分,哇,我太酷了,因为它只是随机游戏,我不在乎。我这样做是为了学习 JAVA

标签: java image macros image-recognition


【解决方案1】:

您可以使用 Rectangle 类,使用“包含”方法。

或者您可以创建自己的,基本上是这样的:

  1. 跟踪您的框、它们当前的 (x, y) 位置和它们的(宽度、高度)
  2. 使用 mouseClicked() 事件获取点击的 (x, y) 位置
  3. 在 mouseClicked() 内部,循环遍历所有框,并检查鼠标单击 (x, y) 是否在框内

例如,如果屏幕上有两个框:

boxA: (x, y, width, height) = (0, 0, 10, 10)
boxB: (x, y, width, height) = (20, 20, 10, 10)

这为您提供了两个框,每个框的大小均为 10x10 像素。 “boxA”的左上角位于 (0, 0),“boxB”的左上角位于 (20, 20)。

如果 "mouseClicked" 事件的 (x, y) 坐标是 (7, 7),那么它在 "boxA" 的范围内(因为点 (7, 7) 在 (0, 0) 和 ( 10, 10)

如果 "mouseClicked" 事件的 (x, y) 坐标是 (23, 25),那么它在 "boxB" 内,因为 (23, 25) 在 (20, 20) 和 (30, 30) 之间

你说得对,getPixelColor 对于你想要做的事情来说太慢了。循环遍历框列表会快得多。


如果你想深入研究一个更深层次的例子,这里有一篇关于collision detection 概念的文章。

【讨论】:

  • @normalocity :等等什么?问题是盒子的位置是随机的..所以我必须遍历所有像素才能找到它?还是我误解了什么?请解释
  • @Jaanus 您不会循环遍历像素,但您会保留对您绘制的 Rectangle 的引用并使用 download.oracle.com/javase/6/docs/api/java/awt/…, int) 来查看点击的点是否在其中。
  • @Jaanus - extraneon 是正确的 - 您只需遍历矩形,而不是像素。我还在一篇关于碰撞检测的文章的回答末尾添加了一个链接,这可能会为您提供更多说明。
  • @normalocity @extraneon:我不确定是否要绘制任何矩形。我在玩 FLASH 游戏。它是一个在线游戏..我希望我的java程序为我玩它..就像一个宏。我还能用你的答案吗?我浏览了链接,但似乎完全不同
  • 哦,等等 - 你只是想自动点击框?哇 - 我完全错过了。所有 Java 程序都在沙箱中运行,保护它们无法访问外部系统的信息(例如另一个完全独立的程序的屏幕上的内容)。我知道的唯一方法是通过 JNI (en.wikipedia.org/wiki/Java_Native_Interface) 使用 C/C++ 代码,但这会使您的问题变得更加复杂,因为您需要找到执行此操作的代码库,或者编写您自己的代码库.
猜你喜欢
  • 2020-06-25
  • 2018-08-20
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2019-06-05
  • 1970-01-01
相关资源
最近更新 更多