目录
- 一.实现功能
- 二.主要思路
- 三.主要代码实现
- 四.用exe4j生成.exe程序
- 五.最终效果
- 六.代码开源
一.实现功能
主线图作战结束到结算页自动点击再次前往
二.主要思路
- 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对
- 移动鼠标点击再次前往:Java提供的Robot类
三.主要代码实现
- MainFrame.java
主要实现系统托盘的图标,右键菜单栏,菜单项的响应事件
配置完像素位置,可以自动读取当前电脑页面的RGB至配置文件中
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108package com.simple.azurlane.view; import com.simple.azurlane.auto.MainLine; import com.simple.azurlane.util.PropertyUtil; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.io.IOException; import java.util.List; import java.util.*; public class MainFrame { public MainFrame() { //系统托盘 SystemTray systemTray = SystemTray.getSystemTray(); //菜单栏 PopupMenu pop = new PopupMenu(); MenuItem control = new MenuItem("start"); MenuItem config = new MenuItem("config"); MenuItem loadColor = new MenuItem("loadColor"); MenuItem exit = new MenuItem("exit"); pop.add(control); pop.addSeparator(); pop.add(config); pop.addSeparator(); pop.add(loadColor); pop.addSeparator(); pop.add(exit); control.addActionListener(e -> { if (control.getLabel().equals("start")) { MainLine.start(); control.setLabel("stop"); } else { MainLine.stop(); control.setLabel("start"); } }); config.addActionListener(e -> { ConfigFrame frame = ConfigFrame.getFrame(); frame.setVisible(true); frame.setExtendedState(Frame.NORMAL); }); loadColor.addActionListener(e -> { int x; int y; try { x = PropertyUtil.getInt("x1"); y = PropertyUtil.getInt("y1"); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, "识别的像素坐标有误"); return; } String r = PropertyUtil.getString("r"); String g = PropertyUtil.getString("g"); String b = PropertyUtil.getString("b"); List<String> rl = Arrays.asList(r.split(",")); List<String> gl = Arrays.asList(g.split(",")); List<String> bl = Arrays.asList(b.split(",")); Robot robot = MainLine.getRobot(); Color pixelColor = robot.getPixelColor(x, y); if (MainLine.validatePixelColor(rl, gl, bl, pixelColor)) { return; } //刷新property的rgb属性 Map<String, String> configMap = new HashMap<>(); configMap.put("r", completion(r, String.valueOf(pixelColor.getRed()))); configMap.put("g", completion(g, String.valueOf(pixelColor.getGreen()))); configMap.put("b", completion(b, String.valueOf(pixelColor.getBlue()))); PropertyUtil.alter(configMap); //刷新配置页的rgb属性 if(ConfigFrame.frameCreated()){ ConfigFrame frame = ConfigFrame.getFrame(); frame.loadConfig(); } }); exit.addActionListener(e -> System.exit(0)); try { TrayIcon trayIcon = new TrayIcon(ImageIO.read(Objects.requireNonNull(MainFrame.class.getClassLoader().getResourceAsStream("azurlane.jpg"))), "碧蓝航线", pop); trayIcon.setImageAutoSize(true); trayIcon.setToolTip("碧蓝航线"); systemTray.add(trayIcon); } catch (IOException | AWTException e) { e.printStackTrace(); } } private String completion(String oldColor, String newColor) { if (oldColor.trim().equals("")) { return newColor; } return oldColor + "," + newColor; } public static void main(String[] args) { new MainFrame(); } }
- MainLine.java
主要实现像素点的比对,自动移动鼠标点击
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86package com.simple.azurlane.auto; import com.simple.azurlane.util.PropertyUtil; import java.awt.*; import java.awt.event.KeyEvent; import java.util.Arrays; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class MainLine { private static ScheduledExecutorService scheduledService; private static Robot robot; static { try { robot = new Robot(); } catch (AWTException e) { e.printStackTrace(); } } private static void autoWork() { // load config from cache int x1; int y1; int x2; int y2; try { int z = PropertyUtil.getInt("z"); x1 = PropertyUtil.getInt("x1"); y1 = PropertyUtil.getInt("y1"); x2 = PropertyUtil.getInt("x2") / z; y2 = PropertyUtil.getInt("y2") / z; } catch (NumberFormatException e) { return; } List<String> rl = Arrays.asList(PropertyUtil.getString("r").split(",")); List<String> gl = Arrays.asList(PropertyUtil.getString("g").split(",")); List<String> bl = Arrays.asList(PropertyUtil.getString("b").split(",")); Color pixelColor = robot.getPixelColor(x1, y1); if (validatePixelColor(rl, gl, bl, pixelColor)) { robot.mouseMove(x2, y2); robot.mousePress(KeyEvent.BUTTON1_MASK); robot.delay(200); robot.mouseRelease(KeyEvent.BUTTON1_MASK); robot.delay(200); robot.mouseMove(0, 0); } } public static Robot getRobot() { return robot; } /** * 校验一组颜色是否与之指定像素点颜色匹配 * * @param pixelColor 像素点颜色 * @return true/false */ public static boolean validatePixelColor(List<String> rl, List<String> gl, List<String> bl, Color pixelColor) { for (int i = 0; i < rl.size(); i++) { if (String.valueOf(pixelColor.getRed()).equals(rl.get(i)) && String.valueOf(pixelColor.getGreen()).equals(gl.get(i)) && String.valueOf(pixelColor.getBlue()).equals(bl.get(i))) { return true; } } return false; } public static void start() { scheduledService = Executors.newScheduledThreadPool(1); scheduledService.scheduleAtFixedRate(MainLine::autoWork, 0, 3, TimeUnit.SECONDS); } public static void stop() { scheduledService.shutdownNow(); scheduledService = null; System.gc(); } }
- ConfigFrame.java
支持动态配置参数
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114package com.simple.azurlane.view; import com.simple.azurlane.component.IButton; import com.simple.azurlane.component.ILabel; import com.simple.azurlane.component.IText; import com.simple.azurlane.util.PropertyUtil; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Objects; public class ConfigFrame extends JFrame { private final JLabel xl = new ILabel("X", 34, 30, 20, 20); private final JLabel yl = new ILabel("Y", 34, 90, 20, 20); private final JLabel rl = new ILabel("R", 34, 150, 24, 20); private final JLabel gl = new ILabel("G", 34, 210, 24, 20); private final JLabel bl = new ILabel("B", 34, 270, 24, 20); // x1 private final JTextField x = new IText(100, 25, 160, 30); // y1 private final JTextField y = new IText(100, 85, 160, 30); private final JTextField r = new IText(100, 145, 160, 30); private final JTextField g = new IText(100, 205, 160, 30); private final JTextField b = new IText(100, 265, 160, 30); public final JButton button1 = new IButton("Cancel", 34, 320, 96, 30); public final JButton button2 = new IButton("Apply", 164, 320, 96, 30); private volatile static ConfigFrame configFrame; private ConfigFrame() throws HeadlessException { setTitle("config"); setSize(300, 400); setLocationRelativeTo(null); setLayout(null); setResizable(false); setFocusable(true); getContentPane().setBackground(new Color(255, 255, 255)); try { setIconImage(ImageIO.read(Objects.requireNonNull(ConfigFrame.class.getClassLoader().getResourceAsStream("azurlane.jpg")))); } catch (IOException e) { e.printStackTrace(); } loadConfig(); loadComponent(); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { setVisible(false); } }); setVisible(true); } private void loadComponent() { Container contentPane = getContentPane(); contentPane.add(xl); contentPane.add(yl); contentPane.add(rl); contentPane.add(gl); contentPane.add(bl); contentPane.add(x); contentPane.add(y); contentPane.add(r); contentPane.add(g); contentPane.add(b); contentPane.add(b); contentPane.add(b); contentPane.add(button1); contentPane.add(button2); } public void loadConfig() { x.setText(PropertyUtil.getString("x1")); y.setText(PropertyUtil.getString("y1")); r.setText(PropertyUtil.getString("r")); g.setText(PropertyUtil.getString("g")); b.setText(PropertyUtil.getString("b")); } public static ConfigFrame getFrame() { if (configFrame == null) { configFrame = new ConfigFrame(); } return configFrame; } public static boolean frameCreated(){ return configFrame != null; } public void changeValue() { String xText = x.getText(); String yText = y.getText(); String rText = r.getText(); String gText = g.getText(); String bText = b.getText(); if (!(x.getText().equals(PropertyUtil.getString("x1")) && y.getText().equals(PropertyUtil.getString("y1")) && r.getText().equals(PropertyUtil.getString("r")) && g.getText().equals(PropertyUtil.getString("g")) && b.getText().equals(PropertyUtil.getString("b")))) { Map<String, String> configMap = new HashMap<>(16); configMap.put("x1", xText.trim()); configMap.put("y1", yText.trim()); configMap.put("r", rText.trim()); configMap.put("g", gText.trim()); configMap.put("b", bText.trim()); PropertyUtil.alter(configMap); } } }
- config.properties
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13#识别的像素点位置 x1=1600 y1=276 #鼠标点击位置 x2=1740 y2=1294 #匹配的rgb颜色 r=99,90,90 g=130,134,121 b=189,198,198 #分辨率-缩放比例 z=2
四.用exe4j生成.exe程序
具体参考我的这篇文章exe4j将jar包打成exe程序
五.最终效果
右键菜单栏
配置页
六.代码开源
所有代码已上传我的github仓库
最后
以上就是谦让眼神最近收集整理的关于Java实现碧蓝航线连续作战的全部内容,更多相关Java实现碧蓝航线连续作战内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复