diff --git a/.idea/misc.xml b/.idea/misc.xml
index 32ddfac..6aecfa7 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -11,5 +11,5 @@
-
+
\ No newline at end of file
diff --git a/legend/TAB_探险_L35,881.png b/legend/城镇_探险_L35,881.png
similarity index 100%
rename from legend/TAB_探险_L35,881.png
rename to legend/城镇_探险_L35,881.png
diff --git a/legend/野外_L449,885.png b/legend/野外_L449,885.png
deleted file mode 100644
index 562fa75..0000000
Binary files a/legend/野外_L449,885.png and /dev/null differ
diff --git a/legend/野外_搜索_L15,632.png b/legend/野外_搜索_L15,632.png
deleted file mode 100644
index f16be24..0000000
Binary files a/legend/野外_搜索_L15,632.png and /dev/null differ
diff --git a/legend/野外_搜索_L233,881.png b/legend/野外_搜索_L233,881.png
deleted file mode 100644
index aa63fad..0000000
Binary files a/legend/野外_搜索_L233,881.png and /dev/null differ
diff --git a/legend/野外_搜索_L33,636.png b/legend/野外_搜索_L33,636.png
new file mode 100644
index 0000000..beeec43
Binary files /dev/null and b/legend/野外_搜索_L33,636.png differ
diff --git a/legend/野外_资源_等级1.png b/legend/野外_资源_等级1.png
deleted file mode 100644
index 3e66563..0000000
Binary files a/legend/野外_资源_等级1.png and /dev/null differ
diff --git a/legend/野外_资源_等级2.png b/legend/野外_资源_等级2.png
deleted file mode 100644
index 8a58e9a..0000000
Binary files a/legend/野外_资源_等级2.png and /dev/null differ
diff --git a/legend/野外_资源_等级3.png b/legend/野外_资源_等级3.png
deleted file mode 100644
index bb12912..0000000
Binary files a/legend/野外_资源_等级3.png and /dev/null differ
diff --git a/legend/野外_资源_等级4.png b/legend/野外_资源_等级4.png
deleted file mode 100644
index 89b19a8..0000000
Binary files a/legend/野外_资源_等级4.png and /dev/null differ
diff --git a/legend/野外_资源_等级5.png b/legend/野外_资源_等级5.png
deleted file mode 100644
index c256544..0000000
Binary files a/legend/野外_资源_等级5.png and /dev/null differ
diff --git a/legend/野外_资源_等级6.png b/legend/野外_资源_等级6.png
deleted file mode 100644
index 8eeda1e..0000000
Binary files a/legend/野外_资源_等级6.png and /dev/null differ
diff --git a/legend/野外_资源_等级7.png b/legend/野外_资源_等级7.png
deleted file mode 100644
index db07cfe..0000000
Binary files a/legend/野外_资源_等级7.png and /dev/null differ
diff --git a/legend/野外_资源_等级8.png b/legend/野外_资源_等级8.png
deleted file mode 100644
index 373608c..0000000
Binary files a/legend/野外_资源_等级8.png and /dev/null differ
diff --git a/src/main/java/com/example/jmacro/wjdr/JMacro.java b/src/main/java/com/example/jmacro/wjdr/JMacro.java
index 625abb2..a562dec 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMacro.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMacro.java
@@ -444,6 +444,23 @@ public class JMacro {
return waitAndFindPic(getScreenRect(), file, minSimilar, time, unit);
}
+ /**
+ * 等待并查找图片
+ *
+ * @param rect 查找区域
+ * @param legendName 图例名称
+ * @param minSimilar 最低相似度
+ * @param time 最长等待时间
+ * @param unit 最长等待时间单位
+ * @return 匹配图片区域
+ */
+ public ScreenRect waitAndFindPic(ScreenRect rect, String legendName, double minSimilar, long time, TimeUnit unit) {
+ if (!legendName.endsWith(".png")) {
+ legendName = legendName + ".png";
+ }
+ return waitAndMatchPic(rect, new File(legend, legendName), minSimilar, time, unit);
+ }
+
/**
* 等待并查找图片
*
diff --git a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java
index 3d7fbc6..8936402 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java
@@ -12,9 +12,14 @@ import com.example.jmacro.wjdr.base.ScreenRect;
public abstract class JMacroThread implements Runnable {
protected JMacro jMacro;
+ protected ScreenRect screenRect;
public JMacroThread(JMacro jMacro) {
this.jMacro = jMacro;
+ this.screenRect = location();
+ if (this.screenRect == null) {
+ throw new RuntimeException("未定位到视口区域");
+ }
}
/**
@@ -22,5 +27,13 @@ public abstract class JMacroThread implements Runnable {
*
* @return 视口区域
*/
- public abstract ScreenRect getScreen();
+ public abstract ScreenRect location();
+
+ public ScreenRect getScreenRect() {
+ return screenRect;
+ }
+
+ public JMacro getMacro() {
+ return jMacro;
+ }
}
diff --git a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java
index 4a0173b..f7e9ded 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java
@@ -1,6 +1,5 @@
package com.example.jmacro.wjdr;
-import com.example.jmacro.wjdr.demo.DemoThread;
import com.example.jmacro.wjdr.ui.FXMLUtil;
import com.example.jmacro.wjdr.util.ResourceUtil;
import javafx.application.Application;
@@ -32,8 +31,8 @@ public class JMainApplication extends Application {
stage.getIcons().add(icon);
// 展示UI
stage.show();
- // 启动服务
- JMainService.start();
+ // 服务初始化
+ JMainService.init();
}
public static void main(String[] args) {
diff --git a/src/main/java/com/example/jmacro/wjdr/JMainController.java b/src/main/java/com/example/jmacro/wjdr/JMainController.java
index 258236b..73409c3 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMainController.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMainController.java
@@ -15,7 +15,7 @@ public class JMainController {
*/
@FXML
private void onCapture() throws AWTException {
- ScreenRect screen = JMainService.getInstance().getThread().getScreen();
+ ScreenRect screen = JMainService.getInstance().getThread().getScreenRect();
File legend = JMainService.getInstance().getMacro().getLegend();
if (screen == null) {
Logger.error("请等待窗口定位");
@@ -27,4 +27,20 @@ public class JMainController {
awtException.printStackTrace();
}
}
+
+ /**
+ * 截图
+ */
+ @FXML
+ private void onStart() throws AWTException {
+ JMainService.start();
+ }
+
+ /**
+ * 截图
+ */
+ @FXML
+ private void onStop() throws AWTException {
+ JMainService.stop();
+ }
}
diff --git a/src/main/java/com/example/jmacro/wjdr/JMainService.java b/src/main/java/com/example/jmacro/wjdr/JMainService.java
index 9075eb0..76bd530 100644
--- a/src/main/java/com/example/jmacro/wjdr/JMainService.java
+++ b/src/main/java/com/example/jmacro/wjdr/JMainService.java
@@ -52,7 +52,15 @@ public class JMainService {
*/
private boolean run;
+ public static void init() {
+
+ }
+
public static void start() throws AWTException {
+ if (JMainService.getInstance().run) {
+ Logger.error("服务已启动");
+ return;
+ }
// 启动服务
Logger.info("启动服务");
JMainService.getInstance().run = true;
@@ -61,6 +69,10 @@ public class JMainService {
}
public static void stop() throws AWTException {
+ if (!JMainService.getInstance().run) {
+ Logger.error("服务未启动");
+ return;
+ }
Logger.info("停止服务");
JMainService.getInstance().run = false;
JMainService.getInstance().serviceThread.interrupt();
diff --git a/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java b/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java
index 42580d7..1c9c835 100644
--- a/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java
@@ -3,9 +3,10 @@ package com.example.jmacro.wjdr.demo;
import com.example.jmacro.wjdr.JMacro;
import com.example.jmacro.wjdr.JMacroThread;
import com.example.jmacro.wjdr.base.ScreenRect;
-import com.example.jmacro.wjdr.demo.task.TaskMineAttack;
-import com.example.jmacro.wjdr.demo.task.TaskMining;
-import com.example.jmacro.wjdr.demo.task.TaskRewards;
+import com.example.jmacro.wjdr.demo.task.Task_探险领取;
+import com.example.jmacro.wjdr.demo.task.Task_离线收益;
+import com.example.jmacro.wjdr.demo.task.Task_自动采矿;
+import com.example.jmacro.wjdr.demo.task.Task_采矿被攻击;
import com.example.jmacro.wjdr.util.Logger;
import com.example.jmacro.wjdr.util.TaskUtil;
@@ -14,11 +15,6 @@ import java.util.concurrent.TimeUnit;
public class DemoThread extends JMacroThread {
- /**
- * 视口
- */
- private ScreenRect gameScreen;
-
/**
* 脚本线程
*/
@@ -44,30 +40,31 @@ public class DemoThread extends JMacroThread {
}
@Override
- public ScreenRect getScreen() {
- return gameScreen;
- }
-
- @Override
- public void run() {
- // 定位mumu bar
- Logger.info("定位慕慕窗口");
+ public synchronized ScreenRect location() {
+ // 定位窗口
+ Logger.info("定位窗口");
ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d);
if (mumu == null) {
- throw new IllegalStateException("未检测到MuMu,请开启MuMu模拟器");
+ Logger.error("定位窗口失败");
+ return null;
}
Logger.info("定位慕慕窗口成功");
// 计算应用窗口返回
- gameScreen = new ScreenRect();
+ ScreenRect gameScreen = new ScreenRect();
gameScreen.setLeft(mumu.getLeft() - 428);
gameScreen.setTop(mumu.getBottom() + 7);
gameScreen.setRight(mumu.getRight());
gameScreen.setBottom(mumu.getBottom() + 951);
Logger.info("应用窗口位置:" + gameScreen.toString());
Logger.info("应用窗口大小:{}x{}", gameScreen.getRight() - gameScreen.getLeft(), gameScreen.getBottom() - gameScreen.getTop());
+ return gameScreen;
+ }
+
+ @Override
+ public void run() {
// 获取启动图标
Logger.info("定位启动图标");
- ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8);
+ ScreenRect launch = jMacro.waitAndFindPic(screenRect, "启动图标", 0.9, 5, TimeUnit.SECONDS);
if (launch != null) {
Logger.info("启动图标坐标:", launch.toString());
Logger.info("启动程序");
@@ -81,38 +78,45 @@ public class DemoThread extends JMacroThread {
while (true) {
jMacro.delay();
{ // 定位弹框,关闭弹框
- Logger.info("检测到广告弹框");
- ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_充值_L448,36", 0.8d);
+ ScreenRect rect = jMacro.matchPic(screenRect, "城镇_充值_L448,36", 0.8d);
if (rect != null) {
jMacro.mouseLeftClick(rect);
Logger.info("检测到广告弹框,关闭弹框");
}
}
-
- jMacro.delay();
- { // 定位离线收益弹框,关闭弹框
- ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_离线收益_L204,734", 0.9);
+ {// 定位离线收益
+ jMacro.delay();
+ ScreenRect rect = jMacro.matchPic(screenRect, "城镇_离线收益_L204,734", 0.9);
if (rect != null) {
jMacro.mouseLeftClick(rect);
Logger.info("检测到离线收益弹框,关闭弹框");
}
}
-
- jMacro.delay();
- // 定位主程序
- ScreenRect rect = jMacro.matchPic(gameScreen, "野外_L444,888", 0.9);
- if (rect != null) {
- Logger.info("程序主界面已就绪");
- return rect;
+ {// 定位野外
+ jMacro.delay();
+ ScreenRect rect = jMacro.matchPic(screenRect, "野外_L444,888", 0.9);
+ if (rect != null) {
+ Logger.info("当前区域【城镇】");
+ return rect;
+ }
+ }
+ // 定位城镇
+ {
+ jMacro.delay();
+ ScreenRect rect = jMacro.matchPic(screenRect, "城镇_L456,887", 0.9);
+ if (rect != null) {
+ Logger.info("当前区域【野外】");
+ Logger.info("返回区域【城镇】");
+ jMacro.mouseLeftClick(rect);
+ }
}
}
}, 30, TimeUnit.SECONDS);
- if (城镇 == null) {
+ if (城镇 == null && schedule != null) {
schedule.cancel(true);
schedule = null;
Logger.info("未扫描到主界面:退出线程");
-
return;
}
@@ -121,17 +125,21 @@ public class DemoThread extends JMacroThread {
Logger.info("进入任务线程");
TaskUtil.timeTask((Runnable) () -> {
while (true) {
+ // 欢迎回来弹框
+ jMacro.delayNormal();
+ new Task_离线收益(jMacro, screenRect).run();
+
// 矿场攻击检测任务
jMacro.delayNormal();
- new TaskMineAttack(jMacro, gameScreen).run();
+ new Task_采矿被攻击(jMacro, screenRect).run();
// 矿场攻击检测任务
jMacro.delayNormal();
- new TaskRewards(jMacro, gameScreen).run();
+ new Task_探险领取(jMacro, screenRect).run();
// 自动采矿任务
jMacro.delayNormal();
- new TaskMining(jMacro, gameScreen).run();
+ new Task_自动采矿(jMacro, screenRect).run();
}
}, 10, TimeUnit.MINUTES);
}
diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_探险领取.java
similarity index 94%
rename from src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/Task_探险领取.java
index 27b52a0..d1113b9 100644
--- a/src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_探险领取.java
@@ -4,9 +4,9 @@ import com.example.jmacro.wjdr.JMacro;
import com.example.jmacro.wjdr.base.ScreenRect;
import com.example.jmacro.wjdr.util.Logger;
-public class TaskRewards extends BaseTask {
+public class Task_探险领取 extends BaseTask {
- public TaskRewards(JMacro jMacro, ScreenRect screenRect) {
+ public Task_探险领取(JMacro jMacro, ScreenRect screenRect) {
super(jMacro, screenRect);
}
@@ -15,7 +15,7 @@ public class TaskRewards extends BaseTask {
Logger.info("》》》探险奖励领取开始》》》");
Logger.info("定位【探险】按钮");
- ScreenRect TAB_探险 = jMacro.waitAndMatchPic(this.screenRect, "TAB_探险_L35,881", 0.9);
+ ScreenRect TAB_探险 = jMacro.waitAndMatchPic(this.screenRect, "城镇_探险_L35,881", 0.9);
if (TAB_探险 == null) {
return;
}
@@ -34,7 +34,6 @@ public class TaskRewards extends BaseTask {
ScreenRect 探险_不可领取 = jMacro.waitAndMatchPic(this.screenRect, "探险_不可领取_L420,667", 0.8);
if (探险_不可领取 != null) {
Logger.info("探险不可领取");
- return;
} else {
Logger.info("定位领取按钮");
ScreenRect 探险_领取 = jMacro.waitAndMatchPic(this.screenRect, "探险_领取_L426,667", 0.8);
diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_离线收益.java b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_离线收益.java
new file mode 100644
index 0000000..79d82ba
--- /dev/null
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_离线收益.java
@@ -0,0 +1,25 @@
+package com.example.jmacro.wjdr.demo.task;
+
+import com.example.jmacro.wjdr.JMacro;
+import com.example.jmacro.wjdr.base.ScreenRect;
+import com.example.jmacro.wjdr.util.Logger;
+
+public class Task_离线收益 extends BaseTask {
+
+ public Task_离线收益(JMacro jMacro, ScreenRect screenRect) {
+ super(jMacro, screenRect);
+ }
+
+ @Override
+ public void run() {
+ Logger.info("》》》检测离线收益弹框开始》》》");
+ jMacro.delay();
+ // 定位离线收益弹框,关闭弹框
+ ScreenRect rect = jMacro.matchPic(screenRect, "城镇_离线收益_L204,734", 0.9);
+ if (rect != null) {
+ jMacro.mouseLeftClick(rect);
+ Logger.info("检测到离线收益弹框,关闭弹框");
+ }
+ Logger.info("》》》检测离线收益弹框结束》》》");
+ }
+}
diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java
similarity index 94%
rename from src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java
index 57af0b0..0afe9a8 100644
--- a/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java
@@ -8,9 +8,9 @@ import com.example.jmacro.wjdr.util.Logger;
import java.io.File;
-public class TaskMining extends BaseTask {
+public class Task_自动采矿 extends BaseTask {
- public TaskMining(JMacro jMacro, ScreenRect screenRect) {
+ public Task_自动采矿(JMacro jMacro, ScreenRect screenRect) {
super(jMacro, screenRect);
}
@@ -24,12 +24,12 @@ public class TaskMining extends BaseTask {
Logger.info("当前界面【野外】");
} else {
Logger.info("定位【野外】");
- ScreenRect 野外 = jMacro.waitAndMatchPic(this.screenRect, "野外_L449,885", 0.99);
+ ScreenRect 野外 = jMacro.waitAndMatchPic(this.screenRect, "野外_L444,888", 0.99);
if (野外 == null) {
Logger.error("定位【野外】失败,采矿终止");
return;
}
- Logger.error("定位【野外】成功,{}", 野外.toString());
+ Logger.info("定位【野外】成功,{}", 野外.toString());
Logger.info("点击【野外】,坐标{}", JSONUtil.toJsonStr(野外.getCenter()));
jMacro.mouseLeftClick(野外);
@@ -37,7 +37,7 @@ public class TaskMining extends BaseTask {
}
Logger.info("定位资源搜索按钮");
- ScreenRect 野外搜索 = jMacro.waitAndMatchPic(this.screenRect, "野外_搜索_L15,632", 0.8);
+ ScreenRect 野外搜索 = jMacro.waitAndMatchPic(this.screenRect, "野外_搜索_L33,636", 0.5);
if (野外搜索 == null) {
Logger.error("未检测到【资源搜索按钮】,采矿终止");
return;
@@ -57,7 +57,7 @@ public class TaskMining extends BaseTask {
}
// 检测是否是搜索界面
- ScreenRect 搜索 = jMacro.waitAndMatchPic(this.screenRect, "野外_搜索_L233,881", 0.98);
+ ScreenRect 搜索 = jMacro.waitAndMatchPic(this.screenRect, "野外_搜索_L18,633", 9);
if (搜索 != null) {
Logger.info("退出资源搜索界面");
jMacro.mouseLeftClick(this.screenRect);
diff --git a/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_采矿被攻击.java
similarity index 78%
rename from src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java
rename to src/main/java/com/example/jmacro/wjdr/demo/task/Task_采矿被攻击.java
index 4ccf0c4..20e3fe5 100644
--- a/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java
+++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_采矿被攻击.java
@@ -4,9 +4,9 @@ import com.example.jmacro.wjdr.JMacro;
import com.example.jmacro.wjdr.base.ScreenRect;
import com.example.jmacro.wjdr.util.Logger;
-public class TaskMineAttack extends BaseTask {
+public class Task_采矿被攻击 extends BaseTask {
- public TaskMineAttack(JMacro jMacro, ScreenRect screenRect) {
+ public Task_采矿被攻击(JMacro jMacro, ScreenRect screenRect) {
super(jMacro, screenRect);
}
diff --git a/src/main/java/com/example/jmacro/wjdr/util/Capture.java b/src/main/java/com/example/jmacro/wjdr/util/Capture.java
index 0c0e8f7..2102082 100644
--- a/src/main/java/com/example/jmacro/wjdr/util/Capture.java
+++ b/src/main/java/com/example/jmacro/wjdr/util/Capture.java
@@ -214,9 +214,8 @@ public class Capture extends JFrame {
}
public void close() {
- // 关闭应用时要释放资源
+ setVisible(false);
dispose();
- System.exit(0);
}
/**
diff --git a/src/main/resources/main.fxml b/src/main/resources/main.fxml
index c145989..c2cff41 100644
--- a/src/main/resources/main.fxml
+++ b/src/main/resources/main.fxml
@@ -1,45 +1,52 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+