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 @@ - - - - - - - - - - + + + + + - + + + + + + - - - + + - - - - + + + + - - - - - - + + + + + +