From a041f12ccfd3098669d9b0ddcd5a2193be9c297e Mon Sep 17 00:00:00 2001 From: wangbing Date: Mon, 2 Sep 2024 16:22:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ŸŽé•‡_L449,887.png => 城镇#L449,887.png} | Bin ...ŸŽé•‡_L456,887.png => 城镇#L456,887.png} | Bin ..._L448,36.png => 城镇#充值_L448,36.png} | Bin .../{城镇_广告.png => 城镇#广告.png} | Bin ..._L35,881.png => 城镇_探险#L35,881.png} | Bin ...ng => 城镇_欢迎新æˆå‘˜#L199,773.png} | Bin ...4.png => 城镇_离线收益#L204,734.png} | Bin ...L3,174.png => 城镇_é¿éš¾è€…#L3,174.png} | Bin ...7.png => 探险_ä¸å¯é¢†å–#L420,667.png} | Bin ...240,854.png => 探险_按钮#L240,854.png} | Bin ...8.png => 探险_获得奖励#L196,218.png} | Bin ...返回_L4,4.png => 探险_返回#L4,4.png} | Bin ...426,667.png => 探险_领å–#L426,667.png} | Bin ...30,664.png => 探险_领å–2#L230,664.png} | Bin ...‡Žå¤–_L444,888.png => 野外#L444,888.png} | Bin ..._L16,759.png => 野外_任务#L16,759.png} | Bin ...226,879.png => 野外_æœç´¢#L226,879.png} | Bin legend/野外_木æ.png | Bin 10562 -> 0 bytes legend/野外_煤矿.png | Bin 12053 -> 0 bytes legend/野外_生肉.png | Bin 11907 -> 0 bytes legend/野外_资æº_+.png | Bin 2445 -> 0 bytes legend/野外_资æº_-.png | Bin 1873 -> 0 bytes legend/野外_资æº_出å¾.png | Bin 2889 -> 0 bytes legend/野外_资æº_采集.png | Bin 2720 -> 0 bytes legend/野外_资æº_é‡‡é›†é˜Ÿä¼æ»¡.png | Bin 9754 -> 0 bytes legend/野外_é“矿.png | Bin 9995 -> 0 bytes legend/首页_广告关闭按钮.png | Bin 1312 -> 0 bytes .../java/com/example/jmacro/wjdr/JMacro.java | 432 +++++++++--------- .../example/jmacro/wjdr/JMainApplication.java | 38 +- .../example/jmacro/wjdr/JMainController.java | 14 +- .../com/example/jmacro/wjdr/JMainService.java | 20 +- .../com/example/jmacro/wjdr/base/Legend.java | 119 +++++ .../jmacro/wjdr/demo/MacroForWJDR.java | 20 +- .../wjdr/demo/task/Task_探险领å–.java | 14 +- .../wjdr/demo/task/Task_æ”¶ç•™é¿éš¾è€….java | 4 +- .../wjdr/demo/task/Task_离线收益.java | 2 +- .../wjdr/demo/task/Task_自动采矿.java | 13 +- .../com/example/jmacro/wjdr/tool/Capture.java | 47 +- src/main/resources/main.fxml | 4 +- 39 files changed, 452 insertions(+), 275 deletions(-) rename legend/{城镇_L449,887.png => 城镇#L449,887.png} (100%) rename legend/{城镇_L456,887.png => 城镇#L456,887.png} (100%) rename legend/{城镇_充值_L448,36.png => 城镇#充值_L448,36.png} (100%) rename legend/{城镇_广告.png => 城镇#广告.png} (100%) rename legend/{城镇_探险_L35,881.png => 城镇_探险#L35,881.png} (100%) rename legend/{城镇_欢迎新æˆå‘˜_L199,773.png => 城镇_欢迎新æˆå‘˜#L199,773.png} (100%) rename legend/{城镇_离线收益_L204,734.png => 城镇_离线收益#L204,734.png} (100%) rename legend/{城镇_é¿éš¾è€…_L3,174.png => 城镇_é¿éš¾è€…#L3,174.png} (100%) rename legend/{探险_ä¸å¯é¢†å–_L420,667.png => 探险_ä¸å¯é¢†å–#L420,667.png} (100%) rename legend/{探险_按钮_L240,854.png => 探险_按钮#L240,854.png} (100%) rename legend/{探险_获得奖励_L196,218.png => 探险_获得奖励#L196,218.png} (100%) rename legend/{探险_返回_L4,4.png => 探险_返回#L4,4.png} (100%) rename legend/{探险_领å–_L426,667.png => 探险_领å–#L426,667.png} (100%) rename legend/{探险_领å–2_L230,664.png => 探险_领å–2#L230,664.png} (100%) rename legend/{野外_L444,888.png => 野外#L444,888.png} (100%) rename legend/{野外_任务_L16,759.png => 野外_任务#L16,759.png} (100%) rename legend/{野外_æœç´¢_L226,879.png => 野外_æœç´¢#L226,879.png} (100%) delete mode 100644 legend/野外_木æ.png delete mode 100644 legend/野外_煤矿.png delete mode 100644 legend/野外_生肉.png delete mode 100644 legend/野外_资æº_+.png delete mode 100644 legend/野外_资æº_-.png delete mode 100644 legend/野外_资æº_出å¾.png delete mode 100644 legend/野外_资æº_采集.png delete mode 100644 legend/野外_资æº_é‡‡é›†é˜Ÿä¼æ»¡.png delete mode 100644 legend/野外_é“矿.png delete mode 100644 legend/首页_广告关闭按钮.png create mode 100644 src/main/java/com/example/jmacro/wjdr/base/Legend.java diff --git a/legend/城镇_L449,887.png b/legend/城镇#L449,887.png similarity index 100% rename from legend/城镇_L449,887.png rename to legend/城镇#L449,887.png diff --git a/legend/城镇_L456,887.png b/legend/城镇#L456,887.png similarity index 100% rename from legend/城镇_L456,887.png rename to legend/城镇#L456,887.png diff --git a/legend/城镇_充值_L448,36.png b/legend/城镇#充值_L448,36.png similarity index 100% rename from legend/城镇_充值_L448,36.png rename to legend/城镇#充值_L448,36.png diff --git a/legend/城镇_广告.png b/legend/城镇#广告.png similarity index 100% rename from legend/城镇_广告.png rename to legend/城镇#广告.png diff --git a/legend/城镇_探险_L35,881.png b/legend/城镇_探险#L35,881.png similarity index 100% rename from legend/城镇_探险_L35,881.png rename to legend/城镇_探险#L35,881.png diff --git a/legend/城镇_欢迎新æˆå‘˜_L199,773.png b/legend/城镇_欢迎新æˆå‘˜#L199,773.png similarity index 100% rename from legend/城镇_欢迎新æˆå‘˜_L199,773.png rename to legend/城镇_欢迎新æˆå‘˜#L199,773.png diff --git a/legend/城镇_离线收益_L204,734.png b/legend/城镇_离线收益#L204,734.png similarity index 100% rename from legend/城镇_离线收益_L204,734.png rename to legend/城镇_离线收益#L204,734.png diff --git a/legend/城镇_é¿éš¾è€…_L3,174.png b/legend/城镇_é¿éš¾è€…#L3,174.png similarity index 100% rename from legend/城镇_é¿éš¾è€…_L3,174.png rename to legend/城镇_é¿éš¾è€…#L3,174.png diff --git a/legend/探险_ä¸å¯é¢†å–_L420,667.png b/legend/探险_ä¸å¯é¢†å–#L420,667.png similarity index 100% rename from legend/探险_ä¸å¯é¢†å–_L420,667.png rename to legend/探险_ä¸å¯é¢†å–#L420,667.png diff --git a/legend/探险_按钮_L240,854.png b/legend/探险_按钮#L240,854.png similarity index 100% rename from legend/探险_按钮_L240,854.png rename to legend/探险_按钮#L240,854.png diff --git a/legend/探险_获得奖励_L196,218.png b/legend/探险_获得奖励#L196,218.png similarity index 100% rename from legend/探险_获得奖励_L196,218.png rename to legend/探险_获得奖励#L196,218.png diff --git a/legend/探险_返回_L4,4.png b/legend/探险_返回#L4,4.png similarity index 100% rename from legend/探险_返回_L4,4.png rename to legend/探险_返回#L4,4.png diff --git a/legend/探险_领å–_L426,667.png b/legend/探险_领å–#L426,667.png similarity index 100% rename from legend/探险_领å–_L426,667.png rename to legend/探险_领å–#L426,667.png diff --git a/legend/探险_领å–2_L230,664.png b/legend/探险_领å–2#L230,664.png similarity index 100% rename from legend/探险_领å–2_L230,664.png rename to legend/探险_领å–2#L230,664.png diff --git a/legend/野外_L444,888.png b/legend/野外#L444,888.png similarity index 100% rename from legend/野外_L444,888.png rename to legend/野外#L444,888.png diff --git a/legend/野外_任务_L16,759.png b/legend/野外_任务#L16,759.png similarity index 100% rename from legend/野外_任务_L16,759.png rename to legend/野外_任务#L16,759.png diff --git a/legend/野外_æœç´¢_L226,879.png b/legend/野外_æœç´¢#L226,879.png similarity index 100% rename from legend/野外_æœç´¢_L226,879.png rename to legend/野外_æœç´¢#L226,879.png diff --git a/legend/野外_木æ.png b/legend/野外_木æ.png deleted file mode 100644 index bf77b434466c54b7672bf415f55850ffea10512b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10562 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 diff --git a/legend/野外_生肉.png b/legend/野外_生肉.png deleted file mode 100644 index 8f05f7ebf570025f3ff1e9926bdfa6e1c3ec0ef3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11907 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 JPDHLkV1gSKG~xgN diff --git a/legend/野外_资æº_+.png b/legend/野外_资æº_+.png deleted file mode 100644 index 047491cb1ec6f16c1bc0537993b3283284a15f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2445 zcmV;833B#{P)pFAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ_6G=otRCwC7m`jfwR~5&9=iXb@UES03wmmZrfxO5AhkyhTK_V!yMy!yK*zqy= z5G+{27hu7XWk5)Pgu)_<62%ZFArDV%k3F7#S6AJ~VNpHf_RM(34(3WVJ*B#J@44rH z&j0*R$xA=^m9j8YAx6Qc7Bior3LMQ49@~(F2w0QIZ6J3ZWAwx{w|EnyGV^U_+9PWf zeEa)fXJu^#>y(rl;~$G{2nNB|k?WuBbM4=slE(Wiw<}s%K;)Q#3Is2dX`Qu8Px9k8 zUgnt>x43Yjz&X=+7DXSQ|4@OHU_1(Z_R$^Q{_ER(`2NSlYCxwI5NUREiW0mK%muD| z_ZxiY2UocC#0J(nW)BAs~k$W2-CVon1 z#NhmSND%rE1MF;D*0(nK$_vl1w|k3nT;kR*taJJD4tuvU@|LiDL1?$&?hyK=o&nRn zR0{~>No+PwiU3P(ODh-Rf|Vy&KpI2qsO*m-YJ{Cjmi3)&Sbmmpu!q}udW)NrjQ$|f z&V}23OXi?Igt9&#s=>tb+0BZlsM%;4Of-zW@Np3G<&4XhGMqh|Kb6Ll{juV5$TCZ> zmord@>-0M84iu9q)(E%zjqBxpC!IPfpZMVOF+YDk<7clev%O+LU^q*>^+CmN|6b7_ zDjRF9b17aGY7ch@2{B5y<2b7k^?(Ht?T7@U}#%sQMA%yE3>o~KgqgqTQCNg}8?ypN}+8Pw(=g0+Hka?ity2b#NHT#m_FIK-YQqheA<6VGf~BMzK^MR8hjsSQu9Sz z2flqV;}@?LJbTe1vH-#<>Sgvx1yTe}`vMh5v(~ zInhMu!gY9WPvnp|Q*Yo#}YqFwqf(wts z?MRBMo{F-llINDTo$-gahy3|HOYRIJN)kwF`TA2!y!zFQtbMV{j4p2X9 zgs?&giBVON^>SX=DCVr7C*v?R)yHW{ga~@rR?4D*iOdQc8(qrL9)sZ+#E=sBWbv-U zX5D?D3rY{WgDGydi;>VYO9-8!U~6p$*UCsH-j^<_5RwvuhZu0G@!VEuX=RPCJ>O;p}3hbZh#^i0ucMCkQa*xG5)$`T<7##)MQm!jw($M8MP3P+0Q9Okn|tJ9&?=^U*T zRVZ(bQNn{m*a)3&!N%4)MavLkoL7yx!|slD%Q#UweVvDn>X;#KY_CZZ8pIL^R?^9#p^7r;T22Q6Krun?ru_y)J9rCZ=Xy z`P)Yof4VkfbGlAc5OAVDg#OZZjVX6q~J*J-F#FxxUeixxv{CXXIRot}2KXE?($T zk8ZI)m~ivJKuU-vdfl9@jUKH$n;*F0!3SllD)^{O>qJ>8p$?enaS|u^;gG@dDy__6 zt)<%%>_apWs!FTq@U`cjW-{oLG!dH)iB4~YPH!2EA*m9g5<|jSa{}_FEGm;(WH_#w zjK=s`Nt=kXafl!6GFjf>ws9zeH9{vpAL^zW3a!o(dAoCDGy;b*F2+P15_|oc{y4JI zv0PluY3KJoM#Z3v%gFvPus^7o+_?+=n^Y`7wJik=%Ue+a4-yfdaGnKQw~N3P0IF08*79*D&uM7_8_o7u9*%d=$#w1N1u|} z39iTz-rr{0zeZ>kjO-<@D-5QVl}@C{ZPQRas!~1bbCuiunrYp@I}3@M{TgEg=M2*- zaxjSuCV{G)VEUhskFL>?AuX41nKLY3&Yo#Hik6niurPhCCCTkw=%(G<>NF zlPaRpAfdphQa-=aeE6wDqV@qTCz# zMw(EPg_3HrN1SxQx^orBmuW;)nwn|VlW9d}Jh=nsEXLX+2Kny*!lkx%jM(D%00000 LNkvXXu0mjf>y@Vm diff --git a/legend/野外_资æº_-.png b/legend/野外_资æº_-.png deleted file mode 100644 index f01387e0606d0bb210910549681d82203092f31e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 zcmV-X2d?;uP)pFAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?*GWV{RCwCNn8|Nk#}USV)vx=#S;&!wltisw6fKUO*a@I4z9hNinB4Nu{nS-yUr zf8Bq~KR)>nJDZParv=t~rQ|&CeE%*V|N292++M+1OIg6irn0%Ml;sT6nZ&gQCjt!z ziwnZi`Gj-b4nO|IEj*F?f65t;o?-JUqkH2TKm7PEH*Q@bYd8pyBuZ65Z%3JW;jFMB zAhCWl0vkK9-B+&Wk&9Paym#*%o_(>+XP=hXm@RVg&TW>iTxC3V#0pwXr7V?E4rLHj zVL$CoWjZ4s5P?`J+d(N;l_0RZe2#a2^dS!)46#Xbf!6Xey-9-?FC(pn&}zb91e-kw zX9?^GixEas;pv*{QwnE6U_#>FF3aUzC z1QD|n~&`1Tpi%$2BWWJ7XD1-=$8MHHbwXZvcrB+y45Ed=O1HRXN0Id-aBj^E$y4yie zZ=kAYE*YxzSC8Vnv5AlvnKfF6n_ZJA!#vW@BR z`#yS*$<5U8q#wBdsHEF6EVq+W*U%@Mp1(XS$&KKwyb={vop;+-Rf#$ao7VX%Gq(#u zt6})67y0Ag2RwQ{WqC23bMGX9jv?}NJ?GQso=cY(u!&IZn<B$uG84(U<6hZPF(NE>ySyDd z>(AHl`2aa~a)dpAlF;gOS$XSST-HQ2yuN)>#frpvoR9jXb16$Jmswm|B6xqg%oQO? z8YGE3M2vaT#5xZwp(Oe+ADRzViKsfOQ3mH4IHxDz+5wr0M=*94y{JkI9!so<-lK6> z%jD1t@zffp$66Y-P8=hEMo$dkJ8v|1r6fir#E4P#RF$XlfuLtNJfB2nR0$D$P<$0I zAy(vGDZHWbHR|umLI58kr3YVnj1Y*SWLlI=ibxf{J@4&yI!D#o5S2-xjHiK6me|Bk zDR%}8hZAh-umaX3ID2*jtIYmFsCCoG;U?9G$Y>nc7zFym96x%Ab=3~j!6ws%t8BRp z)rc_}otEGdna{3sZ_4o!RHS})XX4o&RV+3wOAC&~Fq1FEM`b4uZ1g=_{eU0!kp3z* zGdWqlM$x-K?lLy%5EV+VbXp0it^2sWkjSyXDavFT_~ONs^e(83wsst~!P7Rhjo7hJd5Q*?@CGVryU`!v6;Ve$Liie@-At00000 LNkvXXu0mjfaG7Ku diff --git a/legend/野外_资æº_出å¾.png b/legend/野外_资æº_出å¾.png deleted file mode 100644 index cca1085df44f863715809099887bb68e8c67c444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 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 diff --git a/legend/野外_资æº_采集.png b/legend/野外_资æº_采集.png deleted file mode 100644 index 3624116c27c4ec29d613bbaeec9837425786a901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2720 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 WIY`y(Nw^3A0000 { focusRect = TaskUtil.timeTask(this::focus, 10, TimeUnit.SECONDS); + if (focusRect != null) { + Logger.info("èšç„¦æˆåŠŸ"); + } else { + Logger.error("èšç„¦å¤±è´¥"); + } }); } @@ -145,7 +128,7 @@ public abstract class JMacro { int dx = (int) (startX + (point.getX() - startX) * d); int dy = (int) (startY + (point.getY() - startY) * d); robot.mouseMove(dx, dy); - robot.delay(RandomUtil.randomInt(interval - 10, interval + 10)); + delay(RandomUtil.randomInt(interval - 10, interval + 10)); } } else { robot.mouseMove(point.getX(), point.getY()); @@ -160,7 +143,7 @@ public abstract class JMacro { public void mouseLeftClick(ViewPoint rect) { mouseMove(rect); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - robot.delay(100); + delay(100); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } @@ -265,11 +248,11 @@ public abstract class JMacro { robot.mouseMove(rect.getCenter()[0], rect.getCenter()[1]); delayUnstable(); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - robot.delay(100); + delay(100); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); - robot.delay(100); + delay(100); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); - robot.delay(100); + delay(100); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } @@ -284,86 +267,88 @@ public abstract class JMacro { * 获å–èšç„¦åŒºåŸŸ */ public ViewRect getFocusRect() { - return focusRect; + if (focusRect != null) { + return focusRect; + } + // 返回å±å¹•区域 + return getScreenRect(); } /** - * 获å–å±å¹•范围 + * 获å–èšç„¦åŒºåŸŸ */ public ViewRect getScreenRect() { + if (focusRect != null) { + return focusRect; + } + // 返回å±å¹•区域 Toolkit tk = Toolkit.getDefaultToolkit(); return new ViewRect(0, 0, tk.getScreenSize().width, tk.getScreenSize().height); } /** - * 免屿Ÿ¥æ‰¾å›¾ç‰‡ - * - * @param legendName 图例åç§° - * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * 延迟 */ - public ViewRect findPic(String legendName, double minSimilar) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; + public void delay() { + delay(100); + } + + /** + * 延迟 + */ + public void delay(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); } - return findPic(new File(legend, legendName), minSimilar); } /** - * 免屿Ÿ¥æ‰¾å›¾ç‰‡ - * - * @param pic 图片 - * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * 抖动延迟 */ - public ViewRect findPic(File pic, double minSimilar) { - return findPic(getFocusRect(), ImageUtil.load(pic), minSimilar); + public void delayUnstable() { + delayUnstable(500); } /** - * 免屿Ÿ¥æ‰¾å›¾ç‰‡ - * - * @param pic 图片 - * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * 抖动延迟 */ - public ViewRect findPic(BufferedImage pic, double minSimilar) { - return findPic(getFocusRect(), pic, minSimilar); + public void delayUnstable(long millis) { + if (millis < 200) { + delay(millis); + return; + } + delay(RandomUtil.randomLong(millis - 100, millis + 100)); } /** - * åº”ç”¨è§†å£æŸ¥æ‰¾å›¾ä¾‹ + * 免屿Ÿ¥æ‰¾å›¾ç‰‡ * - * @param viewRect åº”ç”¨è§†å£ - * @param legendName 图例åç§° + * @param pic 图片 * @param minSimilar 最低相似度 * @return 匹é…图片区域 */ - public ViewRect findPic(ViewRect viewRect, String legendName, double minSimilar) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; - } - return findPic(viewRect, new File(legend, legendName), minSimilar); + public ViewRect findPic(File pic, double minSimilar) { + return findPic(getFocusRect(), ImageUtil.load(pic), minSimilar); } - /** - * åº”ç”¨è§†å£æŸ¥æ‰¾å›¾ä¾‹ + * 免屿Ÿ¥æ‰¾å›¾ç‰‡ * - * @param viewRect åº”ç”¨è§†å£ - * @param legend 图例文件 + * @param pic 图片 * @param minSimilar 最低相似度 * @return 匹é…图片区域 */ - public ViewRect findPic(ViewRect viewRect, File legend, double minSimilar) { - return findPic(viewRect, ImageUtil.load(legend), minSimilar); + public ViewRect findPic(BufferedImage pic, double minSimilar) { + return findPic(getFocusRect(), pic, minSimilar); } /** - * 获å–å®šä½ + * 查找图片 * - * @param pic å‚考图 - * @param viewRect 查找范围 + * @param viewRect 查找范围(ä¸è®¾æ—¶ï¼Œå–å…¨å±ï¼‰ + * @param pic 待查找图片 * @param minSimilar 相似度 * @return 匹é…图片区域 */ @@ -377,6 +362,9 @@ public abstract class JMacro { Logger.error("视å£å°ºå¯¸å°äºŽå›¾ç‰‡"); return null; } + if (minSimilar > 1) { + throw new RuntimeException("this minSimilar must be less than 1"); + } // 获å–实时å±å¹• BufferedImage screen = capture(robot, viewRect); @@ -407,281 +395,297 @@ public abstract class JMacro { if (lt && rt && lb && rb && cc) { // 统计相似点数 int samePixels = 0; - // 统计ä¸ç›¸ä¼¼ç‚¹æ•° - int diffPixels = 0; for (int smallY = 0; smallY < pic.getHeight(); smallY++) { for (int smallX = 0; smallX < pic.getWidth(); smallX++) { if (ColorUtil.isSimilar(screenData[x + smallX][y + smallY], picData[smallX][smallY])) { samePixels++; - } else { - diffPixels++; } } } - // 计算目å‰ç›¸ä¼¼åº¦ + // 计算相似度 double similar = (double) samePixels / (pic.getWidth() * pic.getHeight()); if (similar >= minSimilar) { return new ViewRect(x, y, x + pic.getWidth(), y + pic.getHeight(), similar); } - // è®¡ç®—ç›®å‰æœ€å¤§ç›¸ä¼¼åº¦ - // æ ¹æ®ä¸ç›¸ä¼¼åƒç´ ç‚¹æ•°æŽ¨æ–­æœ¬æ¬¡å¯èƒ½è¾¾åˆ°çš„æœ€å¤§ç›¸ä¼¼åº¦ï¼Œå¦‚æžœå¯èƒ½è¾¾åˆ°çš„æœ€å¤§ç›¸ä¼¼åº¦éƒ½å°äºŽé¢„å–相似度就ä¸ç”¨æ¯”下去了 - double maxSimilar = 1.0d - (double) diffPixels / (pic.getWidth() * pic.getHeight()); - if (maxSimilar < minSimilar) { - return null; - } } } } return null; } - public void delay() { - delay(100); - } - - public void delay(long millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - public void delayUnstable() { - delayUnstable(500); + /** + * 等待并查找图片 + * + * @param pic 图片 + * @param minSimilar 最低相似度 + * @return 匹é…图片区域 + */ + public ViewRect waitAndFindPic(File pic, double minSimilar) { + return waitAndFindPic(getFocusRect(), pic, minSimilar, 10); } - public void delayUnstable(long millis) { - if (millis < 200) { - delay(millis); - return; - } - delay(RandomUtil.randomLong(millis - 100, millis + 100)); + /** + * 等待并查找图片 + * + * @param pic 图片 + * @param minSimilar 最低相似度 + * @return 匹é…图片区域 + */ + public ViewRect waitAndFindPic(BufferedImage pic, double minSimilar) { + return waitAndFindPic(getFocusRect(), pic, minSimilar, 10); } /** * 等待并查找图片 * - * @param file 图例 + * @param pic 图片 * @param minSimilar 最低相似度 + * @param seconds 最长等待秒数 * @return 匹é…图片区域 */ - public ViewRect waitAndFindPic(File file, double minSimilar) { - return waitAndFindPic(getFocusRect(), file, minSimilar, 10, TimeUnit.SECONDS); + public ViewRect waitAndFindPic(File pic, double minSimilar, long seconds) { + return waitAndFindPic(getFocusRect(), pic, minSimilar, seconds); } /** * 等待并查找图片 * - * @param rect 查找区域 - * @param file 图例 + * @param pic 图片 * @param minSimilar 最低相似度 + * @param seconds 最长等待秒数 * @return 匹é…图片区域 */ - public ViewRect waitAndFindPic(ViewRect rect, File file, double minSimilar) { - return waitAndFindPic(rect, file, minSimilar, 10, TimeUnit.SECONDS); + public ViewRect waitAndFindPic(BufferedImage pic, double minSimilar, long seconds) { + return waitAndFindPic(getFocusRect(), pic, minSimilar, seconds); } /** * 等待并查找图片 * * @param rect 查找区域 - * @param legendName 图例åç§° + * @param pic 图片 * @param minSimilar 最低相似度 * @return 匹é…图片区域 */ - public ViewRect waitAndFindPic(ViewRect rect, String legendName, double minSimilar) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; - } - return waitAndFindPic(rect, new File(legend, legendName), minSimilar, 10, TimeUnit.SECONDS); + public ViewRect waitAndFindPic(ViewRect rect, File pic, double minSimilar) { + return waitAndFindPic(rect, pic, minSimilar, 10); } /** * 等待并查找图片 * - * @param file 图例 + * @param rect 查找区域 + * @param pic 图片 * @param minSimilar 最低相似度 - * @param time 最长等待时间 - * @param unit 最长等待时间å•ä½ + * @param seconds 最长等待秒数 * @return 匹é…图片区域 */ - public ViewRect waitAndFindPic(File file, double minSimilar, long time, TimeUnit unit) { - return waitAndFindPic(getFocusRect(), file, minSimilar, time, unit); + public ViewRect waitAndFindPic(ViewRect rect, File pic, double minSimilar, long seconds) { + return waitAndFindPic(rect, ImageUtil.load(pic), minSimilar, seconds); } /** * 等待并查找图片 * * @param rect 查找区域 - * @param legendName 图例åç§° + * @param pic 图片 * @param minSimilar 最低相似度 - * @param time 最长等待时间 - * @param unit 最长等待时间å•ä½ * @return 匹é…图片区域 */ - public ViewRect waitAndFindPic(ViewRect rect, String legendName, double minSimilar, long time, TimeUnit unit) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; - } - return waitAndFindPic(rect, new File(legend, legendName), minSimilar, time, unit); + public ViewRect waitAndFindPic(ViewRect rect, BufferedImage pic, double minSimilar) { + return waitAndFindPic(rect, pic, minSimilar, 10); } /** * 等待并查找图片 * * @param rect 查找区域 - * @param file 图例 + * @param pic 图片 * @param minSimilar 最低相似度 - * @param time 最长等待时间 - * @param unit 最长等待时间å•ä½ + * @param seconds 最长等待秒数 * @return 匹é…图片区域 */ - public ViewRect waitAndFindPic(ViewRect rect, File file, double minSimilar, long time, TimeUnit unit) { + public ViewRect waitAndFindPic(ViewRect rect, BufferedImage pic, double minSimilar, long seconds) { + if (rect.getWidth() < pic.getWidth()) { + Logger.error("查找图片区域宽度{}å°äºŽå›¾ç‰‡å®½åº¦{}", rect.getWidth(), pic.getWidth()); + return null; + } + if (rect.getHeight() < pic.getHeight()) { + Logger.error("查找图片区域宽度{}å°äºŽå›¾ç‰‡å®½åº¦{}", rect.getHeight(), pic.getHeight()); + return null; + } return TaskUtil.timeTask(() -> { - BufferedImage image = ImageUtil.load(file); - if (rect.getWidth() < image.getWidth()) { - Logger.error("查找图片区域宽度{}å°äºŽå›¾ç‰‡å®½åº¦{}", rect.getWidth(), image.getWidth()); - return null; - } - if (rect.getHeight() < image.getHeight()) { - Logger.error("查找图片区域宽度{}å°äºŽå›¾ç‰‡å®½åº¦{}", rect.getHeight(), image.getHeight()); - return null; - } - - while (true) { + while (JMainService.getInstance().run) { delayUnstable(); - ViewRect pic = findPic(rect, image, minSimilar); - if (pic != null) { - return pic; + ViewRect result = findPic(rect, pic, minSimilar); + if (result != null) { + return result; } } - }, time, unit); + return null; + }, seconds, TimeUnit.SECONDS); } /** - * 等待并匹é…图例 + * 匹é…图片 * - * @param rect å‚照区域 - * @param legendName 图例åç§° + * @param pic 图片 + * @param location å®šä½ * @param minSimilar 最低相似度 - * @return 匹é…图片区域 + * @return 匹é…图片 */ - public ViewRect waitAndMatchPic(ViewRect rect, String legendName, double minSimilar) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; + public ViewRect matchPic(File pic, ViewPoint location, double minSimilar) { + if (!pic.exists()) { + Logger.error("file [{}] not exist", pic.getAbsolutePath()); + return null; } - return waitAndMatchPic(rect, new File(legend, legendName), minSimilar, 3, TimeUnit.SECONDS); + return matchPic(ImageUtil.load(pic), location, minSimilar); + } + + public ViewRect matchPic(BufferedImage pic, ViewPoint location, double minSimilar) { + ViewRect focusRect = getFocusRect(); + int offsetX = location.getX(); + int offsetY = location.getY(); + ViewRect viewRect = new ViewRect(); + viewRect.setLeft(focusRect.getLeft() + offsetX); + viewRect.setTop(focusRect.getTop() + offsetY); + viewRect.setRight(viewRect.getLeft() + pic.getWidth()); + viewRect.setBottom(viewRect.getTop() + pic.getHeight()); + ImageUtil.show(viewRect); + return findPic(viewRect, pic, minSimilar); } /** - * 等待并匹é…图例 + * 等待并匹é…图片 * - * @param rect å‚照区域 - * @param file 图例 + * @param pic 图片 * @param minSimilar 最低相似度 * @return 匹é…图片区域 */ - public ViewRect waitAndMatchPic(ViewRect rect, File file, double minSimilar) { - return waitAndMatchPic(rect, file, minSimilar, 3, TimeUnit.SECONDS); + public ViewRect waitAndMatchPic(File pic, ViewPoint location, double minSimilar) { + return waitAndMatchPic(ImageUtil.load(pic), location, minSimilar); } /** - * 等待并匹é…图例 + * 等待并匹é…图片 + * + * @param pic 图片 + * @param minSimilar 最低相似度 + * @return 匹é…图片区域 + */ + public ViewRect waitAndMatchPic(BufferedImage pic, ViewPoint location, double minSimilar) { + return waitAndMatchPic(pic, location, minSimilar, 10); + } + + /** + * 等待并匹é…图片 * - * @param rect å‚照区域 - * @param file 图例 + * @param pic 图片 * @param minSimilar 最低相似度 - * @param time 最长等待时间 - * @param unit 最长等待时间å•ä½ + * @param seconds 最长等待秒数 * @return 匹é…图片区域 */ - public ViewRect waitAndMatchPic(ViewRect rect, File file, double minSimilar, long time, TimeUnit unit) { + public ViewRect waitAndMatchPic(File pic, ViewPoint location, double minSimilar, long seconds) { + return waitAndMatchPic(ImageUtil.load(pic), location, minSimilar, seconds); + } + + /** + * 等待并匹é…图片 + * + * @param pic 图片 + * @param minSimilar 最低相似度 + * @param seconds 最长等待秒数 + * @return 匹é…图片区域 + */ + public ViewRect waitAndMatchPic(BufferedImage pic, ViewPoint location, double minSimilar, long seconds) { return TaskUtil.timeTask(() -> { while (JMainService.getInstance().run) { - ViewRect matchPic = matchPic(rect, file, minSimilar); + ViewRect matchPic = matchPic(pic, location, minSimilar); if (matchPic != null) { return matchPic; } } return null; - }, time, unit); + }, seconds, TimeUnit.SECONDS); + } + + /** + * 匹é…图例 + * + * @param legend 图例 + * @param minSimilar 最低相似度 + * @return 匹é…图片 + */ + public ViewRect matchLegend(String legend, double minSimilar) { + return matchLegend(Legend.inflate(legend), minSimilar); } /** * 匹é…图片 * - * @param rect 程åºçª—å£ï¼ˆå‚照系) - * @param file 图例 + * @param legend 图例 * @param minSimilar 最低相似度 * @return 匹é…图片 */ - public ViewRect matchPic(ViewRect rect, File file, double minSimilar) { + public ViewRect matchLegend(Legend legend, double minSimilar) { if (minSimilar > 1) { throw new RuntimeException("this minSimilar must be less than 1"); } - if (!file.exists()) { - Logger.error("file [{}] not exist", file.getAbsolutePath()); - return null; - } - String name = file.getName(); - int offsetX = 0; - int offsetY = 0; - if (name.matches("[\\S\\s]+_L[0-9]+,[0-9]+\\.png")) { - offsetX = Convert.toInt(ReUtil.get("[\\S\\s]+_L([0-9]+),[0-9]+\\.png", name, 1), 0); - offsetY = Convert.toInt(ReUtil.get("[\\S\\s]+_L[0-9]+,([0-9]+)\\.png", name, 1), 0); - } + int offsetX = legend.getLocation().getX(); + int offsetY = legend.getLocation().getY(); ViewRect viewRect = new ViewRect(); - viewRect.setLeft(rect.getLeft() + offsetX); - viewRect.setTop(rect.getTop() + offsetY); - BufferedImage image = ImageUtil.load(file); + viewRect.setLeft(getFocusRect().getLeft() + offsetX); + viewRect.setTop(getFocusRect().getTop() + offsetY); + BufferedImage image = ImageUtil.load(legend.getFile()); viewRect.setRight(viewRect.getLeft() + image.getWidth()); viewRect.setBottom(viewRect.getTop() + image.getHeight()); - - ViewRect pic = findPic(viewRect, image, minSimilar); ImageUtil.show(viewRect); - return pic; + return findPic(viewRect, image, minSimilar); } /** - * 匹é…图片 + * 等待并匹é…图例 * - * @param rect 程åºçª—å£ï¼ˆå‚照系) - * @param legendName 图例åç§° + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片 + * @return 匹é…图片区域 */ - public ViewRect matchPic(ViewRect rect, String legendName, double minSimilar) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; - } - return matchPic(rect, new File(legend, legendName), minSimilar); + public ViewRect waitAndMatchLegend(String legend, double minSimilar) { + return waitAndMatchLegend(Legend.inflate(legend), minSimilar); } /** - * 是å¦åŒ¹é…图片 + * 等待并匹é…图例 * - * @param rect 程åºçª—å£ï¼ˆå‚照系) - * @param file 图例 + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片 + * @return 匹é…图片区域 */ - public boolean isMatchPic(ViewRect rect, File file, double minSimilar) { - return matchPic(rect, file, minSimilar) != null; + public ViewRect waitAndMatchLegend(Legend legend, double minSimilar) { + return waitAndMatchLegend(legend, minSimilar, 5); } /** - * 是å¦åŒ¹é…图片 + * 等待并匹é…图例 * - * @param rect 程åºçª—å£ï¼ˆå‚照系) - * @param legendName 图例åç§° + * @param legend 图例 * @param minSimilar 最低相似度 - * @return 匹é…图片 + * @param seconds 最长等待秒数 + * @return 匹é…图片区域 */ - public boolean isMatchPic(ViewRect rect, String legendName, double minSimilar) { - if (!legendName.endsWith(".png")) { - legendName = legendName + ".png"; - } - return matchPic(rect, new File(legend, legendName), minSimilar) != null; + public ViewRect waitAndMatchLegend(String legend, double minSimilar, long seconds) { + return waitAndMatchLegend(Legend.inflate(legend), minSimilar, seconds); + } + + /** + * 等待并匹é…图例 + * + * @param legend 图例 + * @param minSimilar 最低相似度 + * @param seconds 最长等待秒数 + * @return 匹é…图片区域 + */ + public ViewRect waitAndMatchLegend(Legend legend, double minSimilar, long seconds) { + return waitAndMatchPic(legend.getFile(), legend.getLocation(), minSimilar, seconds); } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java index 0eaec08..a7ce499 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java +++ b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java @@ -1,15 +1,19 @@ package com.example.jmacro.wjdr; -import com.example.jmacro.wjdr.demo.MacroForWJDR; +import com.example.jmacro.wjdr.base.ViewRect; import com.example.jmacro.wjdr.ui.FXMLUtil; import com.example.jmacro.wjdr.util.Logger; import com.example.jmacro.wjdr.util.ResourceUtil; +import com.melloware.jintellitype.JIntellitype; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; +import java.awt.event.KeyEvent; +import java.io.File; + /** * UIå…¥å£ * @@ -19,6 +23,9 @@ import javafx.stage.Stage; */ public class JMainApplication extends Application { + public static final int F1_SHORTCUT = 1; // 开始快æ·é”® + public static final int F2_SHORTCUT = 2; // 结æŸå¿«æ·é”® + public static Stage primaryStage; public static JMainController mainController; @@ -44,8 +51,35 @@ public class JMainApplication extends Application { // 展示UI stage.show(); JMainApplication.primaryStage = stage; + + JIntellitype.getInstance().registerHotKey(F1_SHORTCUT, 0, KeyEvent.VK_F1); + JIntellitype.getInstance().registerHotKey(F2_SHORTCUT, 0, KeyEvent.VK_F2); + JIntellitype.getInstance().addHotKeyListener(identifier -> { + switch (identifier) { + case F1_SHORTCUT: + mainController.onStart(); + break; + case F2_SHORTCUT: + mainController.onStop(); + break; + } + }); + // æœåŠ¡åˆå§‹åŒ– - JMainService.init(new MacroForWJDR()); + JMainService.init(new JMacro() { + @Override + public ViewRect focus() { + return new ViewRect(0, 0, 200, 200); + } + + @Override + public void run() { + ViewRect pic = matchLegend("回收站", 0.9); + if (pic != null) { + mouseLeftDoubleClick(pic); + } + } + }, new File("legend")); } 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 9f171da..d3ce3b6 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMainController.java +++ b/src/main/java/com/example/jmacro/wjdr/JMainController.java @@ -1,5 +1,6 @@ package com.example.jmacro.wjdr; +import com.example.jmacro.wjdr.base.Legend; import com.example.jmacro.wjdr.base.ViewRect; import com.example.jmacro.wjdr.tool.Capture; import com.example.jmacro.wjdr.tool.Location; @@ -9,7 +10,6 @@ import javafx.scene.control.Button; import javafx.scene.image.ImageView; import java.awt.*; -import java.io.File; /** * UI控制器 @@ -33,15 +33,14 @@ public class JMainController { * 截图 */ @FXML - private void onCapture() { + public void onCapture() { ViewRect screen = JMainService.getInstance().getMacro().getFocusRect(); - File legend = JMainService.getInstance().getMacro().getLegend(); if (screen == null) { DialogUtil.alert("未定ä½åˆ°è§†å£ï¼Œè¯·ç¨åŽå†è¯•ï¼"); return; } try { - new Capture(screen.getLeft(), screen.getTop(), legend); + new Capture(screen.getLeft(), screen.getTop(), Legend.getDefaultBase()); } catch (AWTException awtException) { awtException.printStackTrace(); } @@ -51,9 +50,8 @@ public class JMainController { * 截图 */ @FXML - private void onLocation() { + public void onLocation() { ViewRect screen = JMainService.getInstance().getMacro().getFocusRect(); - File legend = JMainService.getInstance().getMacro().getLegend(); if (screen == null) { DialogUtil.alert("未定ä½åˆ°è§†å£ï¼Œè¯·ç¨åŽå†è¯•ï¼"); return; @@ -69,7 +67,7 @@ public class JMainController { * 截图 */ @FXML - private void onStart() { + public void onStart() { boolean start = JMainService.start(); this.start.setDisable(start); this.stop.setDisable(!start); @@ -79,7 +77,7 @@ public class JMainController { * 截图 */ @FXML - private void onStop() { + public void onStop() { boolean stop = JMainService.stop(); this.start.setDisable(!stop); this.stop.setDisable(stop); diff --git a/src/main/java/com/example/jmacro/wjdr/JMainService.java b/src/main/java/com/example/jmacro/wjdr/JMainService.java index d25c02a..ad9ea18 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMainService.java +++ b/src/main/java/com/example/jmacro/wjdr/JMainService.java @@ -1,6 +1,7 @@ package com.example.jmacro.wjdr; import cn.hutool.core.thread.ThreadUtil; +import com.example.jmacro.wjdr.base.Legend; import com.example.jmacro.wjdr.demo.MacroForWJDR; import com.example.jmacro.wjdr.util.DialogUtil; import com.example.jmacro.wjdr.util.Logger; @@ -54,8 +55,9 @@ public class JMainService { return macro; } - public static void init(JMacro macro) { + public static void init(JMacro macro, File legendDir) { getInstance().macro = macro; + Legend.setDefaultBase(legendDir); } public void createDaemon() { @@ -99,17 +101,6 @@ public class JMainService { return true; } - /** - * 设置图例路径 - * - * @param legend 图例路径 - */ - public static void setLegend(File legend) { - if (getInstance().macro != null) { - getInstance().macro.setLegend(legend); - } - } - /** * 守护线程 */ @@ -123,9 +114,10 @@ public class JMainService { } while (run) { try { - macro.run(); ThreadUtil.sleep(1000); + macro.run(); } catch (Exception e) { + e.printStackTrace(); Logger.error("异常中断"); } } @@ -137,7 +129,7 @@ public class JMainService { * æœåŠ¡å¯åŠ¨å…¥å£ */ public static void main(String[] args) { - JMainService.init(new MacroForWJDR()); + JMainService.init(new MacroForWJDR(), new File("legend")); JMainService.start(); } } diff --git a/src/main/java/com/example/jmacro/wjdr/base/Legend.java b/src/main/java/com/example/jmacro/wjdr/base/Legend.java new file mode 100644 index 0000000..4713378 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/base/Legend.java @@ -0,0 +1,119 @@ +package com.example.jmacro.wjdr.base; + +import cn.hutool.cache.Cache; +import cn.hutool.cache.CacheUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ReUtil; + +import java.io.File; +import java.util.List; + +/** + * 图例 + *

+ * å›¾ä¾‹åˆ†å¸¦åæ ‡å’Œä¸å¸¦å标图例 + *

+ * 其䏭另忠‡å›¾ä¾‹ï¼Œé€šè¿‡å°†åæ ‡èžåˆè¿›æ–‡ä»¶å称实现,定义如下 + * 以something#L0,0.png为例 + * 图例å称:something + * 图例忠‡ï¼š#L0,0(在实例化时转为location) + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Legend { + + /** + * 默认图例目录 + */ + private static File defaultBase = new File("legend"); + + /** + * 图例缓存 + */ + public static Cache fileCache = CacheUtil.newLFUCache(999); + + /** + * 图例目录 + */ + private File base; + + /** + * 图例文件 + */ + private File file; + + /** + * 图例åç§° + */ + private String name; + + /** + * 图例忠‡ + */ + private ViewPoint location; + + public static void setDefaultBase(File base) { + defaultBase = base; + } + + public static File getDefaultBase() { + return defaultBase; + } + + private Legend() { + + } + + /** + * 获å–图例 + * + * @param name 图例åç§° + * @return 图例 + */ + public static Legend inflate(String name) { + Legend legend = fileCache.get(name); + if (legend != null) { + return legend; + } + + List files = FileUtil.loopFiles(defaultBase, pathname -> pathname.getName().startsWith(name)); + if (files.size() == 0) { + throw new RuntimeException("Not found the legend of " + name); + } + File file = files.get(0); + Legend newLegend = new Legend(); + newLegend.base = defaultBase; + newLegend.file = file; + newLegend.name = name; + + if (!name.matches("[\\S\\s]+#L[0-9]+,[0-9]+\\.png")) { + newLegend.location = null; + } else { + int x = Convert.toInt(ReUtil.get("[\\S\\s]+#L([0-9]+),[0-9]+\\.png", file.getName(), 1), 0); + int y = Convert.toInt(ReUtil.get("[\\S\\s]+#L[0-9]+,([0-9]+)\\.png", file.getName(), 1), 0); + newLegend.location = new ViewPoint(x, y); + } + + fileCache.put(name, newLegend); + return newLegend; + } + + public File getBase() { + return base; + } + + public File getFile() { + return file; + } + + public String getName() { + return name; + } + + public ViewPoint getLocation() { + return location; + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java b/src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java index c7b8623..5b1faee 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/MacroForWJDR.java @@ -4,13 +4,15 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import com.example.jmacro.wjdr.JMacro; import com.example.jmacro.wjdr.JMainService; +import com.example.jmacro.wjdr.base.Legend; import com.example.jmacro.wjdr.base.ViewRect; -import com.example.jmacro.wjdr.demo.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.demo.task.Task_采矿被攻击; import com.example.jmacro.wjdr.util.Logger; import com.example.jmacro.wjdr.util.TaskUtil; -import java.util.concurrent.TimeUnit; - /** * 无尽冬日脚本 * @@ -39,7 +41,7 @@ public class MacroForWJDR extends JMacro { public synchronized ViewRect focus() { // 定ä½çª—å£ Logger.info("定ä½çª—å£"); - ViewRect mumu = findPic("æ…•æ…•_工具æ ", 0.95d); + ViewRect mumu = findPic(Legend.inflate("æ…•æ…•_工具æ ").getFile(), 0.95d); if (mumu == null) { Logger.error("定ä½çª—å£å¤±è´¥"); return null; @@ -63,7 +65,7 @@ public class MacroForWJDR extends JMacro { Logger.info("任务线程ID={}", Thread.currentThread().getId()); // 获å–å¯åŠ¨å›¾æ ‡ Logger.info("定ä½å¯åŠ¨å›¾æ ‡"); - ViewRect launch = waitAndFindPic(focusRect, "å¯åŠ¨å›¾æ ‡", 0.9, 10, TimeUnit.SECONDS); + ViewRect launch = waitAndFindPic(Legend.inflate("å¯åŠ¨å›¾æ ‡").getFile(), 0.9); if (launch != null) { Logger.info("å¯åŠ¨å›¾æ ‡åæ ‡ï¼š", launch.toString()); Logger.info("å¯åŠ¨ç¨‹åº"); @@ -78,14 +80,14 @@ public class MacroForWJDR extends JMacro { // 定ä½åŸŽé•‡ Boolean inMain = TaskUtil.retryTask(() -> { { // 定ä½å¼¹æ¡†ï¼Œå…³é—­å¼¹æ¡† - ViewRect rect = matchPic(focusRect, "城镇_充值_L448,36", 0.8d); + ViewRect rect = waitAndMatchLegend("城镇_充值", 0.8d); if (rect != null) { mouseLeftClick(rect); Logger.info("检测到充值广告弹框,关闭弹框"); } } {// 定ä½ç¦»çº¿æ”¶ç›Š - ViewRect rect = matchPic(focusRect, "城镇_离线收益_L204,734", 0.9); + ViewRect rect = waitAndMatchLegend("城镇_离线收益", 0.9); if (rect != null) { mouseLeftClick(rect); Logger.info("检测到离线收益弹框,关闭弹框"); @@ -93,7 +95,7 @@ public class MacroForWJDR extends JMacro { } // 定ä½åŸŽé•‡ { - ViewRect rect = matchPic(focusRect, "城镇_L456,887", 0.9); + ViewRect rect = waitAndMatchLegend("城镇", 0.9); if (rect != null) { Logger.info("当å‰åŒºåŸŸã€é‡Žå¤–】"); Logger.info("返回区域ã€åŸŽé•‡ã€‘"); @@ -102,7 +104,7 @@ public class MacroForWJDR extends JMacro { } } {// 定ä½é‡Žå¤– - ViewRect rect = matchPic(focusRect, "野外_L444,888", 0.9); + ViewRect rect = waitAndMatchLegend("野外", 0.9); if (rect != null) { Logger.info("当å‰åŒºåŸŸã€åŸŽé•‡ã€‘"); return true; 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 index 8845f00..72a510c 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_探险领å–.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_探险领å–.java @@ -13,7 +13,7 @@ public class Task_æŽ¢é™©é¢†å– extends BaseTask { @Override public void task(JMacro macro, ViewRect viewRect) { Logger.info("定ä½ã€æŽ¢é™©ã€‘按钮"); - ViewRect TAB_探险 = macro.waitAndMatchPic(this.viewRect, "城镇_探险_L35,881", 0.9); + ViewRect TAB_探险 = macro.waitAndMatchLegend("城镇_探险", 0.9); if (TAB_探险 == null) { return; } @@ -21,7 +21,7 @@ public class Task_æŽ¢é™©é¢†å– extends BaseTask { Logger.info("ç‚¹å‡»ã€æŽ¢é™©ã€‘æŒ‰é’®"); macro.mouseLeftClick(TAB_探险); - ViewRect 探险_按钮 = macro.waitAndMatchPic(this.viewRect, "探险_按钮_L240,854", 0.9); + ViewRect 探险_按钮 = macro.waitAndMatchLegend("探险_按钮", 0.9); if (探险_按钮 == null) { Logger.info("进入探险界é¢å¤±è´¥"); return; @@ -29,26 +29,26 @@ public class Task_æŽ¢é™©é¢†å– extends BaseTask { Logger.info("è¿›å…¥æŽ¢é™©ç•Œé¢æˆåŠŸ"); Logger.info("定ä½é¢†å–按钮"); - ViewRect 探险_ä¸å¯é¢†å– = macro.waitAndMatchPic(this.viewRect, "探险_ä¸å¯é¢†å–_L420,667", 0.8); + ViewRect 探险_ä¸å¯é¢†å– = macro.waitAndMatchLegend("探险_ä¸å¯é¢†å–", 0.8); if (探险_ä¸å¯é¢†å– != null) { Logger.info("探险ä¸å¯é¢†å–"); } else { Logger.info("定ä½é¢†å–按钮"); - ViewRect 探险_é¢†å– = macro.waitAndMatchPic(this.viewRect, "探险_领å–_L426,667", 0.8); + ViewRect 探险_é¢†å– = macro.waitAndMatchLegend("探险_领å–", 0.8); if (探险_é¢†å– == null) { Logger.error("æœªæ£€æµ‹åˆ°ã€æŽ¢é™©_领å–】,领å–终止"); return; } Logger.info("定ä½é¢†å–按钮æˆåŠŸï¼Œå‡†å¤‡é¢†å–:{}", 探险_领å–.toString()); macro.mouseLeftClick(探险_领å–); - ViewRect 探险_领å–2 = macro.waitAndMatchPic(this.viewRect, "探险_领å–2_L230,664", 0.8); + ViewRect 探险_领å–2 = macro.waitAndMatchLegend("探险_领å–2", 0.8); if (探险_领å–2 == null) { Logger.error("任务终止"); return; } macro.mouseLeftClick(探险_领å–2); - ViewRect 探险_获得奖励 = macro.waitAndMatchPic(this.viewRect, "探险_获得奖励_L196,218", 0.8); + ViewRect 探险_获得奖励 = macro.waitAndMatchLegend("探险_获得奖励", 0.8); if (探险_获得奖励 == null) { Logger.error("任务终止"); return; @@ -56,7 +56,7 @@ public class Task_æŽ¢é™©é¢†å– extends BaseTask { macro.mouseLeftClick(探险_获得奖励); } - ViewRect 探险_返回 = macro.waitAndMatchPic(this.viewRect, "探险_返回_L4,4", 0.8); + ViewRect 探险_返回 = macro.waitAndMatchLegend("探险_返回", 0.8); if (探险_返回 == null) { Logger.error("任务终止"); return; 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 index e305ff3..79ad7ea 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_æ”¶ç•™é¿éš¾è€….java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_æ”¶ç•™é¿éš¾è€….java @@ -12,7 +12,7 @@ public class Task_æ”¶ç•™é¿éš¾è€… extends BaseTask { @Override public void task(JMacro macro, ViewRect viewRect) { - ViewRect rect = macro.waitAndMatchPic(viewRect, "城镇_é¿éš¾è€…_L3,174", 0.9); + ViewRect rect = macro.waitAndMatchLegend("城镇_é¿éš¾è€…", 0.9); if (rect == null) { Logger.info("未å‘现é¿éš¾è€…"); return; @@ -23,7 +23,7 @@ public class Task_æ”¶ç•™é¿éš¾è€… extends BaseTask { macro.mouseLeftClick(rect); macro.delayUnstable(); - ViewRect rect1 = macro.waitAndMatchPic(viewRect, "城镇_欢迎新æˆå‘˜_L199,773", 0.9); + ViewRect rect1 = macro.waitAndMatchLegend("城镇_欢迎新æˆå‘˜", 0.9); if (rect1 == null) { Logger.info("æ”¶ç•™é¿éš¾è€…异常"); return; 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 index 8c84b14..72a9237 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_离线收益.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_离线收益.java @@ -14,7 +14,7 @@ public class Task_离线收益 extends BaseTask { public void task(JMacro macro, ViewRect viewRect) { macro.delay(); // 定ä½ç¦»çº¿æ”¶ç›Šå¼¹æ¡†ï¼Œå…³é—­å¼¹æ¡† - ViewRect rect = macro.matchPic(viewRect, "城镇_离线收益_L204,734", 0.9); + ViewRect rect = macro.waitAndMatchLegend("城镇_离线收益", 0.9); if (rect != null) { macro.mouseLeftClick(rect); Logger.info("检测到离线收益弹框,关闭弹框"); 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 index b8476c2..6212005 100644 --- a/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/Task_自动采矿.java @@ -17,12 +17,12 @@ public class Task_自动采矿 extends BaseTask { @Override public void task(JMacro macro, ViewRect viewRect) { Logger.info("判断是å¦åœ¨é‡Žå¤–"); - ViewRect 城镇 = macro.waitAndMatchPic(this.viewRect, "城镇_L449,887", 0.9); + ViewRect 城镇 = macro.waitAndMatchLegend( "城镇", 0.9); if (城镇 != null) { Logger.info("当å‰ç•Œé¢ã€é‡Žå¤–】"); } else { Logger.info("定ä½ã€é‡Žå¤–】"); - ViewRect 野外 = macro.waitAndMatchPic(this.viewRect, "野外_L444,888", 0.99); + ViewRect 野外 = macro.waitAndMatchLegend( "野外", 0.99); if (野外 == null) { Logger.error("定ä½ã€é‡Žå¤–】失败,采矿终止"); return; @@ -36,7 +36,7 @@ public class Task_自动采矿 extends BaseTask { Logger.info("定ä½èµ„æºæœç´¢æŒ‰é’®"); // 因为æœç´¢æŒ‰é’®é€æ˜Žï¼Œä¸å¥½æ¯”对,通过定ä½å…¶ä¸‹é¢çš„ä»»åŠ¡å›¾æ ‡å®šä½ - ViewRect 野外_任务 = macro.waitAndMatchPic(this.viewRect, "野外_任务_L16,759", 0.9); + ViewRect 野外_任务 = macro.waitAndMatchLegend( "野外_任务", 0.9); if (野外_任务 == null) { Logger.error("未检测到ã€èµ„æºæœç´¢æŒ‰é’®ã€‘,采矿终止"); return; @@ -49,14 +49,13 @@ public class Task_自动采矿 extends BaseTask { // 因为æœç´¢æŒ‰é’®é€æ˜Žï¼Œä¸å¥½æ¯”对,通过定ä½å…¶ä¸‹é¢çš„ä»»åŠ¡å›¾æ ‡å®šä½ - ViewRect 野外_æœç´¢ = macro.waitAndMatchPic(this.viewRect, "野外_æœç´¢_L226,879", 0.9); + ViewRect 野外_æœç´¢ = macro.waitAndMatchLegend( "野外_æœç´¢#L226,879.png", 0.9); if (野外_æœç´¢ == null) { Logger.error("未检测到ã€é‡Žå¤–_æœç´¢ã€‘,采矿终止"); return; } // todo - String[] types = new String[]{ "生肉", "木æ", "煤矿", "é“矿" }; @@ -69,13 +68,13 @@ public class Task_自动采矿 extends BaseTask { } // æ£€æµ‹æ˜¯å¦æ˜¯æœç´¢ç•Œé¢ - ViewRect 野外_任务2 = macro.waitAndMatchPic(this.viewRect, "野外_任务_L16,759", 9); + ViewRect 野外_任务2 = macro.waitAndMatchLegend( "野外_任务", 9); if (野外_任务2 != null) { Logger.info("é€€å‡ºèµ„æºæœç´¢ç•Œé¢"); macro.mouseLeftClick(this.viewRect); } - ViewRect 城1 = macro.waitAndMatchPic(this.viewRect, "城镇_L456,887", 0.9); + ViewRect 城1 = macro.waitAndMatchLegend( "城镇", 0.9); if (城1 == null) { Logger.error("未检测到ã€åŸŽé•‡ã€‘,采矿终止"); return; diff --git a/src/main/java/com/example/jmacro/wjdr/tool/Capture.java b/src/main/java/com/example/jmacro/wjdr/tool/Capture.java index 7af7cbb..da499e1 100644 --- a/src/main/java/com/example/jmacro/wjdr/tool/Capture.java +++ b/src/main/java/com/example/jmacro/wjdr/tool/Capture.java @@ -1,15 +1,26 @@ package com.example.jmacro.wjdr.tool; import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.log.StaticLog; +import com.example.jmacro.wjdr.base.Legend; +import com.example.jmacro.wjdr.util.DialogUtil; import com.example.jmacro.wjdr.util.Logger; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; -import java.awt.event.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; +import java.util.List; import java.util.prefs.Preferences; /** @@ -40,23 +51,26 @@ public class Capture extends JFrame { /** * 背景蒙层 */ - private Color mask = new Color(0, 0, 0, 0.2f); + private final Color mask = new Color(0, 0, 0, 0.2f); /** * èšç„¦æ¡†çº¿æ¡ */ - private Stroke focusWindow = new BasicStroke(1.0f); + private final Stroke focusWindow = new BasicStroke(1.0f); /** * å±å¹•æˆªå›¾åŒºåŸŸèµ·å§‹åæ ‡ */ - private Point start = new Point(0, 0); + private final Point start = new Point(0, 0); /** * å±å¹•截图区域结æŸåæ ‡ */ - private Point end = new Point(0, 0); + private final Point end = new Point(0, 0); + /** + * 个人首选项é…置工具 + */ private Preferences preferences; /** @@ -192,8 +206,8 @@ public class Capture extends JFrame { // 上一次ä¿å­˜ç›®å½• String lastPath = preferences.get(LAST_PATH, ""); // 默认文件å - String location = "_L" + (getCaptureX() - originX) + "," + (getCaptureY() - originY); - String filename = System.currentTimeMillis() + location + ".png"; + String location = "L" + (getCaptureX() - originX) + "," + (getCaptureY() - originY); + String filename = StrUtil.format("{}#{}.png", System.currentTimeMillis(), location); JFileChooser jFileChooser = new JFileChooser(); jFileChooser.setFileFilter(new FileNameExtensionFilter("png", "png")); @@ -204,8 +218,23 @@ public class Capture extends JFrame { if (returnVal == JFileChooser.APPROVE_OPTION) { // 默认文件 File file = jFileChooser.getSelectedFile(); - // ä¿®æ­£åæ ‡ - filename = file.getName().replaceAll("(_L[0-9]+,[0-9]+)?.png", "") + location + ".png"; + String name = file.getName(); + String legendName = name.split("#")[0]; + String prefix = legendName + "#"; + + List files = FileUtil.loopFiles(Legend.getDefaultBase(), pathname -> pathname.getName().startsWith(prefix)); + if (files.size() > 0) { + DialogUtil.confirm("æç¤º", "存在相åŒå›¾ä¾‹ï¼Œæ˜¯å¦æ—§çš„删除?", result -> { + if (result) { + for (File file1 : files) { + file1.deleteOnExit(); + } + } + }); + } + + // 图例文件å + filename = StrUtil.format("{}#{}.png", legendName, location); file = new File(file.getParent(), filename); Logger.info("ä¿å­˜è·¯å¾„" + file); diff --git a/src/main/resources/main.fxml b/src/main/resources/main.fxml index 8077d1b..cb9d9c6 100644 --- a/src/main/resources/main.fxml +++ b/src/main/resources/main.fxml @@ -17,8 +17,8 @@ -