目录

  • 一.实现功能
  • 二.主要思路
  • 三.主要代码实现
  • 四.用exe4j生成.exe程序
  • 五.最终效果
  • 六.代码开源

一.实现功能

主线图作战结束到结算页自动点击再次前往

二.主要思路

  • 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对
  • 移动鼠标点击再次前往:Java提供的Robot类

三.主要代码实现

  • MainFrame.java
    主要实现系统托盘的图标,右键菜单栏,菜单项的响应事件
    配置完像素位置,可以自动读取当前电脑页面的RGB至配置文件中
package 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
    主要实现像素点的比对,自动移动鼠标点击
package 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 cacheint 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
    支持动态配置参数
package 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);// x1private final JTextField x = new IText(100, 25, 160, 30);// y1private 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() {@Overridepublic 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
#识别的像素点位置
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实现碧蓝航线连续作战相关推荐

  1. 马德里烈风和java的鱼雷,碧蓝航线航母舰载机怎么搭配_碧蓝航线航母舰载机搭配思路及优缺点详解_手心游戏...

    碧蓝航线航母舰载机怎么搭配?碧蓝航线航母舰载机优缺点是什么?在碧蓝航线游戏中因为防空炮的改变让航母有了被削弱的感觉,那么舰载机怎么搭配好呢?一起来看一下碧蓝航线航母舰载机搭配思路及优缺点详解吧. 碧蓝 ...

  2. ssr面板_碧蓝航线:详解SSR里诺强不强 航母专用保姆 三流防空特化型轻巡

    碧蓝航线对于之称的新SSR轻巡里诺,作为金皮来说强度还是让很多指挥官期待的,不过很可惜这位舰娘真的没有想象中那么厉害,来看看对于其强度的具体评价以及分析吧. 基础能力 作为轻巡面板来说,找个最合适的参 ...

  3. 碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告

    半人马来袭!碧蓝航线将于8月20日9:00~11:00对安卓.iOS全港区进行为期2小时的改造建设,维护后将开启限时活动「盛夏的半人马座」,一起来看看吧. 一.内容新增 1.开启限时活动「盛夏的半人马 ...

  4. 碧蓝航线维护服务器时间,碧蓝航线3月21日维护时间更新公告 新增与更改内容介绍...

    碧蓝航线3月21日更新了什么:这次将带来全新的副本挑战活动哦,更有困难关卡第七章开启,下面就跟随小编来看看详细的更新内容吧! 各位亲爱的指挥官: 司令部将于3月21日9:00~13:00对以下港区进行 ...

  5. 碧蓝航线服务器维护到几点,碧蓝航线7月9号维护停服多长时间?科研第三期介绍[多图]...

    碧蓝航线在7月9号将会更新一次,这一次更新的主要内容就是新增了很多的角色,当然还有其它的一些调整,那么本次更新具体有些什么内容?更新的时间是多久?下面是详细介绍. 各位亲爱的指挥官: 司令部将于7月9 ...

  6. 按键精灵——欲望驱使之下的碧蓝航线12-4练级脚本

    碧蓝航线12-4练级脚本 1.前言 <碧蓝航线>是一款集策略养成.即时海战.弹幕.各类社交玩法为一体的二次元休闲游戏. 本作以军武拟人为题材,玩家可通过主线关卡.每日副本.实战演习.舰船建 ...

  7. ARM64(M1版)Mac运行MAA以及AzurLaneAutoScript自动化打明日方舟和碧蓝航线

    前言 首先感谢Github上面MAA以及AzurLaneAutoScript的开发组,让我们有工具可用. 再感谢@吕明珠LmeSzinc 和@binss 大佬,他们的教程让我受益良多. 能看到这篇教程 ...

  8. 碧蓝航线最新服务器2018,2018最新碧蓝航线建造时间表 舰娘建造时间表一览

    <碧蓝航线>是一款二次元休闲类手机游戏,集策略养成.即时海战以及各类社交玩法为一体,受到了大批玩家的喜爱.在这款游戏中,大家关注比较多的应该就是建造时间了,今天UU就为大家带来了2018年 ...

  9. 碧蓝航线内部表情包(有爱自取)

    预览 下载 https://ghgxj.lanzous.com/i3hI9jva28f 使用 该表情仅限电脑端QQ或TIM使用.解压后,打开QQ或TIM,双击.elf文件即可导入. 微信上也其实也可以 ...

最新文章

  1. 揭秘5G+AI时代的机器人世界!七大核心技术改变人类生活【附下载】| 智东西内参...
  2. csharp:Learn how to post JSON string to generic Handler using jQuery in ASP.Net C#.
  3. 判断目录是否存在并创建mkdir
  4. html盒子自动居中,css盒子怎么居中?
  5. spring jpa 多数据源_Spring同时集成JPA与Mybatis
  6. 【java】java 理解JDK中UUID的底层实现
  7. vue ui框架_Vue移动端UI框架指南
  8. Halcon 缺陷检测概述
  9. 深入浅出学大数据(一)大数据发展历程及大数据的简单介绍
  10. 日历表(点击每一日获得当日日期)
  11. Ubuntu18.04 + RTX2080Ti + CUDA +cudnn 环境配置
  12. 亲身经历,大龄程序员找工作,为什么这么难...
  13. ubuntu中无法安装vim
  14. 使用刻录机时的注意事项
  15. 谢少荣到计算机学院,我院获批国家自然科学基金委人工智能代码(F06)首个重大项目...
  16. 说说dota、人生、程序(长篇、神经质)
  17. GitOps 与 ChatOps 的落地实践
  18. 让 Android 应用响应智能电视遥控器
  19. 【云原生生态圈】:Docker核心技术全面总结
  20. Kaggle泰坦尼克号之灾

热门文章

  1. OPPOReno4SE和华为畅享20 哪款好
  2. 在线流程图和思维导图开发技术详解(六)
  3. 解决导出excel表格无法打开的问题
  4. 拼图游戏(搜索算法)
  5. php网页报告2500字,教你写作文2500字
  6. 请注意!新办理的电话卡,有以下情况会导致“二次实名”!
  7. 公司电子企业邮箱注册哪个好,电子企业邮箱怎么写?
  8. 探索 Sa-Token (三) 权限认证原理
  9. jenkins 管理员邮箱配置
  10. 京东商品爬虫实战笔记