Java模拟按键精灵(一)

闻修筠
2023-12-01

背景

  最近在玩热血传奇1.76金币版的游戏。这款游戏升级慢,爆率低,打钱慢。适合我这种养老玩家。游戏有个内挂,可以自动挂机。这个挂机功能非常水,只能自己跑到挂机地图,在地图上选好几个点,让人物边跑边打怪。不能自动回城买药,也不能自动卖装备。
  后来在游戏里瞎逛时候,发现一个野外地图。地图大,怪物等级低,刷新适中。里面的怪会爆500金币一瓶的药水,爆率还不低。更重要的是地图中就有NPC,可以把药水卖掉,不用回城。因此,萌生了使用按键精灵,自动挂机,自动卖物品的想法。再转念一想,咱是程序员啊,干嘛不自己动手写一个按键精灵。功能满足需要就可以了,不用做的很复杂。说干就干。。。

需求分析

  需求非常简单: 自动挂机检药水;药水检满后,走到NPC卖出药水;卖完药水后继续自动挂机。因为怪物等级低,装备不用考虑。

准备点基础工具类

  既然要模拟按键精灵,那么java必须支持键盘和鼠标的操作,基本操作如下

  • 单击鼠标左键
  • 双击鼠标左键
  • 移到鼠标到指定屏幕坐标
  • 移到鼠标到指定屏幕坐标,并在当前位置单击
  • 按下一个键
  • 按下组合键
  • 获取鼠标当前位置对应的屏幕颜色
  • 获取鼠标当前位置的屏幕坐标
  • 延迟一段时间
  • 随机延迟一段时间(主要针对游戏后台的检测,机械的重复容易被认为使用外挂)
      直接上代码,其他操作可根据需要添加。
    键盘上按键对应的键值,参考com.sun.glass.events.KeyEvent
package com.analog.tools;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class CommonUtil {
	
	private static final int DEFAULT_DELAY = 50;
	
	private static Robot robot ;
	
	static {
		try {
			robot = new Robot();
		} catch (AWTException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 获取鼠标当前位置坐标
	 * @return
	 */
	public static Point getCurrentMousePoint(){
		Point point= MouseInfo.getPointerInfo().getLocation();
		return point;
	}
	
	/**
	 * 获取坐标点对应的屏幕颜色
	 * @return
	 */
	public static Color getPointColor(Point point){
		Color color = robot.getPixelColor(point.x, point.y);
		return color;
	}
	
	/**
	 * 获取坐标点对应的屏幕颜色
	 * @return
	 */
	public static Color getPointColor(int x, int y){
		Color color = robot.getPixelColor(x, y);
		return color;
	}
	
	/**
	 * 移动鼠标到指定坐标
	 * @return
	 */
	public static void moveToXY(int x, int y){
		robot.mouseMove(x, y);
	}
	
	/**
	 * 单击鼠标
	 * @return
	 */
	public static void clickMouse(){
		robot.mousePress(InputEvent.BUTTON1_MASK);
		delay(DEFAULT_DELAY);
		robot.mouseRelease(InputEvent.BUTTON1_MASK);
	}
	
	/**
	 * 双击鼠标
	 * @return
	 */
	public static void dobuleCiickMouse(){
		clickMouse();
		delay(DEFAULT_DELAY);
		clickMouse();
	}
	
	/**
	 * 按下键盘上一个按键
	 * @return
	 */
	public static void pressOneKey(int key){
		robot.keyPress(key);
		delay(DEFAULT_DELAY);
		robot.keyRelease(key);
	}
	
	/**
	 * 移到指定点,单击一下
	 * @return
	 */
	public static void moveToXYAndClick(int x, int y){
		moveToXY(x, y);
		delay(50);
		clickMouse();
	}
	
	
	/**
	 * 按下键盘上组合按键
	 * @return
	 */
	public static void pressKeys(int[] keys){
		
		for (int i = 0; i < keys.length; i++) {
			robot.keyPress(keys[i]);
		}
		delay(DEFAULT_DELAY);
		for (int i = keys.length - 1; i >= 0; i--) {
			robot.keyRelease(keys[i]);
		}
	}
	
	/**
	 * 延迟  单位:毫秒
	 * @param delay
	 */
	public static void delay(int delay) {
		robot.delay(delay);
		
	}
	
	/**
	 * 随机延迟  单位:毫秒
	 * @param delay
	 */
	public static void delayByRandom(int baseDelay, int range) {
		int random = (int) (Math.random() * range) + 1;
		int delay = baseDelay + (random - range / 2); //上下浮空
		robot.delay(delay);
		
	}
}

  可以到Java可以完美模拟键盘和鼠标。鼠标右键功能我没写,因为我的游戏用不到。后面我会把需求细化,然后根据需求开发相应的代码。最后说一下,这个功能我是自己用的,怎么方便怎么来,肯定是很粗糙的,请各位多多包涵!!!

 类似资料: